private void DoCalculation(IExecutionEnvironment environment, string fieldName, string cleanExpression, int update)
        {
            var functionEvaluator  = new FunctionEvaluator();
            var warewolfEvalResult = environment.Eval(cleanExpression, update);

            if (warewolfEvalResult.IsWarewolfAtomResult)
            {
                var result = warewolfEvalResult as CommonFunctions.WarewolfEvalResult.WarewolfAtomResult;
                if (result != null)
                {
                    var eval          = PerformCalcForAtom(result.Item, functionEvaluator);
                    var doCalculation = new AssignValue(fieldName, eval);
                    environment.AssignWithFrame(doCalculation, update);
                }
            }
            if (warewolfEvalResult.IsWarewolfAtomListresult)
            {
                var result = warewolfEvalResult as CommonFunctions.WarewolfEvalResult.WarewolfAtomListresult;
                if (result != null)
                {
                    var counter = 1;
                    foreach (var item in result.Item)
                    {
                        var eval          = PerformCalcForAtom(item, functionEvaluator);
                        var doCalculation = new AssignValue(fieldName, eval);
                        environment.AssignWithFrame(doCalculation, update == 0 ? counter : update);
                        counter++;
                    }
                }
            }
        }
Exemple #2
0
        public List <SqlStringBuilder> GetUpdateStatements(object instance, Type type, Database db)
        {
            List <SqlStringBuilder> results = new List <SqlStringBuilder>();

            db = db ?? Database;
            SqlStringBuilder          rootUpdate          = db.GetService <SqlStringBuilder>();
            Func <string, string>     columnNameFormatter = rootUpdate.ColumnNameFormatter;
            AssignValue               uniqueness          = GetUniquenessFilter(instance, columnNameFormatter);
            TypeInheritanceDescriptor inheritance         = new TypeInheritanceDescriptor(type);
            Type rootType = inheritance.RootType;

            rootUpdate.Update(Dao.TableName(rootType), GetBaseTypeAssignValues(rootType, instance, columnNameFormatter).ToArray()).Where(uniqueness);
            results.Add(rootUpdate);
            inheritance.Chain.BackwardsEach(typeTable =>
            {
                Type tableType = typeTable.Type;
                if (tableType != rootType)
                {
                    SqlStringBuilder inheritor = db.GetService <SqlStringBuilder>();
                    inheritor.Update(Dao.TableName(tableType), GetInheritingTypeAssignValues(tableType, instance, columnNameFormatter).ToArray()).Where(uniqueness);
                    inheritor.Go();
                    results.Add(inheritor);
                }
            });
            return(results);
        }
        void AddTableToDataList(Table table)
        {
            // build up DataTable
            foreach (TableRow row in table.Rows)
            {
                var i = 0;
                foreach (string columnName in table.Header)
                {
                    var value = row[i] == "blank" ? "" : row[i];
                    if (value.ToUpper() == "NULL")
                    {
                        var recordsetDisplayValue = DataListUtil.CreateRecordsetDisplayValue("rs", columnName, "");

                        DataObject.Environment.AssignDataShape(DataListUtil.AddBracketsToValueIfNotExist(recordsetDisplayValue));
                    }
                    else
                    {
                        var recordsetDisplayValue = DataListUtil.CreateRecordsetDisplayValue("rs", columnName, "");
                        var assignValue           = new AssignValue(DataListUtil.AddBracketsToValueIfNotExist(recordsetDisplayValue), row[i]);
                        DataObject.Environment.AssignWithFrame(assignValue, 0);
                    }

                    i++;
                }
                DataObject.Environment.CommitAssign();
            }
            // Execute Translator
        }
Exemple #4
0
        protected internal override AssignValue GetAssignment(string keyColumn, object value, Func <string, string> columnNameformatter = null)
        {
            AssignValue result = base.GetAssignment(keyColumn, value, columnNameformatter);

            result.ParameterPrefix = ":";
            return(result);
        }
Exemple #5
0
        public void Execute(AssignValue cmd)
        {
            switch (cmd.Recipient.Type)
            {
            case Type.Entero:
                cmd.Recipient.Value = (int)cmd.Value;
                break;

            case Type.Decimal:
                cmd.Recipient.Value = (double)cmd.Value;
                break;

            case Type.Booleano:
                cmd.Recipient.Value = (bool)cmd.Value;
                break;

            case Type.Cadena:
                cmd.Recipient.Value = (string)cmd.Value;
                break;

            default:
                cmd.Recipient.Value = cmd.Value;
                break;
            }
        }
        public void GivenEmptyString_ExecutionEnvironmentAssignJson_ShouldReturn()
        {
            Assert.IsNotNull(_environment);
            var values = new AssignValue(string.Empty, "John");

            _environment.AssignJson(values, 0);
        }
        public void GivenInvalidObject_ExecutionEnvironmentAssignJson_ShouldThrowParseError()
        {
            Assert.IsNotNull(_environment);
            var values = new AssignValue("[[@Person.Name]", "John");

            _environment.AssignJson(values, 0);
            Assert.AreEqual(1, _environment.Errors.Count);
        }
Exemple #8
0
 public static WhereFormat GetWhereFormat(AssignValue filter, StringBuilder stringBuilder, int?startNumber)
 {
     WhereFormat where         = new WhereFormat();
     where.ColumnNameFormatter = (c) => c;
     where.ParameterPrefix     = "@";
     where.StartNumber         = startNumber;
     where.AddAssignment(filter);
     stringBuilder.Append(where.Parse());
     return(where);
 }
 private AssignValue AddDebugOutputItem(IDSFDataObject dataObject, int update, int innerCount, AssignValue assignValue)
 {
     if (DataListUtil.IsValueRecordset(assignValue.Name) && DataListUtil.GetRecordsetIndexType(assignValue.Name) == enRecordsetIndexType.Blank)
     {
         var length = dataObject.Environment.GetObjectLength(DataListUtil.ExtractRecordsetNameFromValue(assignValue.Name));
         assignValue = new AssignValue(DataListUtil.ReplaceObjectBlankWithIndex(assignValue.Name, length), assignValue.Value);
     }
     AddSingleDebugOutputItem(dataObject.Environment, innerCount, assignValue, update);
     return(assignValue);
 }
Exemple #10
0
        /// <summary>
        /// Executes a CallFunction command
        /// </summary>
        /// <param name="cmd">command to be executed.</param>
        public void Execute(CallFunction cmd)
        {
            var commands = cmd.Function.CommandList;

            if (commands == null)
            {
                return;
            }

            // Remove and save previous assign value commands
            var stack = new Stack <AssignValue>();

            while (commands.Commands[1] is AssignValue)
            {
                stack.Push((AssignValue)commands.Commands[1]);
                commands.Commands.RemoveAt(1);
            }

            // Add my assign value commands.
            for (var para = cmd.Parameters.Count - 1; para >= 0; para--)
            {
                var parameter = cmd.Function.Parameters[para];
                var newCmd    = new AssignValue
                {
                    Recipient = parameter,
                    Value     = cmd.Parameters[para].Value
                };
                commands.Commands.Insert(1, newCmd);
            }

            Execute(commands);

            // Remove my assign value commands
            for (var para = cmd.Parameters.Count - 1; para >= 0; para--)
            {
                commands.Commands.RemoveAt(1);
            }

            // Restore previous assign value commands.
            while (stack.Count != 0)
            {
                commands.Commands.Insert(1, stack.Pop());
            }

            // Manages the return value.
            if (cmd.Function.Type != Type.Rutina)
            {
                var aux = cmd.Function.Returns.Value;
                if (!(cmd.Function.Returns is Constant))
                {
                    cmd.Function.Returns.Unroll();
                }
                cmd.Result.Value = aux;
            }
        }
Exemple #11
0
        public static void TargetAddressTest(int initValue, string targetOwnerId,
                                             bool isError, int answerValue)
        {
            var instance = new AssignValue
            {
                Owner = targetOwnerId.Equals("m")
                    ? TargetAddressOwner.MapEvent
                    : TargetAddressOwner.CommonEvent
            };
            var changedPropertyList = new List <string>();

            instance.PropertyChanged += (sender, args) => { changedPropertyList.Add(args.PropertyName); };

            var errorOccured = false;

            try
            {
                instance.TargetAddress = initValue;
            }
            catch (Exception ex)
            {
                logger.Exception(ex);
                errorOccured = true;
            }

            // エラーフラグが一致すること
            Assert.AreEqual(errorOccured, isError);

            if (!errorOccured)
            {
                var resultValue = (int)instance.TargetAddress;

                // 取得した値が意図した値と一致すること
                Assert.AreEqual(resultValue, answerValue);
            }

            // 意図したとおりプロパティ変更通知が発火していること
            if (errorOccured)
            {
                Assert.AreEqual(changedPropertyList.Count, 0);
            }
            else
            {
                Assert.AreEqual(changedPropertyList.Count, 1);
                Assert.IsTrue(changedPropertyList[0].Equals(nameof(AssignValue.TargetAddress)));
            }
        }
        public static void CharaMoveCommandOwnerTest()
        {
            var assignValue  = new AssignValue();
            var assignValue2 = new AssignValue();
            var addValue     = new AddValue();
            var addValue2    = new AddValue();

            // この時点で EventCommand の Owner が null であることを確認
            Assert.IsNull(assignValue.Owner);
            Assert.IsNull(assignValue2.Owner);
            Assert.IsNull(addValue.Owner);
            Assert.IsNull(addValue2.Owner);

            var actionEntry = new ActionEntry();

            actionEntry.CommandList.Add(assignValue);
            actionEntry.CommandList.Add(addValue);

            // この時点で ActionEntry, EventCommand の Owner が null であることを確認
            Assert.IsNull(actionEntry.Owner);
            Assert.IsNull(assignValue.Owner);
            Assert.IsNull(assignValue2.Owner);
            Assert.IsNull(addValue.Owner);
            Assert.IsNull(addValue2.Owner);

            var instance = new MapEventPageMoveRouteInfo
            {
                CustomMoveRoute = actionEntry
            };

            // この時点で ActionEntry, セット済みのEventCommand の Owner がセットされていることを確認
            Assert.AreEqual(actionEntry.Owner, TargetAddressOwner.MapEvent);
            Assert.AreEqual(assignValue.Owner, TargetAddressOwner.MapEvent);
            Assert.AreEqual(addValue.Owner, TargetAddressOwner.MapEvent);
            Assert.IsNull(assignValue2.Owner);
            Assert.IsNull(addValue2.Owner);

            actionEntry.CommandList.Add(assignValue2);
            actionEntry.CommandList.Add(addValue2);

            // EventCommand の Owner に適切な値が設定されること
            Assert.AreEqual(assignValue2.Owner, TargetAddressOwner.MapEvent);
            Assert.AreEqual(addValue2.Owner, TargetAddressOwner.MapEvent);

            // instance をここまで開放したくないので無駄な処理を入れる
            instance.MoveSpeed = MoveSpeed.Fast;
        }
 private void AddTableToDataList(Table table)
 {
     // build up DataTable
     foreach (TableRow row in table.Rows)
     {
         var i = 0;
         foreach (string columnName in table.Header)
         {
             var recordsetDisplayValue = DataListUtil.CreateRecordsetDisplayValue("rs", columnName, "");
             var assignValue           = new AssignValue(DataListUtil.AddBracketsToValueIfNotExist(recordsetDisplayValue), row[i]);
             DataObject.Environment.AssignWithFrame(assignValue, 0);
             i++;
         }
         DataObject.Environment.CommitAssign();
     }
     // Execute Translator
 }
        void ExecuteField(IDSFDataObject dataObject, int update, int innerCount, ActivityDTO t, ErrorResultTO allErrors)
        {
            var assignValue      = new AssignValue(t.FieldName, t.FieldValue);
            var isCalcEvaluation = DataListUtil.IsCalcEvaluation(t.FieldValue, out string cleanExpression);

            if (isCalcEvaluation)
            {
                assignValue = new AssignValue(t.FieldName, cleanExpression);
            }
            DebugItem debugItem = null;

            if (dataObject.IsDebugMode())
            {
                debugItem = TryCreateDebugInput(dataObject.Environment, innerCount, assignValue, update);
            }

            try
            {
                if (isCalcEvaluation)
                {
                    DoCalculation(dataObject.Environment, t.FieldName, t.FieldValue, update);
                }
                else
                {
                    dataObject.Environment.AssignWithFrame(assignValue, update);
                }
            } catch (Exception e)
            {
                Dev2Logger.Error(nameof(DsfMultiAssignActivity), e, GlobalConstants.WarewolfError);
                allErrors.AddError(e.Message);
            }

            if (debugItem != null)
            {
                _debugInputs.Add(debugItem);
            }
            if (dataObject.IsDebugMode())
            {
                if (DataListUtil.IsValueRecordset(assignValue.Name) && DataListUtil.GetRecordsetIndexType(assignValue.Name) == enRecordsetIndexType.Blank)
                {
                    var length = dataObject.Environment.GetLength(DataListUtil.ExtractRecordsetNameFromValue(assignValue.Name));
                    assignValue = new AssignValue(DataListUtil.ReplaceRecordsetBlankWithIndex(assignValue.Name, length), assignValue.Value);
                }
                AddSingleDebugOutputItem(dataObject.Environment, innerCount, assignValue, update);
            }
        }
