Pārlūkot izejas kodu

Merge pull request #3523 from jakesmith/childcase

HPCC-7973 New choose activity, thor implementation

Reviewed-by: Gavin Halliday <ghalliday@hpccsystems.com>
Gavin Halliday 12 gadi atpakaļ
vecāks
revīzija
0bbdf79368

+ 9 - 6
thorlcr/activities/loop/thloopslave.cpp

@@ -729,16 +729,14 @@ activityslaves_decl CActivityBase *createGraphLoopSlave(CGraphElementBase *conta
 
 /////////////
 
-class CIfActivity : public CSlaveActivity, public CThorDataLink
+class CConditionalActivity : public CSlaveActivity, public CThorDataLink
 {
-    IHThorIfArg *helper;
     IThorDataLink *selectedInput;
 public:
     IMPLEMENT_IINTERFACE_USING(CSimpleInterface);
 
-    CIfActivity(CGraphElementBase *_container) : CSlaveActivity(_container), CThorDataLink(this)
+    CConditionalActivity(CGraphElementBase *_container) : CSlaveActivity(_container), CThorDataLink(this)
     {
-        helper = (IHThorIfArg *)queryHelper();
     }
     void init(MemoryBuffer &data, MemoryBuffer &slaveData)
     {
@@ -751,7 +749,7 @@ public:
         selectedInput = container.whichBranch>=inputs.ordinality() ? NULL : inputs.item(container.whichBranch);
         if (selectedInput)
             startInput(selectedInput);
-        dataLinkStart("CHILDIF", container.queryId());
+        dataLinkStart(container.getKind(), container.queryId());
     }
     virtual void stop()
     {
@@ -782,7 +780,12 @@ public:
 
 activityslaves_decl CActivityBase *createIfSlave(CGraphElementBase *container)
 {
-    return new CIfActivity(container);
+    return new CConditionalActivity(container);
+}
+
+activityslaves_decl CActivityBase *createCaseSlave(CGraphElementBase *container)
+{
+    return new CConditionalActivity(container);
 }
 
 

+ 5 - 0
thorlcr/activities/thactivityutil.ipp

@@ -33,6 +33,7 @@
 #include "eclhelper.hpp"
 #define NO_BWD_COMPAT_MAXSIZE
 #include "thorcommon.ipp"
+#include "commonext.hpp"
 
 #define OUTPUT_RECORDSIZE
 
@@ -101,6 +102,10 @@ protected:
         dataLinkStart(NULL, 0);
     }
 
+    inline void dataLinkStart(ThorActivityKind kind, activity_id activityId, unsigned outputId = 0)
+    {
+        dataLinkStart(activityKindStr(kind), activityId, outputId);
+    }
     inline void dataLinkStart(const char * _activityName, activity_id _activityId, unsigned _outputId = 0)
     {
         if(_activityName) 

+ 6 - 1
thorlcr/graph/thgraph.cpp

@@ -637,6 +637,9 @@ bool CGraphElementBase::prepareContext(size32_t parentExtractSz, const byte *par
                 }
                 return true;
             }
+            case TAKchildcase:
+                owner->ifs.append(*this);
+                // fall through
             case TAKcase:
             {
                 if (_shortCircuit) return true;
@@ -728,6 +731,7 @@ void CGraphElementBase::createActivity(size32_t parentExtractSz, const byte *par
         switch (getKind())
         {
             case TAKchildif:
+            case TAKchildcase:
             {
                 if (inputs.queryItem(whichBranch))
                 {
@@ -778,7 +782,6 @@ void CGraphElementBase::createActivity(size32_t parentExtractSz, const byte *par
                         switch (input->getKind())
                         {
                             case TAKif:
-//                          case TAKchildif:
                             case TAKcase:
                             {
                                 if (input->whichBranch >= input->getInputs()) // if, will have TAKnull activity, made at create time.
@@ -919,6 +922,7 @@ bool isGlobalActivity(CGraphElementBase &container)
         case TAKpipethrough:
         case TAKif:
         case TAKchildif:
+        case TAKchildcase:
         case TAKcase:
         case TAKparse:
         case TAKpiperead:
@@ -1484,6 +1488,7 @@ public:
             {
                 case TAKif:
                 case TAKchildif:
+                case TAKchildcase:
                 case TAKcase:
                     setNext(cur->inputs, cur->whichBranch);
                     break;

+ 16 - 14
thorlcr/graph/thgraphslave.cpp

@@ -243,22 +243,24 @@ unsigned __int64 CSlaveActivity::queryLocalCycles() const
     }
     else
     {
-        if (TAKchildif == container.getKind())
+        switch (container.getKind())
         {
-            if (inputs.ordinality() && (((unsigned)-1) != container.whichBranch))
-            {
-                IThorDataLink *input = inputs.item(container.whichBranch);
-                if (input)
+            case TAKchildif:
+            case TAKchildcase:
+                if (inputs.ordinality() && (((unsigned)-1) != container.whichBranch))
+                {
+                    IThorDataLink *input = inputs.item(container.whichBranch);
+                    if (input)
+                        inputCycles += input->queryTotalCycles();
+                }
+                break;
+            default:
+                ForEachItemIn(i, inputs)
+                {
+                    IThorDataLink *input = inputs.item(i);
                     inputCycles += input->queryTotalCycles();
-            }
-        }
-        else
-        {
-            ForEachItemIn(i, inputs)
-            {
-                IThorDataLink *input = inputs.item(i);
-                inputCycles += input->queryTotalCycles();
-            }
+                }
+                break;
         }
     }
     if (totalCycles < inputCycles) // not sure how/if possible, but guard against

+ 1 - 0
thorlcr/master/thactivitymaster.cpp

@@ -108,6 +108,7 @@ public:
             case TAKfiltergroup:
             case TAKlocalresultread:
             case TAKchildif:
+            case TAKchildcase:
             case TAKdegroup:
             case TAKsplit:
             case TAKproject:

+ 4 - 0
thorlcr/slave/slave.cpp

@@ -247,6 +247,7 @@ CActivityBase *createGraphLoopResultReadSlave(CGraphElementBase *container);
 CActivityBase *createGraphLoopResultWriteSlave(CGraphElementBase *container);
 
 CActivityBase *createIfSlave(CGraphElementBase *container);
+CActivityBase *createCaseSlave(CGraphElementBase *container);
 CActivityBase *createCatchSlave(CGraphElementBase *container);
 CActivityBase *createChildNormalizeSlave(CGraphElementBase *container);
 CActivityBase *createChildAggregateSlave(CGraphElementBase *container);
@@ -709,6 +710,9 @@ public:
             case TAKchildif:
                 ret = createIfSlave(this);
                 break;
+            case TAKchildcase:
+                ret = createCaseSlave(this);
+                break;
             case TAKcatch:
             case TAKskipcatch:
             case TAKcreaterowcatch: