Beispiel #1
0
        public static string GenerateSQL(ICriteria criteria)
        {
            var criteriaImpl = (CriteriaImpl)criteria;
            ISessionImplementor        session = criteriaImpl.Session;
            ISessionFactoryImplementor factory = session.Factory;

            var translator =
                new CriteriaQueryTranslator(
                    factory,
                    criteriaImpl,
                    criteriaImpl.EntityOrClassName,
                    CriteriaQueryTranslator.RootSqlAlias);

            String[] implementors = factory.GetImplementors(criteriaImpl.EntityOrClassName);

            var walker = new CriteriaJoinWalker(
                (IOuterJoinLoadable)factory.GetEntityPersister(implementors[0]),
                translator,
                factory,
                criteriaImpl,
                criteriaImpl.EntityOrClassName,
                session.EnabledFilters);

            return(walker.SqlString.ToString());
        }
        public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary <string, IFilter> enabledFilters)
        {
            ISessionFactoryImplementor factory = criteriaQuery.Factory;

            var innerQuery = new CriteriaQueryTranslator(
                factory,
                criteriaImpl,                 //implicit polymorphism not supported (would need a union)
                criteriaImpl.EntityOrClassName,
                criteriaQuery.GenerateSQLAlias(),
                criteriaQuery);

            types = innerQuery.HasProjection ? innerQuery.ProjectedTypes : null;

            if (innerQuery.HasProjection == false)
            {
                throw new QueryException("Cannot use subqueries on a criteria without a projection.");
            }

            IOuterJoinLoadable persister = (IOuterJoinLoadable)factory.GetEntityPersister(criteriaImpl.EntityOrClassName);

            //patch to generate joins on subqueries
            //stolen from CriteriaLoader
            CriteriaJoinWalker walker =
                new CriteriaJoinWalker(persister, innerQuery, factory, criteriaImpl, criteriaImpl.EntityOrClassName, enabledFilters);

            parameters = innerQuery.GetQueryParameters();             // parameters can be inferred only after initialize the walker

            SqlString sql = walker.SqlString;

            if (criteriaImpl.FirstResult != 0 || criteriaImpl.MaxResults != RowSelection.NoValue)
            {
                int?      offset          = Loader.Loader.GetOffsetUsingDialect(parameters.RowSelection, factory.Dialect);
                int?      limit           = Loader.Loader.GetLimitUsingDialect(parameters.RowSelection, factory.Dialect);
                Parameter offsetParameter = offset.HasValue ? innerQuery.CreateSkipParameter(offset.Value) : null;
                Parameter limitParameter  = limit.HasValue ? innerQuery.CreateTakeParameter(limit.Value) : null;
                sql = factory.Dialect.GetLimitString(sql, offset, limit, offsetParameter, limitParameter);
            }

            SqlStringBuilder buf = new SqlStringBuilder().Add(ToLeftSqlString(criteria, criteriaQuery));

            if (op != null)
            {
                buf.Add(" ").Add(op).Add(" ");
            }

            if (quantifier != null && prefixOp)
            {
                buf.Add(quantifier).Add(" ");
            }

            buf.Add("(").Add(sql).Add(")");

            if (quantifier != null && prefixOp == false)
            {
                buf.Add(" ").Add(quantifier);
            }

            return(buf.ToSqlString());
        }