Exemple #15
0
        private void AssignField(IDSFDataObject dataObject, int update, int innerCount, ActivityDTO t, ErrorResultTO allErrors)
        {
            var assignValue      = new AssignValue(t.FieldName, t.FieldValue);
            var isCalcEvaluation = DataListUtil.IsCalcEvaluation(t.FieldValue, out string cleanExpression);

            if (isCalcEvaluation)
            {
                assignValue = new AssignValue(t.FieldName, cleanExpression);
            }
            DebugItem debugItem = null;

            if (dataObject.IsDebugMode())
            {
                debugItem = AddSingleInputDebugItem(dataObject.Environment, innerCount, assignValue, update);
            }

            try
            {
                if (isCalcEvaluation)
                {
                    DoCalculation(dataObject.Environment, t.FieldName, t.FieldValue, update);
                }
                else
                {
                    dataObject.Environment.AssignWithFrame(assignValue, update);
                }
            } catch (Exception e)
            {
                allErrors.AddError(e.Message);
            }

            if (debugItem != null)
            {
                _debugInputs.Add(debugItem);
            }
            if (dataObject.IsDebugMode())
            {
                if (DataListUtil.IsValueRecordset(assignValue.Name) && DataListUtil.GetRecordsetIndexType(assignValue.Name) == enRecordsetIndexType.Blank && !assignValue.Name.Contains(DataListUtil.ObjectStartMarker))
                {
                    var length = dataObject.Environment.GetLength(DataListUtil.ExtractRecordsetNameFromValue(assignValue.Name));
                    assignValue = new AssignValue(DataListUtil.ReplaceRecordsetBlankWithIndex(assignValue.Name, length), assignValue.Value);
                }
                AddSingleDebugOutputItem(dataObject.Environment, innerCount, assignValue, update);
            }
        }
Exemple #16
0
        public static void SerializeTest()
        {
            var target = new AssignValue
            {
                Value = 21,
                Owner = TargetAddressOwner.CommonEvent
            };
            var changedPropertyList = new List <string>();

            target.PropertyChanged += (sender, args) => { changedPropertyList.Add(args.PropertyName); };

            var clone = DeepCloner.DeepClone(target);

            Assert.IsTrue(clone.Equals(target));

            // プロパティ変更通知が発火していないこと
            Assert.AreEqual(changedPropertyList.Count, 0);
        }
 void TryExecuteField(IDSFDataObject dataObject, int update, ErrorResultTO allErrors, int innerCount, AssignObjectDTO t)
 {
     try
     {
         if (!string.IsNullOrEmpty(t.FieldName))
         {
             var assignValue      = new AssignValue(t.FieldName, t.FieldValue);
             var isCalcEvaluation = DataListUtil.IsCalcEvaluation(t.FieldValue, out string cleanExpression);
             if (isCalcEvaluation)
             {
                 assignValue = new AssignValue(t.FieldName, cleanExpression);
             }
             DebugItem debugItem = null;
             if (dataObject.IsDebugMode())
             {
                 debugItem = AddSingleInputDebugItem(dataObject.Environment, innerCount, assignValue, update);
             }
             if (isCalcEvaluation)
             {
                 DoCalculation(dataObject.Environment, t.FieldName, t.FieldValue, update);
             }
             else
             {
                 dataObject.Environment.AssignJson(assignValue, update);
             }
             if (debugItem != null)
             {
                 _debugInputs.Add(debugItem);
             }
             if (dataObject.IsDebugMode())
             {
                 assignValue = AddDebugOutputItem(dataObject, update, innerCount, assignValue);
             }
         }
     }
     catch (Exception e)
     {
         //Dev2Logger.Error(nameof(DsfMultiAssignObjectActivity), e, GlobalConstants.WarewolfError);
         allErrors.AddError(e.Message);
     }
 }
