public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action<Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var be = expression as BinaryExpression; return be != null && (CheckShortCircuitAnd(be, queryBuilder, visitExpression) || CheckShortCircuitOr(be, queryBuilder, visitExpression)); }
private static void ArrayAgg(MethodCallExpression methodCall, StringBuilder queryBuilder, Action<Expression> visitExpression, IPostgresConverterFactory converter) { queryBuilder.Append("(SELECT array_agg("); var sqe = methodCall.Arguments[0] as SubQueryExpression; var alias = "\"-sq-\""; if (sqe != null) { var me = sqe.QueryModel.SelectClause.Selector as MemberExpression; if (me != null) queryBuilder.Append("\"").Append(converter.GetName(me.Member)).Append("\""); else { visitExpression(sqe.QueryModel.SelectClause.Selector); alias = "\"" + sqe.QueryModel.MainFromClause.ItemName + "\""; } } else queryBuilder.Append(alias); queryBuilder.Append(") FROM "); if (methodCall.Arguments[0] is MemberExpression) queryBuilder.Append("unnest("); else queryBuilder.Append('('); visitExpression(methodCall.Arguments[0]); queryBuilder.Append(") "); queryBuilder.Append(alias); queryBuilder.Append(")"); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action<Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var mce = expression as MethodCallExpression; if (mce == null) return false; MethodCallDelegate mcd; if (SupportedMethods.TryGetValue(mce.Method, out mcd)) { mcd(mce, queryBuilder, visitExpression); return true; } return false; }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action<Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var mce = expression as MethodCallExpression; if (mce == null) return false; MethodCallDelegate mcd; var dt = mce.Method.DeclaringType; if (dt.IsGenericType && dt.GetGenericTypeDefinition() == typeof(HashSet<>) && SupportedMethods.TryGetValue(mce.Method.Name, out mcd)) { mcd(mce, queryBuilder, visitExpression); return true; } return false; }
public QueryExecutor( IDatabaseQuery databaseQuery, IServiceProvider locator, IPostgresConverterFactory factory, IExtensibilityProvider extensibilityProvider) { Contract.Requires(databaseQuery != null); Contract.Requires(locator != null); Contract.Requires(factory != null); Contract.Requires(extensibilityProvider != null); this.DatabaseQuery = databaseQuery; this.Locator = locator; this.ConverterFactory = factory; this.ExtensibilityProvider = extensibilityProvider; }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action<Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var mce = expression as MethodCallExpression; if (mce == null || mce.Method.ReturnType != typeof(bool)) return false; queryBuilder.Append(Function).Append('('); visitExpression(mce.Arguments[0]); foreach (var arg in mce.Arguments.Skip(1)) { queryBuilder.Append(','); visitExpression(arg); } queryBuilder.Append(')'); return true; }
public MainQueryParts( IServiceProvider locator, IPostgresConverterFactory factory, IEnumerable<IQuerySimplification> simplifications, IEnumerable<IExpressionMatcher> expressionMatchers, IEnumerable<IMemberMatcher> memberMatchers, IEnumerable<IProjectionMatcher> projectionMatchers) : base(locator, string.Empty, factory, simplifications, expressionMatchers, memberMatchers, projectionMatchers) { }
public MainQueryParts( IServiceLocator locator, IPostgresConverterFactory factory, IEnumerable <IQuerySimplification> simplifications, IEnumerable <IExpressionMatcher> expressionMatchers, IEnumerable <IMemberMatcher> memberMatchers, IEnumerable <IProjectionMatcher> projectionMatchers) : base( locator, string.Empty, factory, simplifications, expressionMatchers, memberMatchers, projectionMatchers) { }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action<Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var be = expression as BinaryExpression; if (be == null) return false; if (expression.NodeType == ExpressionType.Equal || expression.NodeType == ExpressionType.NotEqual) { var ceZero = be.Right as ConstantExpression ?? be.Left as ConstantExpression; var ceMethod = be.Left as MethodCallExpression ?? be.Right as MethodCallExpression; if (ceZero == null || ceMethod == null || !ceZero.Value.Equals(0) || !CompareMethods.Contains(ceMethod.Method)) return false; return CompareString(expression.NodeType == ExpressionType.Equal, ceMethod, queryBuilder, visitExpression); } return false; }
public MainQueryParts( IServiceProvider locator, IPostgresConverterFactory factory, IEnumerable <IQuerySimplification> simplifications, IEnumerable <IExpressionMatcher> expressionMatchers, IEnumerable <IMemberMatcher> memberMatchers, IEnumerable <IProjectionMatcher> projectionMatchers) : base( locator, QueryContext.Standard, factory, simplifications, expressionMatchers, memberMatchers, projectionMatchers) { }
protected QueryParts( IServiceLocator locator, string contextName, IPostgresConverterFactory converterFactory, IEnumerable <IQuerySimplification> simplifications, IEnumerable <IExpressionMatcher> expressionMatchers, IEnumerable <IMemberMatcher> memberMatchers, IEnumerable <IProjectionMatcher> projectionMatchers) { this.Locator = locator; this.ConverterFactory = converterFactory; this.Simplifications = new List <IQuerySimplification>(simplifications); this.ExpressionMatchers = expressionMatchers; this.MemberMatchers = memberMatchers; this.ProjectionMatchers = projectionMatchers; this.ContextName = contextName; }
protected QueryParts( IServiceLocator locator, string contextName, IPostgresConverterFactory converterFactory, IEnumerable<IQuerySimplification> simplifications, IEnumerable<IExpressionMatcher> expressionMatchers, IEnumerable<IMemberMatcher> memberMatchers, IEnumerable<IProjectionMatcher> projectionMatchers) { this.Locator = locator; this.ConverterFactory = converterFactory; this.Simplifications = new List<IQuerySimplification>(simplifications); this.ExpressionMatchers = expressionMatchers; this.MemberMatchers = memberMatchers; this.ProjectionMatchers = projectionMatchers; this.ContextName = contextName; }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action<Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var be = expression as BinaryExpression; if (be == null) return false; if (expression.NodeType == ExpressionType.Equal || expression.NodeType == ExpressionType.NotEqual) { var nullLeft = IsNullExpression(be.Left); var nullRight = IsNullExpression(be.Right); if (!nullLeft && nullRight) { if (expression.NodeType == ExpressionType.NotEqual) queryBuilder.Append(" (NOT "); visitExpression(be.Left); queryBuilder.Append(" IS NULL "); if (expression.NodeType == ExpressionType.NotEqual) queryBuilder.Append(")"); return true; } else if (nullLeft && !nullRight) { if (expression.NodeType == ExpressionType.NotEqual) queryBuilder.Append(" (NOT "); visitExpression(be.Right); queryBuilder.Append(" IS NULL "); if (expression.NodeType == ExpressionType.NotEqual) queryBuilder.Append(")"); return true; } else if (nullLeft && nullRight) { if (expression.NodeType == ExpressionType.Equal) queryBuilder.Append(" true "); else queryBuilder.Append(" false "); return true; } } return false; }
public static SqlCommandData GenerateSqlQuery( QueryModel queryModel, IServiceProvider locator, IPostgresConverterFactory factory, IExtensibilityProvider extensibilityProvider) { Contract.Requires(queryModel != null); Contract.Requires(locator != null); Contract.Requires(factory != null); Contract.Requires(extensibilityProvider != null); var visitor = new SqlGeneratorQueryModelVisitor( new MainQueryParts( locator, factory, extensibilityProvider.ResolvePlugins<IQuerySimplification>(), extensibilityProvider.ResolvePlugins<IExpressionMatcher>(), extensibilityProvider.ResolvePlugins<IMemberMatcher>(), extensibilityProvider.ResolvePlugins<IProjectionMatcher>())); visitor.VisitQueryModel(queryModel); return new SqlCommandData(visitor.QueryParts); }
public static SqlCommandData GenerateSqlQuery( QueryModel queryModel, IServiceLocator locator, IPostgresConverterFactory factory, IExtensibilityProvider extensibilityProvider) { Contract.Requires(queryModel != null); Contract.Requires(locator != null); Contract.Requires(factory != null); Contract.Requires(extensibilityProvider != null); var visitor = new SqlGeneratorQueryModelVisitor( new MainQueryParts( locator, factory, extensibilityProvider.ResolvePlugins <IQuerySimplification>(), extensibilityProvider.ResolvePlugins <IExpressionMatcher>(), extensibilityProvider.ResolvePlugins <IMemberMatcher>(), extensibilityProvider.ResolvePlugins <IProjectionMatcher>())); visitor.VisitQueryModel(queryModel); return(new SqlCommandData(visitor.QueryParts)); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action <Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var mce = expression as MethodCallExpression; if (mce == null) { return(false); } MethodCallDelegate mcd; if (SupportedMethods.TryGetValue(mce.Method, out mcd)) { if (mce.Arguments[0] is ConstantExpression == false) { return(false); } mcd(mce, queryBuilder, visitExpression); return(true); } return(false); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action<Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var be = expression as BinaryExpression; return be != null && ArrayIndex(be, queryBuilder, visitExpression); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action <Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var mce = expression as MethodCallExpression; if (mce == null || !mce.Method.IsGenericMethod) { return(false); } MethodCallDelegate mcd; if (SupportedMethods.TryGetValue(mce.Method.GetGenericMethodDefinition(), out mcd)) { mcd(mce, queryBuilder, visitExpression, converter); return(true); } return(false); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action <Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var mce = expression as MethodCallExpression; if (mce == null || mce.Method.ReturnType != typeof(bool)) { return(false); } queryBuilder.Append(Function).Append('('); visitExpression(mce.Arguments[0]); foreach (var arg in mce.Arguments.Skip(1)) { queryBuilder.Append(','); visitExpression(arg); } queryBuilder.Append(')'); return(true); }
private static void ArrayAgg(MethodCallExpression methodCall, StringBuilder queryBuilder, Action <Expression> visitExpression, IPostgresConverterFactory converter) { queryBuilder.Append("(SELECT array_agg("); var sqe = methodCall.Arguments[0] as SubQueryExpression; var alias = "\"-sq-\""; if (sqe != null) { var me = sqe.QueryModel.SelectClause.Selector as MemberExpression; if (me != null) { queryBuilder.Append("\"").Append(converter.GetName(me.Member)).Append("\""); } else { visitExpression(sqe.QueryModel.SelectClause.Selector); alias = "\"" + sqe.QueryModel.MainFromClause.ItemName + "\""; } } else { queryBuilder.Append(alias); } queryBuilder.Append(") FROM "); if (methodCall.Arguments[0] is MemberExpression) { queryBuilder.Append("unnest("); } else { queryBuilder.Append('('); } visitExpression(methodCall.Arguments[0]); queryBuilder.Append(") "); queryBuilder.Append(alias); queryBuilder.Append(")"); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action <Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var be = expression as BinaryExpression; if (be == null) { return(false); } if (expression.NodeType == ExpressionType.Equal || expression.NodeType == ExpressionType.NotEqual) { var ceZero = be.Right as ConstantExpression ?? be.Left as ConstantExpression; var ceMethod = be.Left as MethodCallExpression ?? be.Right as MethodCallExpression; if (ceZero == null || ceMethod == null || !ceZero.Value.Equals(0) || !CompareMethods.Contains(ceMethod.Method)) { return(false); } return(CompareString(expression.NodeType == ExpressionType.Equal, ceMethod, queryBuilder, visitExpression)); } var compareOperator = FindOperator(expression.NodeType); if (compareOperator != null) { var ceZero = be.Right as ConstantExpression ?? be.Left as ConstantExpression; var ceMethod = be.Left as MethodCallExpression ?? be.Right as MethodCallExpression; if (ceZero == null || ceMethod == null || !ceZero.Value.Equals(0) || !CompareMethods.Contains(ceMethod.Method)) { return(false); } return(CompareStringSimple(compareOperator, ceMethod, queryBuilder, visitExpression)); } return(false); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action <Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var be = expression as BinaryExpression; return(be != null && (CheckShortCircuitAnd(be, queryBuilder, visitExpression) || CheckShortCircuitOr(be, queryBuilder, visitExpression))); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action <Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var be = expression as BinaryExpression; return(be != null && ArrayIndex(be, queryBuilder, visitExpression)); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action <Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var mce = expression as MethodCallExpression; if (mce == null) { return(false); } MethodCallDelegate mcd; var dt = mce.Method.DeclaringType; if (dt.IsGenericType && dt.GetGenericTypeDefinition() == typeof(HashSet <>) && SupportedMethods.TryGetValue(mce.Method.Name, out mcd)) { mcd(mce, queryBuilder, visitExpression); return(true); } return(false); }
public bool TryMatch(Expression expression, StringBuilder queryBuilder, Action <Expression> visitExpression, QueryContext context, IPostgresConverterFactory converter) { var be = expression as BinaryExpression; if (be == null) { return(false); } if (expression.NodeType == ExpressionType.Equal || expression.NodeType == ExpressionType.NotEqual) { var nullLeft = IsNullExpression(be.Left); var nullRight = IsNullExpression(be.Right); if (!nullLeft && nullRight) { if (expression.NodeType == ExpressionType.NotEqual) { queryBuilder.Append(" (NOT "); } visitExpression(be.Left); queryBuilder.Append(" IS NULL "); if (expression.NodeType == ExpressionType.NotEqual) { queryBuilder.Append(")"); } return(true); } else if (nullLeft && !nullRight) { if (expression.NodeType == ExpressionType.NotEqual) { queryBuilder.Append(" (NOT "); } visitExpression(be.Right); queryBuilder.Append(" IS NULL "); if (expression.NodeType == ExpressionType.NotEqual) { queryBuilder.Append(")"); } return(true); } else if (nullLeft && nullRight) { if (expression.NodeType == ExpressionType.Equal) { queryBuilder.Append(" true "); } else { queryBuilder.Append(" false "); } return(true); } } return(false); }
private static void ArrayAgg(MethodCallExpression methodCall, StringBuilder queryBuilder, Action <Expression> visitExpression, IPostgresConverterFactory converter) { ArrayAggMethod(methodCall, queryBuilder, visitExpression, converter, false); }