public virtual async ValueTask Execute(IExecutionContext executionContext, CancellationToken token)
        {
            if (executionContext is null)
            {
                throw new ArgumentNullException(nameof(executionContext));
            }

            var array = await ArrayEvaluator.EvaluateArray(executionContext, token).ConfigureAwait(false);

            for (var i = 0; i < array.Length; i++)
            {
                var instance = array[i];

                await ItemEvaluator.SetValue(instance, executionContext, token).ConfigureAwait(false);

                if (IndexEvaluator is not null)
                {
                    await IndexEvaluator.SetValue(new DefaultObject(i), executionContext, token).ConfigureAwait(false);
                }

                foreach (var execEvaluator in ActionEvaluatorList)
                {
                    await execEvaluator.Execute(executionContext, token).ConfigureAwait(false);
                }
            }
        }
        public void Execute_Duplicate_OneOccurence()
        {
            var resultSet = BuildDataTable(
                new List <List <object> >()
            {
                new List <object>()
                {
                    "a", "b", 120
                },
                new List <object>()
                {
                    "a", "b", 120
                },
                new List <object>()
                {
                    "a", "d", 150
                },
            });

            var finder = new IndexEvaluator();
            var result = finder.Execute(resultSet);

            Assert.That(result.Values.Count(), Is.EqualTo(1));
            Assert.That(result.Values.ElementAt(0).OccurenceCount, Is.EqualTo(2));
        }
        public void Execute_Duplicate_TwoOccurences()
        {
            var resultSet = BuildDataTable(
                new List <List <object> >()
            {
                new List <object>()
                {
                    "a", "b", 120
                },
                new List <object>()
                {
                    "a", "b", 120
                },
                new List <object>()
                {
                    "a", "b", 120
                },
            });

            var finder = new IndexEvaluator();
            var result = finder.Execute(resultSet);

            Assert.That(result.Values.Count(), Is.EqualTo(1));
            Assert.That(result.Values.ElementAt(0).OccurenceCount, Is.EqualTo(3));
            Assert.That(result.Values.ElementAt(0).Keys.Members, Has.Member("a"));
            Assert.That(result.Values.ElementAt(0).Keys.Members, Has.Member("b"));
            Assert.That(result.Values.ElementAt(0).Keys.Members, Has.Member("120"));
            Assert.That(result.Rows.Count(), Is.EqualTo(1));
            Assert.That(result.Rows.ElementAt(0).ItemArray, Has.Member(3));
            Assert.That(result.Rows.ElementAt(0).ItemArray, Has.Member("a"));
            Assert.That(result.Rows.ElementAt(0).ItemArray, Has.Member("b"));
            Assert.That(result.Rows.ElementAt(0).ItemArray, Has.Member("120"));
        }
        public override async ValueTask Execute(IExecutionContext executionContext, CancellationToken token)
        {
            var engine = executionContext.Engine();

            engine.EnterExecutionContext();

            try
            {
                ItemEvaluator.DeclareLocalVariable(executionContext);
                IndexEvaluator?.DeclareLocalVariable(executionContext);

                await base.Execute(executionContext, token).ConfigureAwait(false);
            }
            finally
            {
                engine.LeaveExecutionContext();
            }
        }
        public void Execute_Duplicate_False()
        {
            var resultSet = BuildDataTable(
                new List <List <object> >()
            {
                new List <object>()
                {
                    "a", "b", 120
                },
                new List <object>()
                {
                    "a", "b", 120
                },
                new List <object>()
                {
                    "a", "d", 150
                },
            });

            var finder = new IndexEvaluator();
            var result = finder.Execute(resultSet);

            Assert.That(result.AreUnique, Is.False);
        }