Exemple #18
0
 private int AssignField(IDSFDataObject dataObject, int update, int innerCount, AssignObjectDTO t)
 {
     if (!string.IsNullOrEmpty(t.FieldName))
     {
         var assignValue      = new AssignValue(t.FieldName, t.FieldValue);
         var isCalcEvaluation = DataListUtil.IsCalcEvaluation(t.FieldValue, out string cleanExpression);
         if (isCalcEvaluation)
         {
             assignValue = new AssignValue(t.FieldName, cleanExpression);
         }
         DebugItem debugItem = null;
         if (dataObject.IsDebugMode())
         {
             debugItem = AddSingleInputDebugItem(dataObject.Environment, innerCount, assignValue, update);
         }
         if (isCalcEvaluation)
         {
             DoCalculation(dataObject.Environment, t.FieldName, t.FieldValue, update);
         }
         else
         {
             dataObject.Environment.AssignJson(assignValue, update);
         }
         if (debugItem != null)
         {
             _debugInputs.Add(debugItem);
         }
         if (dataObject.IsDebugMode())
         {
             if (DataListUtil.IsValueRecordset(assignValue.Name) && DataListUtil.GetRecordsetIndexType(assignValue.Name) == enRecordsetIndexType.Blank)
             {
                 var length = dataObject.Environment.GetObjectLength(DataListUtil.ExtractRecordsetNameFromValue(assignValue.Name));
                 assignValue = new AssignValue(DataListUtil.ReplaceObjectBlankWithIndex(assignValue.Name, length), assignValue.Value);
             }
             AddSingleDebugOutputItem(dataObject.Environment, innerCount, assignValue, update);
         }
     }
     innerCount++;
     return(innerCount);
 }
        void DoCalculation(IExecutionEnvironment environment, string fieldName, string cleanExpression, int update)
        {
            var functionEvaluator  = new FunctionEvaluator(FunctionEvaluatorOption.DotNetDateTimeFormat);
            var warewolfEvalResult = environment.Eval(cleanExpression, update);

            if (warewolfEvalResult.IsWarewolfAtomResult && warewolfEvalResult is CommonFunctions.WarewolfEvalResult.WarewolfAtomResult atomResult)
            {
                var eval          = PerformCalcForAtom(atomResult.Item, functionEvaluator);
                var doCalculation = new AssignValue(fieldName, eval);
                environment.AssignWithFrame(doCalculation, update);
            }
            if (warewolfEvalResult.IsWarewolfAtomListresult && warewolfEvalResult is CommonFunctions.WarewolfEvalResult.WarewolfAtomListresult atomListResult)
            {
                var counter = 1;
                foreach (var item in atomListResult.Item)
                {
                    var eval          = PerformCalcForAtom(item, functionEvaluator);
                    var doCalculation = new AssignValue(fieldName, eval);
                    environment.AssignWithFrame(doCalculation, update == 0 ? counter : update);
                    counter++;
                }
            }
        }
        void ExecuteField(IDSFDataObject dataObject, int update, int innerCount, ActivityDTO t)
        {
            var assignValue      = new AssignValue(t.FieldName, t.FieldValue);
            var isCalcEvaluation = DataListUtil.IsCalcEvaluation(t.FieldValue, out string cleanExpression);

            if (isCalcEvaluation)
            {
                assignValue = new AssignValue(t.FieldName, cleanExpression);
            }
            DebugItem debugItem = null;

            if (dataObject.IsDebugMode())
            {
                debugItem = TryCreateDebugInput(dataObject.Environment, innerCount, assignValue, update);
            }
            if (isCalcEvaluation)
            {
                DoCalculation(dataObject.Environment, t.FieldName, t.FieldValue, update);
            }
            else
            {
                dataObject.Environment.AssignWithFrame(assignValue, update);
            }
            if (debugItem != null)
            {
                _debugInputs.Add(debugItem);
            }
            if (dataObject.IsDebugMode())
            {
                if (DataListUtil.IsValueRecordset(assignValue.Name) && DataListUtil.GetRecordsetIndexType(assignValue.Name) == enRecordsetIndexType.Blank)
                {
                    var length = dataObject.Environment.GetLength(DataListUtil.ExtractRecordsetNameFromValue(assignValue.Name));
                    assignValue = new AssignValue(DataListUtil.ReplaceRecordsetBlankWithIndex(assignValue.Name, length), assignValue.Value);
                }
                AddSingleDebugOutputItem(dataObject.Environment, innerCount, assignValue, update);
            }
        }
 public string ValueToCS()
 {
     return(Is.Replace(str, "${AssignmentStatement_Varible} = " + AssignValue.ValueToCS()));
 }
