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));
 }
Example #2
0
 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(")");
 }
Example #3
0
        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;
        }
Example #4
0
        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;
        }
Example #5
0
        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;
        }
Example #7
0
        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)
        {
        }
Example #8
0
 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)
 {
 }
Example #9
0
        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;
        }
Example #10
0
 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)
 {
 }
Example #11
0
 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;
 }
Example #12
0
 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);
		}
Example #15
0
        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));
        }
Example #16
0
        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);
        }
Example #17
0
 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);
 }
Example #18
0
        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);
        }
Example #19
0
        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);
        }
Example #20
0
        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(")");
        }
Example #21
0
        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);
        }
Example #22
0
        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)));
        }
Example #23
0
        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));
        }
Example #24
0
        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);
        }
Example #25
0
        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);
        }
Example #26
0
 private static void ArrayAgg(MethodCallExpression methodCall, StringBuilder queryBuilder, Action <Expression> visitExpression, IPostgresConverterFactory converter)
 {
     ArrayAggMethod(methodCall, queryBuilder, visitExpression, converter, false);
 }