hqlmeta.hpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef __HQLMETA_HPP_
  14. #define __HQLMETA_HPP_
  15. class TableProjectMapper;
  16. class HQL_API CHqlMetaInfo
  17. {
  18. public:
  19. inline bool isGrouped() const { return grouping != NULL; }
  20. bool appearsToBeSorted(bool isLocal, bool ignoreGrouping);
  21. void applyDistribute(IHqlExpression * newDistribution, IHqlExpression * optMergeOrder);
  22. void applyGroupSort(IHqlExpression * sortOrder);
  23. void applyGroupBy(IHqlExpression * groupBy, bool isLocal);
  24. void applyLocalSort(IHqlExpression * sortOrder);
  25. void applyGlobalSort(IHqlExpression * sortOrder);
  26. void applyProject(TableProjectMapper & mapper);
  27. void applySubSort(IHqlExpression * groupBy, IHqlExpression * sortOrder, bool isLocal);
  28. void ensureAppearsSorted(bool isLocal, bool ignoreGrouping);
  29. void getIntersection(const CHqlMetaInfo & other);
  30. IHqlExpression * getLocalSortOrder() const;
  31. bool hasUsefulInformation() const;
  32. bool hasKnownSortGroupDistribution(bool isLocal) const;
  33. bool matches(const CHqlMetaInfo & other) const;
  34. void preserveGrouping(IHqlExpression * dataset);
  35. void removeActiveSort();
  36. void removeAllKeepGrouping();
  37. void removeAllSortOrders();
  38. void removeAllAndUngroup(bool isLocal);
  39. void removeDistribution();
  40. void removeGroup();
  41. void set(const CHqlMetaInfo & other);
  42. void setMatchesAny();
  43. void setUnknownDistribution();
  44. void setUnknownGrouping();
  45. protected:
  46. void clearGrouping();
  47. public:
  48. LinkedHqlExpr distribution;
  49. LinkedHqlExpr globalSortOrder;
  50. LinkedHqlExpr localUngroupedSortOrder;
  51. LinkedHqlExpr grouping;
  52. LinkedHqlExpr groupSortOrder;
  53. };
  54. class CHqlMetaProperty : public CInterfaceOf<IInterface>
  55. {
  56. public:
  57. CHqlMetaInfo meta;
  58. };
  59. void extractMeta(CHqlMetaInfo & meta, ITypeInfo * type);
  60. extern HQL_API IHqlExpression * queryUnknownAttribute();
  61. extern HQL_API IHqlExpression * queryUnknownSortlist();
  62. extern HQL_API IHqlExpression * queryMatchGroupOrderSortlist();
  63. extern HQL_API IHqlExpression * getUnknownAttribute();
  64. extern HQL_API IHqlExpression * getUnknownSortlist();
  65. extern HQL_API IHqlExpression * getMatchGroupOrderSortlist();
  66. extern HQL_API IHqlExpression * queryAnyOrderSortlist();
  67. extern HQL_API IHqlExpression * queryAnyDistributionAttribute();
  68. extern HQL_API IHqlExpression * getExistingSortOrder(IHqlExpression * dataset, bool isLocal, bool ignoreGrouping);
  69. extern ITypeInfo * calculateDatasetType(node_operator op, const HqlExprArray & parms);
  70. //---------------------------------------------------------------------------------------------
  71. extern HQL_API bool isKnownDistribution(IHqlExpression * distribution);
  72. extern HQL_API bool isPersistDistribution(IHqlExpression * distribution);
  73. extern HQL_API bool isSortedDistribution(IHqlExpression * distribution);
  74. //---------------------------------------------------------------------------------------------
  75. extern HQL_API IHqlExpression * mapJoinDistribution(TableProjectMapper & mapper, IHqlExpression * distribution, IHqlExpression * side);
  76. //---------------------------------------------------------------------------------------------
  77. extern HQL_API bool isPartitionedForGroup(IHqlExpression * table, IHqlExpression *grouping, bool isGroupAll);
  78. extern HQL_API bool isPartitionedForGroup(IHqlExpression * table, const HqlExprArray & grouping, bool isGroupAll);
  79. //The following only look at the sort order, and not the partitioning
  80. extern HQL_API bool isSortedForGroup(IHqlExpression * table, IHqlExpression *sortList, bool isLocal);
  81. extern HQL_API IHqlExpression * ensureSortedForGroup(IHqlExpression * table, IHqlExpression *sortList, bool isLocal, bool alwaysLocal, bool allowSubSort);
  82. extern HQL_API bool matchDedupDistribution(IHqlExpression * distn, const HqlExprArray & equalities);
  83. extern HQL_API bool matchesAnyDistribution(IHqlExpression * distn);
  84. extern HQL_API bool appearsToBeSorted(IHqlExpression * dataset, bool isLocal, bool ignoreGrouping);
  85. extern HQL_API bool isAlreadySorted(IHqlExpression * dataset, const HqlExprArray & newSort, bool isLocal, bool ignoreGrouping);
  86. extern HQL_API bool isAlreadySorted(IHqlExpression * dataset, IHqlExpression * newSort, bool isLocal, bool ignoreGrouping);
  87. extern HQL_API IHqlExpression * ensureSorted(IHqlExpression * dataset, IHqlExpression * order, bool isLocal, bool ignoreGrouping, bool alwaysLocal, bool allowSubSort);
  88. extern HQL_API bool isWorthShuffling(IHqlExpression * dataset, IHqlExpression * order, bool isLocal, bool ignoreGrouping);
  89. extern HQL_API bool isWorthShuffling(IHqlExpression * dataset, const HqlExprArray & newSort, bool isLocal, bool ignoreGrouping);
  90. extern HQL_API IHqlExpression * getSubSort(IHqlExpression * dataset, const HqlExprArray & order, bool isLocal, bool ignoreGrouping, bool alwaysLocal);
  91. extern HQL_API IHqlExpression * getSubSort(IHqlExpression * dataset, IHqlExpression * order, bool isLocal, bool ignoreGrouping, bool alwaysLocal);
  92. extern HQL_API IHqlExpression * convertSubSortToGroupedSort(IHqlExpression * expr);
  93. extern HQL_API bool reorderMatchExistingLocalSort(HqlExprArray & sortedLeft, HqlExprArray & reorderedRight, IHqlExpression * dataset, const HqlExprArray & left, const HqlExprArray & right);
  94. extern HQL_API IHqlExpression * preserveTableInfo(IHqlExpression * newTable, IHqlExpression * original, bool loseDistribution, IHqlExpression * persistName);
  95. extern HQL_API bool isDistributedCoLocally(IHqlExpression * dataset1, IHqlExpression * dataset2, const HqlExprArray & sort1, const HqlExprArray & sort2);
  96. extern HQL_API IHqlExpression * createMatchingDistribution(IHqlExpression * expr, const HqlExprArray & oldSort, const HqlExprArray & newSort);
  97. extern HQL_API void calculateDatasetMeta(CHqlMetaInfo & meta, IHqlExpression * expr);
  98. extern HQL_API CHqlMetaProperty * querySimpleDatasetMeta(IHqlExpression * expr);
  99. extern HQL_API bool hasSameSortGroupDistribution(IHqlExpression * expr, IHqlExpression * other);
  100. extern HQL_API bool hasKnownSortGroupDistribution(IHqlExpression * expr, bool isLocal);
  101. inline IHqlExpression * queryRemoveOmitted(IHqlExpression * expr)
  102. {
  103. if (expr && expr->isAttribute() && (expr->queryName() == _omitted_Atom))
  104. return NULL;
  105. return expr;
  106. }
  107. #endif