Sfoglia il codice sorgente

Merge branch 'candidate-7.8.x' into candidate-7.10.x

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 4 anni fa
parent
commit
37a3bdb478
2 ha cambiato i file con 23 aggiunte e 4 eliminazioni
  1. 22 3
      ecl/hqlcpp/hqlckey.cpp
  2. 1 1
      plugins/fileservices/fileservices.cpp

+ 22 - 3
ecl/hqlcpp/hqlckey.cpp

@@ -171,6 +171,7 @@ protected:
     IHqlExpression * createKeyFromComplexKey(IHqlExpression * expr);
     IHqlExpression * expandDatasetReferences(IHqlExpression * expr, IHqlExpression * ds);
     IHqlExpression * optimizeTransfer(HqlExprArray & fields, HqlExprArray & values, IHqlExpression * expr, IHqlExpression * leftSelector);
+    IHqlExpression * doOptimizeTransfer(HqlExprArray & fields, HqlExprArray & values, IHqlExpression * expr, IHqlExpression * leftSelector);
     void optimizeExtractJoinFields();
     void optimizeTransfer(SharedHqlExpr & targetDataset, SharedHqlExpr & targetTransform, SharedHqlExpr & keyedFilter, OwnedHqlExpr * extraFilter);
     IHqlExpression * querySimplifiedKey(IHqlExpression * expr);
@@ -677,6 +678,20 @@ static bool fieldNameAlreadyExists(const HqlExprArray & fields, IAtom * name)
 
 IHqlExpression * KeyedJoinInfo::optimizeTransfer(HqlExprArray & fields, HqlExprArray & values, IHqlExpression * filter, IHqlExpression * leftSelector)
 {
+    TransformMutexBlock block;
+    return doOptimizeTransfer(fields, values, filter, leftSelector);
+}
+
+IHqlExpression * KeyedJoinInfo::doOptimizeTransfer(HqlExprArray & fields, HqlExprArray & values, IHqlExpression * filter, IHqlExpression * leftSelector)
+{
+    IHqlExpression * prev = static_cast<IHqlExpression *>(filter->queryTransformExtra());
+    if (prev)
+        return LINK(prev);
+
+    //MORE: We could also check if already transformed..., but that imposes an additional cost on simple filters, so on balance it is better without it
+    //if (!filter->usesSelector(leftSelector))
+    //    return LINK(filter);
+
     switch (filter->getOperator())
     {
     case no_join:
@@ -723,7 +738,9 @@ IHqlExpression * KeyedJoinInfo::optimizeTransfer(HqlExprArray & fields, HqlExprA
                 IHqlExpression * matchField = &fields.item(match);
                 OwnedHqlExpr serializedField = getSerializedForm(matchField, diskAtom);
                 OwnedHqlExpr result = createSelectExpr(getActiveTableSelector(), LINK(serializedField));
-                return ensureDeserialized(result, matchField->queryType(), diskAtom);
+                OwnedHqlExpr deserialized = ensureDeserialized(result, matchField->queryType(), diskAtom);
+                filter->setTransformExtra(deserialized);
+                return deserialized.getClear();
             }
             break;
         }
@@ -736,11 +753,13 @@ IHqlExpression * KeyedJoinInfo::optimizeTransfer(HqlExprArray & fields, HqlExprA
     HqlExprArray children;
     ForEachChild(i, filter)
     {
-        IHqlExpression * next = optimizeTransfer(fields, values, filter->queryChild(i), leftSelector);
+        IHqlExpression * next = doOptimizeTransfer(fields, values, filter->queryChild(i), leftSelector);
         if (!next) return NULL;
         children.append(*next);
     }
-    return cloneOrLink(filter, children);
+    OwnedHqlExpr ret = cloneOrLink(filter, children);
+    filter->setTransformExtra(ret);
+    return ret.getClear();
 }
 
 

+ 1 - 1
plugins/fileservices/fileservices.cpp

@@ -2726,7 +2726,7 @@ FILESERVICES_API char * FILESERVICES_CALL fsfGetLogicalFileAttribute(ICodeContex
             IPropertyTree &attr = df->queryAttributes();
             Owned<IPropertyTreeIterator> piter = attr.getElements("Protect");
             ForEach(*piter) {
-                const char *name = piter->get().queryProp("@name");
+                const char *name = piter->query().queryProp("@name");
                 if (name&&*name) {
                     if (ret.length())
                         ret.append(',');