/// <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))); }
/// <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()); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
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); }