public DatasetConstraintConfigurator(
            [NotNull] IEnumerable <TestParameterValue> parameterValues)
        {
            Assert.ArgumentNotNull(parameterValues, nameof(parameterValues));

            var constraints = new List <string>();

            foreach (TestParameterValue value in parameterValues)
            {
                if (Equals(value.TestParameterName, QaDatasetConstraintFactory.TableAttribute))
                {
                    Assert.Null(Dataset,
                                "Multiple Attribute " +
                                QaDatasetConstraintFactory.TableAttribute);

                    Dataset = (ObjectDataset)((DatasetTestParameterValue)value).DatasetValue;
                }
                else if (Equals(value.TestParameterName,
                                QaDatasetConstraintFactory.ConstraintAttribute))
                {
                    constraints.Add(value.StringValue);
                }
                else
                {
                    Assert.False(true, "Unexpected attribute");
                }
            }

            Assert.NotNull(Dataset,
                           "Missing Attribute: {0}", QaDatasetConstraintFactory.TableAttribute);

            Constraints = HierarchicalConstraintUtils.GetConstraintHierarchy(constraints);
        }
        protected override object[] Args(
            IOpenDataset datasetContext,
            IList <TestParameter> testParameters,
            out List <TableConstraint> tableParameters)
        {
            object[] objParams = base.Args(datasetContext, testParameters, out tableParameters);
            if (objParams.Length != 2)
            {
                throw new ArgumentException(string.Format("expected 2 parameter, got {0}",
                                                          objParams.Length));
            }

            if (objParams[0] is ITable == false)
            {
                throw new ArgumentException(string.Format("expected ITable, got {0}",
                                                          objParams[0].GetType()));
            }

            if (objParams[1] as IList <string> == null)
            {
                throw new ArgumentException(string.Format("expected IList<string>, got {0}",
                                                          objParams[1].GetType()));
            }

            var objects = new object[2];

            IList <ConstraintNode> nodes =
                HierarchicalConstraintUtils.GetConstraintHierarchy((IList <string>)objParams[1]);

            objects[0] = objParams[0];
            objects[1] = nodes;

            return(objects);
        }
        protected override object[] Args(IOpenDataset datasetContext,
                                         IList <TestParameter> testParameters,
                                         out List <TableConstraint> tableParameters)
        {
            object[] objParams = base.Args(datasetContext, testParameters, out tableParameters);

            if (objParams.Length != 4)
            {
                throw new ArgumentException(string.Format("expected 4 parameters, got {0}",
                                                          objParams.Length));
            }

            if (!(objParams[0] is IList <ITable>))
            {
                throw new ArgumentException(string.Format("expected IList<ITable>, got {0}",
                                                          objParams[0].GetType()));
            }

            if (!(objParams[1] is string))
            {
                throw new ArgumentException(
                          string.Format("expected string (for relation), got {0}",
                                        objParams[1].GetType()));
            }

            if (objParams[2].GetType() != typeof(JoinType))
            {
                throw new ArgumentException(string.Format("expected JoinType, got {0}",
                                                          objParams[2].GetType()));
            }

            if (!(objParams[3] is IList <string>))
            {
                throw new ArgumentException(string.Format("expected IList<string>, got {0}",
                                                          objParams[3].GetType()));
            }

            var objects = new object[3];

            var tables          = (IList <ITable>)objParams[0];
            var associationName = (string)objParams[1];
            var join            = (JoinType)objParams[2];
            var constraints     = (IList <string>)objParams[3];

            bool applyFilterInDatabase = GetParameterValue <bool>(testParameters,
                                                                  datasetContext,
                                                                  _parameterNameApplyFilterInDatabase);

            bool   useCaseSensitiveQaSql;
            string tableConstraint = CombineTableParameters(tableParameters,
                                                            out useCaseSensitiveQaSql);

            string whereClause = applyFilterInDatabase ? tableConstraint : null;

            ITable queryTable = CreateQueryTable(datasetContext, associationName, tables, join,
                                                 whereClause, out string relationshipClassName);

            IList <string> translatedConstraints = TranslateConstraints(
                constraints,
                associationName, relationshipClassName,
                Assert.NotNull(Condition).ParameterValues.OfType <DatasetTestParameterValue>(),
                datasetContext);

            // assign objects[]
            IList <ConstraintNode> nodes =
                HierarchicalConstraintUtils.GetConstraintHierarchy(translatedConstraints);

            objects[0] = queryTable;
            objects[1] = nodes;
            objects[2] = tables;

            tableParameters = applyFilterInDatabase
                                                  ? new List <TableConstraint>()
                                                  : new List <TableConstraint>
            {
                new TableConstraint(queryTable, tableConstraint,
                                    useCaseSensitiveQaSql)
            };

            return(objects);
        }