Exemple #22
0
        public static void EventCommandsOwnerTest()
        {
            var assignValue  = new AssignValue();
            var assignValue2 = new AssignValue();
            var addValue     = new AddValue();
            var addValue2    = new AddValue();

            // この時点で EventCommand の Owner が null であることを確認
            Assert.IsNull(assignValue.Owner);
            Assert.IsNull(assignValue2.Owner);
            Assert.IsNull(addValue.Owner);
            Assert.IsNull(addValue2.Owner);

            var commonEvent = new CommonEvent();

            var list = new EventCommandList();

            var moveRoute = new MoveRoute();

            var actionEntry = new ActionEntry();

            actionEntry.CommandList.Add(assignValue);
            actionEntry.CommandList.Add(addValue);

            // この時点で EventCommandList, MoveRoute, ActionEntry, EventCommand の Owner が null であることを確認
            Assert.IsNull(list.Owner);
            Assert.IsNull(moveRoute.Owner);
            Assert.IsNull(actionEntry.Owner);
            Assert.IsNull(assignValue.Owner);
            Assert.IsNull(assignValue2.Owner);
            Assert.IsNull(addValue.Owner);
            Assert.IsNull(addValue2.Owner);

            moveRoute.ActionEntry = actionEntry;
            list.Add(moveRoute);

            // この時点で EventCommand の Owner が null であることを確認
            Assert.IsNull(assignValue.Owner);
            Assert.IsNull(assignValue2.Owner);
            Assert.IsNull(addValue.Owner);
            Assert.IsNull(addValue2.Owner);

            commonEvent.EventCommands = list;

            // この時点で EventCommandList, MoveRoute, ActionEntry, セット済みのEventCommand の
            // Owner がセットされていることを確認
            Assert.AreEqual(list.Owner, TargetAddressOwner.CommonEvent);
            Assert.AreEqual(moveRoute.Owner, TargetAddressOwner.CommonEvent);
            Assert.AreEqual(assignValue.Owner, TargetAddressOwner.CommonEvent);
            Assert.AreEqual(addValue.Owner, TargetAddressOwner.CommonEvent);

            actionEntry.CommandList.Add(assignValue2);
            moveRoute.ActionEntry.CommandList.Add(addValue2);

            // EventCommand の Owner に適切な値が設定されること
            Assert.AreEqual(assignValue2.Owner, TargetAddressOwner.CommonEvent);
            Assert.AreEqual(addValue2.Owner, TargetAddressOwner.CommonEvent);

            // commonEvent をここまで開放したくないので無駄な処理を入れる
            commonEvent.Memo = "";
        }
