protected NBiConstraint InstantiateConstraint()
        {
            BaseResultSetComparisonConstraint ctr = null;

            if (ConstraintXml.GetCommand() != null)
            {
                var commandText      = ConstraintXml.GetCommand().CommandText;
                var connectionString = ConstraintXml.GetCommand().Connection.ConnectionString;
                var timeout          = ((QueryXml)(ConstraintXml.BaseItem)).Timeout;
                IEnumerable <IQueryParameter>        parameters = null;
                IEnumerable <IQueryTemplateVariable> variables  = null;
                if (ConstraintXml.Query != null)
                {
                    parameters = ConstraintXml.Query.GetParameters();
                    variables  = ConstraintXml.Query.GetVariables();
                }

                var commandBuilder = new CommandBuilder();
                var cmd            = commandBuilder.Build(connectionString, commandText, parameters, variables, timeout);
                ctr = InstantiateConstraint(cmd);
            }
            else if (ConstraintXml.ResultSet != null)
            {
                if (!string.IsNullOrEmpty(ConstraintXml.ResultSet.File))
                {
                    Trace.WriteLineIf(NBiTraceSwitch.TraceVerbose, "ResultSet defined in external file!");
                    ctr = InstantiateConstraint(ConstraintXml.ResultSet.GetFile());
                    if (ConstraintXml.Settings.CsvProfile != null)
                    {
                        ctr = ctr.CsvProfile(ConstraintXml.Settings.CsvProfile);
                    }
                }
                else if (ConstraintXml.ResultSet.Rows != null)
                {
                    Trace.WriteLineIf(NBiTraceSwitch.TraceVerbose, "ResultSet defined in embedded resultSet!");
                    ctr = InstantiateConstraint(ConstraintXml.ResultSet.Content);
                }
            }
            else if (ConstraintXml.XmlSource != null)
            {
                var selects = new List <AbstractSelect>();
                var factory = new SelectFactory();
                foreach (var select in ConstraintXml.XmlSource.XPath.Selects)
                {
                    selects.Add(factory.Instantiate(select.Value, select.Attribute, select.Evaluate));
                }

                XPathEngine engine = null;
                if (ConstraintXml.XmlSource.File != null)
                {
                    Trace.WriteLineIf(NBiTraceSwitch.TraceVerbose, string.Format("Xml file at '{0}'", ConstraintXml.XmlSource.GetFile()));
                    engine = new XPathFileEngine(ConstraintXml.XmlSource.GetFile(), ConstraintXml.XmlSource.XPath.From.Value, selects);
                }
                else if (ConstraintXml.XmlSource.Url != null)
                {
                    Trace.WriteLineIf(NBiTraceSwitch.TraceVerbose, string.Format("Xml file at '{0}'", ConstraintXml.XmlSource.Url.Value));
                    engine = new XPathUrlEngine(ConstraintXml.XmlSource.Url.Value, ConstraintXml.XmlSource.XPath.From.Value, selects);
                }
                else
                {
                    throw new ArgumentException("File or Url can't be both empty when declaring an xml-source.");
                }

                ctr = InstantiateConstraint(engine);
            }

            if (ctr == null)
            {
                throw new ArgumentException();
            }

            //Manage settings for comparaison
            var builder = new ResultSetComparisonBuilder();

            if (ConstraintXml.Behavior == EqualToXml.ComparisonBehavior.SingleRow)
            {
                builder.Setup(false, 0, null, 0, null,
                              ConstraintXml.ValuesDefaultType,
                              ToleranceFactory.Instantiate(ConstraintXml.ValuesDefaultType, ConstraintXml.Tolerance),
                              ConstraintXml.ColumnsDef
                              , ComparisonKind.EqualTo
                              );
            }
            else
            {
                builder.Setup(
                    true,
                    ConstraintXml.KeysDef,
                    ConstraintXml.KeyName,
                    ConstraintXml.ValuesDef,
                    ConstraintXml.ValueName,
                    ConstraintXml.ValuesDefaultType,
                    ToleranceFactory.Instantiate(ConstraintXml.ValuesDefaultType, ConstraintXml.Tolerance),
                    ConstraintXml.ColumnsDef,
                    ComparisonKind
                    );
            }

            builder.Build();
            ctr = ctr.Using(builder.GetComparer());

            var settings = builder.GetSettings();

            ctr = ctr.Using(settings);

            //Manage transformations
            var transformationProvider = new TransformationProvider();

            foreach (var columnDef in ConstraintXml.ColumnsDef)
            {
                if (columnDef.Transformation != null)
                {
                    transformationProvider.Add(columnDef.Index, columnDef.Transformation);
                }
            }

            ctr = ctr.Using(transformationProvider);

            //Manage parallelism
            if (ConstraintXml.ParallelizeQueries)
            {
                ctr = ctr.Parallel();
            }
            else
            {
                ctr = ctr.Sequential();
            }

            return(ctr);
        }
Exemple #2
0
        protected NBiConstraint InstantiateConstraint()
        {
            BaseResultSetComparisonConstraint ctr = null;

            //Manage transformations
            var transformationProvider = new TransformationProvider();

            foreach (var columnDef in ConstraintXml.ColumnsDef)
            {
                if (columnDef.Transformation != null)
                {
                    transformationProvider.Add(columnDef.Index, columnDef.Transformation);
                }
            }

            if (ConstraintXml.GetCommand() != null)
            {
                ctr = InstantiateConstraint(((QueryXml)(ConstraintXml.BaseItem)), ConstraintXml.Settings, transformationProvider);
            }
            else if (ConstraintXml.ResultSet != null)
            {
                ctr = InstantiateConstraint(ConstraintXml.ResultSet, ConstraintXml.Settings, transformationProvider);
            }
            else if (ConstraintXml.XmlSource != null)
            {
                ctr = InstantiateConstraint(ConstraintXml.XmlSource, ConstraintXml.Settings, transformationProvider);
            }

            if (ctr == null)
            {
                throw new ArgumentException();
            }

            //Manage settings for comparaison
            var builder = new SettingsEquivalerBuilder();

            if (ConstraintXml.Behavior == EqualToXml.ComparisonBehavior.SingleRow)
            {
                builder.Setup(false);
                builder.Setup(ConstraintXml.ValuesDefaultType, ConstraintXml.Tolerance);
                builder.Setup(ConstraintXml.ColumnsDef);
            }
            else
            {
                builder.Setup(ConstraintXml.KeysDef, ConstraintXml.ValuesDef);
                builder.Setup(
                    ConstraintXml.KeyName?.Replace(" ", "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Distinct(),
                    ConstraintXml.ValueName?.Replace(" ", "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Distinct());
                builder.Setup(ConstraintXml.ValuesDefaultType, ConstraintXml.Tolerance);
                builder.Setup(ConstraintXml.ColumnsDef);
            }

            builder.Build();
            var settings = builder.GetSettings();

            var factory  = new EquivalerFactory();
            var comparer = factory.Instantiate(settings, EquivalenceKind);

            ctr = ctr.Using(comparer);
            ctr = ctr.Using(settings);

            //Manage parallelism
            if (ConstraintXml.ParallelizeQueries)
            {
                ctr = ctr.Parallel();
            }
            else
            {
                ctr = ctr.Sequential();
            }

            return(ctr);
        }