예제 #1
0
 private static bool ContainsTable(ISqlTableSource table, IQueryElement sql)
 {
     return(null !=
            QueryVisitor.FindFirstOrDefault <IQueryExpression>(
                sql,
                e =>
                e == table ||
                e.ElementType == EQueryElementType.SqlField && table == ((ISqlField)e).Table ||
                e.ElementType == EQueryElementType.Column && table == ((IColumn)e).Parent));
 }
예제 #2
0
        private static bool CheckColumn(IColumn column, IQueryExpression expr, ISelectQuery query, bool optimizeValues,
                                        bool optimizeColumns)
        {
            if (expr is ISqlField || expr is IColumn || expr is ISqlParameter)
            {
                return(false);
            }

            var sqlValue = expr as ISqlValue;

            if (sqlValue != null)
            {
                return(!optimizeValues && 1.Equals(sqlValue.Value));
            }

            var sqlBinaryExpression = expr as ISqlBinaryExpression;

            if (sqlBinaryExpression != null)
            {
                var e = sqlBinaryExpression;

                var expr1 = e.Expr1 as ISqlValue;
                if (e.Operation == "*" && expr1 != null)
                {
                    if (expr1.Value is int && (int)expr1.Value == -1)
                    {
                        return(CheckColumn(column, e.Expr2, query, optimizeValues, optimizeColumns));
                    }
                }
            }

            if (optimizeColumns && QueryVisitor.FindFirstOrDefault <ISelectQuery>(expr, IsAggregationFunction) == null)
            {
                var q     = query.ParentSelect ?? query;
                var count = QueryVisitor.FindOnce <IColumn>(q).Count(e => e == column);

                return(count > 2);
            }

            return(true);
        }