Exemple #23
0
 public void Execute(AssignValue assignValue)
 {
     _file.WriteLine($"{_indents}AssignValue\tValue:{assignValue.Value.Name},Recipient:{assignValue.Recipient.Name}");
 }
    // Performs actions defined by the Node
    // If the Node is part of core functionality of the language, e.g. assigning to variables, performing arithmetic, etc. then handle it here.
    // Otherwise, continue to child implementations of this method.
    public virtual ExecutionStatus ExecuteNode(NodeBase node)
    {
        if (node == null)
        {
            programRunning = false;
            currentNode    = program.programStart;
            return(new ExecutionStatus {
                success = false, handover = false
            });
        }

        switch (CheckNodeType(node))
        {
        // Handlers for different commands
        case NodeType.ProgramStart:
            Logger.Log("Program starting!");
            processingDone = true;

            InitSymTable();
            // TODO: this doesn't actually reset the buffer?
            outputBuffer = "";

            return(new ExecutionStatus {
                success = true, handover = false
            });

        case NodeType.AssignValue:
            AssignValue assignValue = node.GetComponent <AssignValue>();

            SetSymbol(assignValue.leftHand, assignValue.rightHand);

            return(new ExecutionStatus {
                success = true, handover = false
            });

        case NodeType.ArithmeticOperationBase:
            // Arithmetic only takes a tick when it gets executed
            currentNode = (NodeBase)currentNode.nextNode;
            return(ExecuteNode(currentNode));

        case NodeType.ProgramEnd:
            processingDone = true;
            programRunning = false;
            return(new ExecutionStatus {
                success = true, handover = false
            });

        case NodeType.FunctionCallBase:
            string funcName = node.GetComponent <FunctionCallBase>().functionName;
            if (BaseControllerFunctions().ContainsKey(funcName))
            {
                // TODO: passing a copy of symbolTable here might consume too much memory. Make static?
                functions[funcName].DynamicInvoke(node.GetComponent <FunctionCallBase>().GetRawParameters(symbolTable));
                Logger.Log($"Found base function {funcName}");
                return(new ExecutionStatus {
                    success = true, handover = false
                });
            }
            Logger.Log($"Couldn't find base function {funcName}");
            break;

        case NodeType.LogicalBlock:
        case NodeType.WhileLoop:
        case NodeType.ElseBlock:
            // Make sure all nodes in the block body have their ownerLoop assigned
            node.GetComponent <LogicalBlock>().PropagateOwnership();

            if (DistanceCheck())
            {
                GameObject.Find("OutputRenderer").transform.Find("Canvas").GetComponentInChildren <Text>().text = ((CodeBlock)currentNode).SerializeBlockHeader();
            }
            //new WaitForSeconds((float)tickTime

            bool evaluatedResult = false;
            // ElseBlocks should activate when its associated LogicalBlocks evaluate as false.
            if (node.GetComponent <ElseBlock>())
            {
                if (node.PrevNodeObject.GetComponent <LogicalBlock>() && !node.PrevNodeObject.GetComponent <ElseBlock>() && !node.PrevNodeObject.GetComponent <WhileLoop>())
                {
                    evaluatedResult = !node.PrevNodeObject.GetComponent <LogicalBlock>().evaluatedResult;
                }
            }
            else
            {
                evaluatedResult = node.GetComponent <LogicalBlock>().condition.Evaluate(ref symbolTable);
            }

            node.GetComponent <LogicalBlock>().evaluatedResult = evaluatedResult;
            if (evaluatedResult && ((!node.GetComponent <WhileLoop>()) || (node.GetComponent <WhileLoop>() && !node.GetComponent <WhileLoop>().breakNow)))
            {
                NodeBase nodeToFollow = (NodeBase)(node.GetComponent <LogicalBlock>().firstBodyNode);
                if (nodeToFollow != null)
                {
                    specialNextNode = nodeToFollow;
                }
                else
                {
                    specialNextNode = (NodeBase)currentNode.nextNode;
                }
                //return ExecuteNode(currentNode);
                timeSinceTick = -tickTime;
                return(new ExecutionStatus {
                    success = true, handover = false
                });
            }
            break;

        case NodeType.AllocateArray:
            if (node.GetComponent <AllocateArray>())
            {
                int count = -1;
                // Check if entered size was a valid >= 0 integer.
                // TODO: unexpected behaviour when allocating with size == 0
                Logger.Log($"Allocating array with count {(string)node.GetComponent<AllocateArray>().GetRawParameters(symbolTable)[0]}");
                if (int.TryParse((string)node.GetComponent <AllocateArray>().GetRawParameters(symbolTable)[0], out count))
                {
                    string arrName = node.GetComponent <AllocateArray>().parameters[1].Value;
                    if (string.IsNullOrWhiteSpace(arrName))
                    {
                        // TODO: error too?
                        return(new ExecutionStatus {
                            success = false, handover = false
                        });
                    }
                    for (int i = 0; i < count; i++)
                    {
                        Logger.Log($"Adding array element \"{arrName}[{i}]\"");
                        symbolTable.Add($"{arrName}[{i}]", new FunctionParameter {
                            Value = "None"
                        });
                    }
                    // Only initialise elements in the symbol table if size was provided as a literal
                    if (int.TryParse(node.GetComponent <AllocateArray>().parameters[0].Value, out count))
                    {
                        for (int i = 2; i < 2 + count; i++)
                        {
                            FunctionParameter listElement = node.GetComponent <AllocateArray>().parameters[i];
                            SetSymbol(new FunctionParameter {
                                Value = listElement.Name
                            }, new FunctionParameter {
                                Value = string.IsNullOrWhiteSpace(listElement.Value) ? "None" : listElement.Value
                            });
                        }
                    }
                    return(new ExecutionStatus {
                        success = true, handover = false
                    });
                }
            }
            break;

        case NodeType.Continue:
            if (node.GetComponent <Continue>())
            {
                // Find the while loop
                LogicalBlock owner = node.ownerLoop;
                while (owner != null)
                {
                    WhileLoop loop = owner.GetComponent <WhileLoop>();
                    if (loop != null)
                    {
                        currentNode = loop;
                        return(ExecuteNode(currentNode));
                    }
                    else
                    {
                        owner = owner.ownerLoop;
                    }
                }
                if (owner == null)
                {
                    return(new ExecutionStatus {
                        success = false, handover = false
                    });
                }
            }
            break;

        case NodeType.Break:
            if (node.GetComponent <Break>())
            {
                // Find the while loop
                LogicalBlock owner = node.ownerLoop;
                while (owner != null)
                {
                    WhileLoop loop = owner.GetComponent <WhileLoop>();
                    if (loop != null)
                    {
                        loop.breakNow = true;
                        currentNode   = loop;
                        return(ExecuteNode(currentNode));
                    }
                    else
                    {
                        owner = owner.ownerLoop;
                    }
                }
                if (owner == null)
                {
                    return(new ExecutionStatus {
                        success = false, handover = false
                    });
                }
            }
            break;
        }

        return(new ExecutionStatus {
            success = true, handover = true
        });
    }
        //public override IDev2Activity Execute(IDSFDataObject data)
        //{
        //    ExecuteTool(data);
        //    if(NextNodes != null && NextNodes.Count()>0)
        //    {
        //        NextNodes.First().Execute(data);
        //        return NextNodes.First();
        //    }
        //    return null;
        //}

        #endregion

        protected override void ExecuteTool(IDSFDataObject dataObject, int update)
        {
            _debugOutputs.Clear();
            _debugInputs.Clear();

            InitializeDebug(dataObject);
            ErrorResultTO errors    = new ErrorResultTO();
            ErrorResultTO allErrors = new ErrorResultTO();

            try
            {
                if (!errors.HasErrors())
                {
                    int innerCount = 1;
                    foreach (ActivityDTO t in FieldsCollection)
                    {
                        try
                        {
                            if (!string.IsNullOrEmpty(t.FieldName))
                            {
                                string cleanExpression;
                                var    assignValue      = new AssignValue(t.FieldName, t.FieldValue);
                                var    isCalcEvaluation = DataListUtil.IsCalcEvaluation(t.FieldValue, out cleanExpression);
                                if (isCalcEvaluation)
                                {
                                    assignValue = new AssignValue(t.FieldName, cleanExpression);
                                }
                                DebugItem debugItem = null;
                                if (dataObject.IsDebugMode())
                                {
                                    debugItem = AddSingleInputDebugItem(dataObject.Environment, innerCount, assignValue, update);
                                }
                                if (isCalcEvaluation)
                                {
                                    DoCalculation(dataObject.Environment, t.FieldName, t.FieldValue, update);
                                }
                                else
                                {
                                    dataObject.Environment.AssignWithFrame(assignValue, update);
                                }
                                if (debugItem != null)
                                {
                                    _debugInputs.Add(debugItem);
                                }
                                if (dataObject.IsDebugMode())
                                {
                                    if (DataListUtil.IsValueRecordset(assignValue.Name) && DataListUtil.GetRecordsetIndexType(assignValue.Name) == enRecordsetIndexType.Blank)
                                    {
                                        var length = dataObject.Environment.GetLength(DataListUtil.ExtractRecordsetNameFromValue(assignValue.Name));
                                        assignValue = new AssignValue(DataListUtil.ReplaceRecordsetBlankWithIndex(assignValue.Name, length), assignValue.Value);
                                    }
                                    AddSingleDebugOutputItem(dataObject.Environment, innerCount, assignValue, update);
                                }
                            }
                            innerCount++;
                        }
                        catch (Exception e)
                        {
                            Dev2Logger.Error(e);
                            allErrors.AddError(e.Message);
                        }
                    }
                    dataObject.Environment.CommitAssign();
                    allErrors.MergeErrors(errors);
                }
            }
            catch (Exception e)
            {
                Dev2Logger.Error(e);
                allErrors.AddError(e.Message);
            }
            finally
            {
                // Handle Errors
                var hasErrors = allErrors.HasErrors();
                if (hasErrors)
                {
                    DisplayAndWriteError("DsfAssignActivity", allErrors);
                    var errorString = allErrors.MakeDisplayReady();
                    dataObject.Environment.AddError(errorString);
                }
                if (dataObject.IsDebugMode())
                {
                    DispatchDebugState(dataObject, StateType.Before, update);
                    DispatchDebugState(dataObject, StateType.After, update);
                }
            }
        }