Beispiel #3
0
        public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary <string, IFilter> enabledFilters)
        {
            InitializeInnerQueryAndParameters(criteriaQuery);

            if (innerQuery.HasProjection == false)
            {
                throw new QueryException("Cannot use subqueries on a criteria without a projection.");
            }

            ISessionFactoryImplementor factory = criteriaQuery.Factory;

            IOuterJoinLoadable persister = (IOuterJoinLoadable)factory.GetEntityPersister(criteriaImpl.EntityOrClassName);

            //patch to generate joins on subqueries
            //stolen from CriteriaLoader
            CriteriaJoinWalker walker =
                new CriteriaJoinWalker(persister, innerQuery, factory, criteriaImpl, criteriaImpl.EntityOrClassName, enabledFilters);

            parameters = innerQuery.GetQueryParameters();             // parameters can be inferred only after initialize the walker

            SqlString sql = walker.SqlString;

            if (criteriaImpl.FirstResult != 0 || criteriaImpl.MaxResults != RowSelection.NoValue)
            {
                int?      offset          = Loader.Loader.GetOffsetUsingDialect(parameters.RowSelection, factory.Dialect);
                int?      limit           = Loader.Loader.GetLimitUsingDialect(parameters.RowSelection, factory.Dialect);
                Parameter offsetParameter = offset.HasValue ? innerQuery.CreateSkipParameter(offset.Value) : null;
                Parameter limitParameter  = limit.HasValue ? innerQuery.CreateTakeParameter(limit.Value) : null;
                sql = factory.Dialect.GetLimitString(sql, offset, limit, offsetParameter, limitParameter);
            }

            // during CriteriaImpl.Clone we are doing a shallow copy of each criterion.
            // this is not a problem for common criterion but not for SubqueryExpression because here we are holding the state of inner CriteriaTraslator (ICriteriaQuery).
            // After execution (ToSqlString) we have to clean the internal state because the next execution may be performed in a different tree reusing the same istance of SubqueryExpression.
            innerQuery = null;

            SqlStringBuilder buf = new SqlStringBuilder().Add(ToLeftSqlString(criteria, criteriaQuery));

            if (op != null)
            {
                buf.Add(" ").Add(op).Add(" ");
            }

            if (quantifier != null && prefixOp)
            {
                buf.Add(quantifier).Add(" ");
            }

            buf.Add("(").Add(sql).Add(")");

            if (quantifier != null && prefixOp == false)
            {
                buf.Add(" ").Add(quantifier);
            }

            return(buf.ToSqlString());
        }
        public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary <string, IFilter> enabledFilters)
        {
            InitializeInnerQueryAndParameters(criteriaQuery);

            if (innerQuery.HasProjection == false)
            {
                throw new QueryException("Cannot use subqueries on a criteria without a projection.");
            }

            ISessionFactoryImplementor factory = criteriaQuery.Factory;

            IOuterJoinLoadable persister = (IOuterJoinLoadable)factory.GetEntityPersister(criteriaImpl.EntityOrClassName);

            //buffer needs to be before CriteriaJoinWalker for sake of parameter order
            SqlStringBuilder buf = new SqlStringBuilder().Add(ToLeftSqlString(criteria, criteriaQuery));

            //patch to generate joins on subqueries
            //stolen from CriteriaLoader
            CriteriaJoinWalker walker =
                new CriteriaJoinWalker(persister, innerQuery, factory, criteriaImpl, criteriaImpl.EntityOrClassName, enabledFilters);

            SqlString sql = walker.SqlString;

            if (criteriaImpl.FirstResult != 0 || criteriaImpl.MaxResults != RowSelection.NoValue)
            {
                int firstResults         = Loader.Loader.GetFirstRow(parameters.RowSelection);
                int maxResults           = Loader.Loader.GetMaxOrLimit(factory.Dialect, parameters.RowSelection);
                int?offsetParameterIndex = criteriaQuery.CreatePagingParameter(firstResults);
                int?limitParameterIndex  = criteriaQuery.CreatePagingParameter(maxResults);
                sql = factory.Dialect.GetLimitString(sql, firstResults, maxResults, offsetParameterIndex, limitParameterIndex);
            }

            if (op != null)
            {
                buf.Add(" ").Add(op).Add(" ");
            }

            if (quantifier != null && prefixOp)
            {
                buf.Add(quantifier).Add(" ");
            }

            buf.Add("(").Add(sql).Add(")");

            if (quantifier != null && prefixOp == false)
            {
                buf.Add(" ").Add(quantifier);
            }

            return(buf.ToSqlString());
        }
Beispiel #5
0
        public static SqlString GenerateSql(
            this ICriteria criteria,
            ISession session = null,
            CriteriaQueryTranslator translator = null)
        {
            criteria.ThrowIfNull("this");

            var criteriaImpl = (CriteriaImpl)criteria;

            var sessionImplementor = criteriaImpl.Session;

            if (sessionImplementor == null && session != null)
            {
                sessionImplementor = session.GetSessionImplementation();
            }
            if (sessionImplementor == null)
            {
                throw new InvalidOperationException("Criteria is detached from session and no session was specified");
            }
            var sessionImpl = (SessionImpl)sessionImplementor;

            var factory      = (SessionFactoryImpl)sessionImpl.SessionFactory;
            var implementors = factory.GetImplementors(criteriaImpl.EntityOrClassName);

            if (translator == null)
            {
                translator = new CriteriaQueryTranslator(
                    factory,
                    criteriaImpl,
                    criteriaImpl.EntityOrClassName,
                    CriteriaQueryTranslator.RootSqlAlias);
            }

            CriteriaJoinWalker walker = new CriteriaJoinWalker((IOuterJoinLoadable)factory.GetEntityPersister(implementors[0]),
                                                               translator, factory, criteriaImpl, criteriaImpl.EntityOrClassName, sessionImpl.EnabledFilters);

            return(walker.SqlString);
        }