/// <summary>
        /// Converts the <paramref name="expression"/> to an <see cref="Expression"/>.
        /// </summary>
        /// <param name="dataProvider">
        /// The data provider.
        /// </param>
        /// <param name="expression">
        /// The expression to convert.
        /// </param>
        /// <param name="allowVariables">
        /// <c>true</c> to allow blocks and variables in the expression, <c>false</c> to replace variables by their value (so they can be used in expressions).</param>
        /// <returns>
        /// The <see cref="Expression"/>.
        /// </returns>
        public static Expression ConvertToLinqExpression(this INodeDataProvider dataProvider, [CanBeNull] SqlExpressionBase expression, bool allowVariables = true)
        {
            if (expression == null)
            {
                return(null);
            }

            new Evaluator(dataProvider).Visit(expression);

            var result = NodeDataProviderExpressionConverter.CleanExpression(dataProvider.GetExpression(expression));

            if (allowVariables)
            {
                return(result);
            }

            var vars = new Dictionary <ParameterExpression, Expression>();

            GenericVisitor.Visit(
                (BinaryExpression e) =>
            {
                if (e.NodeType == ExpressionType.Assign && e.Left is ParameterExpression parameter)
                {
                    vars[parameter] = e.Right;
                }

                return(null);
            },
                result);

            result = new GenericVisitor
            {
                (GenericVisitor v, BlockExpression e) => v.Visit(e.Expressions.First(b => b.NodeType != ExpressionType.Assign)),
                (ParameterExpression e) => vars.TryGetValue(e, out var value) ? value : e
            }.Visit(result);
        /// <summary>
        ///     Converts the <paramref name="source" /> to a lambda returning a <see cref="DataSource" />.
        /// </summary>
        /// <param name="dataProvider">
        ///     The data provider.
        /// </param>
        /// <param name="source">
        ///     The source to convert.
        /// </param>
        /// <param name="messages">
        ///     The messages.
        /// </param>
        /// <returns>
        ///     The <see cref="Expression" />.
        /// </returns>
        public static Expression ConvertToDataSource(this INodeDataProvider dataProvider, SourceBase source, [CanBeNull] IMessageWriter messages = null)
        {
            new Evaluator(dataProvider, messages ?? new MessageWriter("null")).Visit(source);

            var factoryExpression = dataProvider.GetFactoryExpression(source);

            return(factoryExpression.Type == typeof(DataSource) ? factoryExpression : Expression.Convert(factoryExpression, typeof(DataSource)));
        }
Esempio n. 3
0
        /// <summary>
        /// The get display.
        /// </summary>
        /// <param name="node">
        /// The node.
        /// </param>
        /// <param name="data">
        /// The node data provider.
        /// </param>
        /// <param name="indentSize">
        /// The indent size.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        public static string GetDisplay(this Node node, INodeDataProvider data, int indentSize = 4)
        {
            var converter = new NodeToStringConverter(indentSize, data);

            converter.Visit(node);

            return(converter.Builder.ToString());
        }
Esempio n. 4
0
        /// <summary>
        /// Builds a query plan.
        /// </summary>
        /// <param name="messages">
        /// The messages.
        /// </param>
        /// <param name="data">
        /// The data.
        /// </param>
        /// <param name="node">
        /// The script.
        /// </param>
        /// <returns>
        /// The <see cref="Task"/>.
        /// </returns>
        public static IQueryPlan Build(IMessageWriter messages, INodeDataProvider data, Node node)
        {
            var generator = new QueryPlanBuilder(messages, data);

            generator.Visit(node);

            return(data.GetQueryPlan(node));
        }
 /// <summary>
 /// The convert to data source.
 /// </summary>
 /// <param name="dataProvider">
 /// The data Provider.
 /// </param>
 /// <param name="expression">
 /// The expression.
 /// </param>
 /// <returns>
 /// The <see cref="Expression"/>.
 /// </returns>
 public static Expression ConvertToRows(this INodeDataProvider dataProvider, Expression expression)
 {
     return(Expression.Call(
                Evaluator.CreateDataSource(expression, null),
                typeof(DataSource).GetTypeInfo().GetDeclaredMethod(nameof(DataSource.GetRows)),
                Expression.Convert(CustomExpression.ExecutionContext(), typeof(IInternalExecutionContext)),
                Expression.Constant(new MultiPartQuery
     {
         WildcardAliases = new string[] { null },
     })));
 }
 /// <summary>
 /// Sets the scope connected to the node.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <param name="scope">
 /// The scope.
 /// </param>
 public static void SetScope([NotNull] this INodeDataProvider dataProvider, Node node, NodeScope scope)
 {
     dataProvider.Set(node, "Scope", scope);
 }
Esempio n. 7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="NodeToStringConverter"/> class.
 /// </summary>
 /// <param name="indentSize">
 /// The indent size.
 /// </param>
 /// <param name="data">
 /// The node data provider.
 /// </param>
 public NodeToStringConverter(int indentSize, [CanBeNull] INodeDataProvider data = null)
 {
     this.indentSize = indentSize;
     this.data       = data;
 }
 /// <summary>
 /// Checks if the node is a group function.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <returns>
 /// <c>true</c> if the node is a group function, <c>false</c> otherwise.
 /// </returns>
 public static bool IsGroupFunction([NotNull] this INodeDataProvider dataProvider, Node node)
 {
     return(dataProvider.TryGet(node, "IsGroupFunction", out object isGroupFunction) && (bool)isGroupFunction);
 }
 /// <summary>
 /// Gets the expression connected to the node.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <returns>
 /// The <see cref="Expression"/>.
 /// </returns>
 public static Expression GetExpression([NotNull] this INodeDataProvider dataProvider, SqlExpressionBase node)
 {
     return(dataProvider.Get <Expression>(node, "Expression"));
 }
 /// <summary>
 /// Gets the source factory .
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <returns>
 /// The source factory.
 /// </returns>
 public static Expression GetFactoryExpression([NotNull] this INodeDataProvider dataProvider, Node node)
 {
     return(dataProvider.Get <Expression>(node, "FactoryExpression"));
 }
 /// <summary>
 /// Gets the function connected to the node.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <returns>
 /// The function.
 /// </returns>
 public static IFunctionDescriptor GetFunction([NotNull] this INodeDataProvider dataProvider, Node node)
 {
     return(dataProvider.Get <IFunctionDescriptor>(node, "Function"));
 }
 public static string GetAlias([NotNull] this INodeDataProvider dataProvider, Node node)
 {
     return(dataProvider.TryGet(node, "Alias", out string result) ? result : null);
 }
Esempio n. 13
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GroupQueryVisitor"/> class.
 /// </summary>
 /// <param name="select">
 /// The select.
 /// </param>
 /// <param name="data">
 /// The data.
 /// </param>
 private GroupQueryVisitor(SelectFromStatement select, INodeDataProvider data)
 {
     this.data   = data;
     this.select = select;
 }
 public static ITypeDescriptor GetType(this INodeDataProvider dataProvider, [CanBeNull] Node node)
 {
     return(node != null && dataProvider.TryGet(node, "Type", out ITypeDescriptor result) ? result ?? new TypeDescriptor(typeof(object)) : new TypeDescriptor(typeof(object)));
 }
 /// <summary>
 /// Sets the function connected to the node.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <param name="function">
 /// The function.
 /// </param>
 public static void SetFunction([NotNull] this INodeDataProvider dataProvider, Node node, IFunctionDescriptor function)
 {
     dataProvider.Set(node, "Function", function);
 }
Esempio n. 16
0
 /// <summary>
 /// Initializes a new instance of the <see cref="QueryPlanBuilder"/> class.
 /// </summary>
 /// <param name="messages">
 /// The messages.
 /// </param>
 /// <param name="data">
 /// The data.
 /// </param>
 private QueryPlanBuilder(IMessageWriter messages, INodeDataProvider data)
 {
     this.messages = messages;
     this.data     = data;
 }
 /// <summary>
 /// Sets the expression that will replace a <see cref="FieldReferenceSqlExpression"/> in an ORDER BY clause.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="field">
 /// The field.
 /// </param>
 /// <param name="expression">
 /// The expression.
 /// </param>
 public static void SetFieldReplacer([NotNull] this INodeDataProvider dataProvider, FieldReferenceSqlExpression field, SqlExpressionBase expression)
 {
     dataProvider.Set(field, "FieldReplacer", expression);
 }
 /// <summary>
 /// Sets the source factory .
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <param name="factory">
 /// The factory.
 /// </param>
 public static void SetFactoryExpression([NotNull] this INodeDataProvider dataProvider, Node node, Expression factory)
 {
     dataProvider.Set(node, "FactoryExpression", factory);
 }
 /// <summary>
 /// Sets the expression connected to the node.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <param name="expression">
 /// The expression.
 /// </param>
 public static void SetExpression([NotNull] this INodeDataProvider dataProvider, SqlExpressionBase node, Expression expression)
 {
     dataProvider.Set(node, "Expression", expression);
 }
 /// <summary>
 /// Sets the alias connected to the node.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <param name="alias">
 /// The alias.
 /// </param>
 public static void SetAlias([NotNull] this INodeDataProvider dataProvider, Node node, string alias)
 {
     dataProvider.Set(node, "Alias", alias);
 }
 /// <summary>
 /// Marks the node as a group function.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 public static void MarkAsGroupFunction([NotNull] this INodeDataProvider dataProvider, Node node)
 {
     dataProvider.Set(node, "IsGroupFunction", true);
 }
Esempio n. 22
0
        public static IGroupQuery GetGroupQuery(SelectFromStatement select, INodeDataProvider data)
        {
            var visitor = new GroupQueryVisitor(select, data);

            return(new GroupQuery(visitor.Visit(select), visitor.Expressions, visitor.Groupings, visitor.Having, visitor.OrderBy));
        }
        /// <summary>
        ///     Converts the <paramref name="target" /> to a lambda returning a <see cref="DataTarget" />.
        /// </summary>
        /// <param name="dataProvider">
        ///     The data provider.
        /// </param>
        /// <param name="target">
        ///     The target to convert.
        /// </param>
        /// <param name="messages">
        ///     The messages.
        /// </param>
        /// <returns>
        ///     The <see cref="Expression" />.
        /// </returns>
        public static Expression ConvertToDataTarget(this INodeDataProvider dataProvider, TargetBase target, [CanBeNull] IMessageWriter messages = null)
        {
            new Evaluator(dataProvider, messages ?? new MessageWriter("null")).Visit(target);

            return(dataProvider.GetFactoryExpression(target));
        }
 /// <summary>
 /// Sets the type of the node.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <param name="type">
 /// The type.
 /// </param>
 public static void SetType([NotNull] this INodeDataProvider dataProvider, Node node, ITypeDescriptor type)
 {
     dataProvider.Set(node, "Type", type);
 }
 /// <summary>
 /// Gets the scope connected to the node.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <returns>
 /// The scope.
 /// </returns>
 public static NodeScope GetScope([NotNull] this INodeDataProvider dataProvider, Node node)
 {
     return(dataProvider.TryGet(node, "Scope", out NodeScope result) ? result : NodeScope.Initial);
 }
 /// <summary>
 ///     Initializes a new instance of the <see cref="Evaluator" /> class.
 /// </summary>
 /// <param name="data">
 ///     The data.
 /// </param>
 /// <param name="messages">
 ///     The message writer.
 /// </param>
 public Evaluator(INodeDataProvider data, IMessageWriter messages)
 {
     this.data     = data;
     this.messages = messages;
 }
 internal static IQueryPlan GetQueryPlan([NotNull] this INodeDataProvider dataProvider, Node node)
 {
     return(dataProvider.TryGet(node, "Query", out IQueryPlan result) ? result : null);
 }
 /// <summary>
 /// Sets the query connected to the node.
 /// </summary>
 /// <param name="dataProvider">
 /// The data provider.
 /// </param>
 /// <param name="node">
 /// The node.
 /// </param>
 /// <param name="query">
 /// The query.
 /// </param>
 internal static void SetQueryPlan([NotNull] this INodeDataProvider dataProvider, Node node, IQueryPlan query)
 {
     dataProvider.Set(node, "Query", query);
 }
 public static SqlExpressionBase GetFieldReplacer([NotNull] this INodeDataProvider dataProvider, FieldReferenceSqlExpression field)
 {
     return(dataProvider.TryGet(field, "FieldReplacer", out SqlExpressionBase result) ? result : null);
 }