Пример #1
0
 public override IDataExecutionPlanNode FoldQuery(IDictionary <string, DataSource> dataSources, IQueryExecutionOptions options, IDictionary <string, Type> parameterTypes, IList <OptimizerHint> hints)
 {
     TrySource          = TrySource.FoldQuery(dataSources, options, parameterTypes, hints);
     TrySource.Parent   = this;
     CatchSource        = CatchSource.FoldQuery(dataSources, options, parameterTypes, hints);
     CatchSource.Parent = this;
     return(this);
 }
Пример #2
0
        public override INodeSchema GetSchema(IDictionary <string, DataSource> dataSources, IDictionary <string, Type> parameterTypes)
        {
            var trySchema   = TrySource.GetSchema(dataSources, parameterTypes);
            var catchSchema = CatchSource.GetSchema(dataSources, parameterTypes);

            // Columns should be the same but sort order may be different
            if (trySchema.SortOrder.SequenceEqual(catchSchema.SortOrder, StringComparer.OrdinalIgnoreCase))
            {
                return(trySchema);
            }

            var consistentSorts = trySchema.SortOrder
                                  .TakeWhile((sort, index) => index < catchSchema.SortOrder.Count && sort.Equals(catchSchema.SortOrder[index], StringComparison.OrdinalIgnoreCase))
                                  .ToList();

            return(new NodeSchema(trySchema)
            {
                SortOrder = consistentSorts
            });
        }
Пример #3
0
        protected override IEnumerable <Entity> ExecuteInternal(IDictionary <string, DataSource> dataSources, IQueryExecutionOptions options, IDictionary <string, Type> parameterTypes, IDictionary <string, object> parameterValues)
        {
            var useCatchSource = false;
            IEnumerator <Entity> enumerator;

            try
            {
                enumerator = TrySource.Execute(dataSources, options, parameterTypes, parameterValues).GetEnumerator();
            }
            catch (Exception ex)
            {
                if (ExceptionFilter != null && !ExceptionFilter(ex))
                {
                    throw;
                }

                useCatchSource  = true;
                enumerator      = null;
                CaughtException = ex.Message;
            }

            var doneFirst = false;

            while (!useCatchSource && !options.Cancelled)
            {
                Entity current;

                try
                {
                    if (!enumerator.MoveNext())
                    {
                        break;
                    }

                    doneFirst = true;
                    current   = enumerator.Current;
                }
                catch (Exception ex)
                {
                    if (doneFirst || ExceptionFilter != null && !ExceptionFilter(ex))
                    {
                        throw;
                    }

                    useCatchSource  = true;
                    current         = null;
                    CaughtException = ex.Message;
                }

                if (!useCatchSource)
                {
                    yield return(current);
                }
            }

            if (useCatchSource)
            {
                foreach (var entity in CatchSource.Execute(dataSources, options, parameterTypes, parameterValues))
                {
                    yield return(entity);
                }
            }
        }
Пример #4
0
 public override void AddRequiredColumns(IDictionary <string, DataSource> dataSources, IDictionary <string, Type> parameterTypes, IList <string> requiredColumns)
 {
     TrySource.AddRequiredColumns(dataSources, parameterTypes, requiredColumns);
     CatchSource.AddRequiredColumns(dataSources, parameterTypes, requiredColumns);
 }