Bläddra i källkod

HPCC-10549 Allow hthor to access results from parent subgraph

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 11 år sedan
förälder
incheckning
0db0059364
4 ändrade filer med 21 tillägg och 11 borttagningar
  1. 10 10
      ecl/eclagent/agentctx.hpp
  2. 3 0
      ecl/eclagent/eclagent.ipp
  3. 6 1
      ecl/eclagent/eclgraph.cpp
  4. 2 0
      ecl/hqlcpp/hqlhtcpp.cpp

+ 10 - 10
ecl/eclagent/agentctx.hpp

@@ -31,7 +31,16 @@ struct IHThorGraphResult : extends IInterface
     virtual const void * getLinkedRowResult() = 0;
 };
 
-struct IHThorGraphResults : extends IEclGraphResults
+struct ILocalEclGraphResults : public IEclGraphResults
+{
+public:
+    virtual IHThorGraphResult * queryResult(unsigned id) = 0;
+    virtual IHThorGraphResult * queryGraphLoopResult(unsigned id) = 0;
+    virtual IHThorGraphResult * createResult(unsigned id, IEngineRowAllocator * ownedRowsetAllocator) = 0;
+    virtual IHThorGraphResult * createGraphLoopResult(IEngineRowAllocator * ownedRowsetAllocator) = 0;
+};
+
+struct IHThorGraphResults : extends ILocalEclGraphResults
 {
     virtual void clear() = 0;
     virtual IHThorGraphResult * queryResult(unsigned id) = 0;
@@ -52,15 +61,6 @@ struct IEclLoopGraph : public IInterface
     virtual void executeChild(const byte * parentExtract, IHThorGraphResults * results, IHThorGraphResults * _graphLoopResults) = 0;
 };
 
-struct ILocalEclGraphResults : public IEclGraphResults
-{
-public:
-    virtual IHThorGraphResult * queryResult(unsigned id) = 0;
-    virtual IHThorGraphResult * queryGraphLoopResult(unsigned id) = 0;
-    virtual IHThorGraphResult * createResult(unsigned id, IEngineRowAllocator * ownedRowsetAllocator) = 0;
-    virtual IHThorGraphResult * createGraphLoopResult(IEngineRowAllocator * ownedRowsetAllocator) = 0;
-};
-
 interface IOrderedOutputSerializer;
 
 typedef enum { ofSTD, ofXML, ofRAW } outputFmts;

+ 3 - 0
ecl/eclagent/eclagent.ipp

@@ -808,8 +808,11 @@ public:
 
     virtual void clear();
     virtual IHThorGraphResult * queryResult(unsigned id);
+    virtual IHThorGraphResult * queryGraphLoopResult(unsigned id);
     virtual IHThorGraphResult * createResult(unsigned id, IEngineRowAllocator * ownedRowsetAllocator);
     virtual IHThorGraphResult * createResult(IEngineRowAllocator * ownedRowsetAllocator);
+    virtual IHThorGraphResult * createGraphLoopResult(IEngineRowAllocator * ownedRowsetAllocator) { throwUnexpected(); }
+
     virtual void setResult(unsigned id, IHThorGraphResult * result);
 
 //interface IEclGraphResults

+ 6 - 1
ecl/eclagent/eclgraph.cpp

@@ -260,7 +260,7 @@ static IHThorActivity * createActivity(IAgentContext & agent, unsigned activityI
     case TAKxmlread:
         return createXmlReadActivity(agent, activityId, subgraphId, (IHThorXmlReadArg &)arg, kind);
     case TAKlocalresultread:
-        return createLocalResultReadActivity(agent, activityId, subgraphId, (IHThorLocalResultReadArg &)arg, kind, graphId);
+        return createLocalResultReadActivity(agent, activityId, subgraphId, (IHThorLocalResultReadArg &)arg, kind, node->getPropInt("att[@name='_graphId']/@value"));
     case TAKlocalresultwrite:
         return createLocalResultWriteActivity(agent, activityId, subgraphId, (IHThorLocalResultWriteArg &)arg, kind, graphId);
     case TAKdictionaryresultwrite:
@@ -1396,6 +1396,11 @@ IHThorGraphResult * GraphResults::queryResult(unsigned id)
     return &results.item(id);
 }
 
+IHThorGraphResult * GraphResults::queryGraphLoopResult(unsigned id)
+{
+    throwUnexpected();
+}
+
 IHThorGraphResult * GraphResults::createResult(unsigned id, IEngineRowAllocator * ownedRowsetAllocator)
 {
     Owned<GraphResult> ret = new GraphResult(ownedRowsetAllocator);

+ 2 - 0
ecl/hqlcpp/hqlhtcpp.cpp

@@ -6374,6 +6374,8 @@ ABoundActivity * HqlCppTranslator::buildActivity(BuildCtx & ctx, IHqlExpression
                             if (extract)
                                 canAccessResultDirectly = extract->areGraphResultsAccessible(graphId);
                         }
+                        else if (getTargetClusterType() == HThorCluster)
+                            canAccessResultDirectly = true;
                     }
                     if (canAccessResultDirectly)
                         result = doBuildActivityGetGraphResult(ctx, expr);