public CriteriaLoader(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl criteria)
            : base(persister, factory)
        {
            this.criteria = criteria;

            AddAllToPropertySpaces(persister.PropertySpaces);

            resultTypes    = new IType[1];
            resultTypes[0] = NHibernateUtil.Entity(persister.MappedClass);

            SqlStringBuilder condition = new SqlStringBuilder(10);

            bool foundCriterion = false;

            foreach (CriteriaImpl.CriterionEntry ee in criteria.IterateExpressionEntries())
            {
                if (foundCriterion)
                {
                    condition.Add(" and ");
                }

                SqlString sqlString = ee.Criterion.ToSqlString(
                    factory,
                    criteria.GetPersistentClass(ee.Alias),
                    ee.Alias,
                    criteria.AliasClasses);
                condition.Add(sqlString);

                foundCriterion = true;
            }

            if (!foundCriterion)
            {
                condition.Add("1=1");                   // TODO: fix this ugliness
            }

            StringBuilder orderBy    = new StringBuilder(30);
            bool          foundOrder = false;

            foreach (Order ord in criteria.IterateOrderings())
            {
                if (foundOrder)
                {
                    orderBy.Append(StringHelper.CommaSpace);
                }
                orderBy.Append(ord.ToSqlString(factory, criteria.CriteriaClass, Alias));
                foundOrder = true;
            }

            IList associations = WalkTree(persister, Alias, factory);

            InitClassPersisters(associations);
            InitStatementString(associations, condition.ToSqlString(), orderBy.ToString(), factory);

            PostInstantiate();
        }
		public CriteriaLoader( IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl criteria )
			: base( persister, factory )
		{
			this.criteria = criteria;

			AddAllToPropertySpaces( persister.PropertySpaces );

			resultTypes = new IType[ 1 ];
			resultTypes[ 0 ] = NHibernateUtil.Entity( persister.MappedClass );

			SqlStringBuilder condition = new SqlStringBuilder( 10 );

			bool foundCriterion = false;

			foreach( CriteriaImpl.CriterionEntry ee in criteria.IterateExpressionEntries() )
			{
				if( foundCriterion )
				{
					condition.Add( " and " );
				}

				SqlString sqlString = ee.Criterion.ToSqlString(
					factory,
					criteria.GetPersistentClass( ee.Alias ),
					ee.Alias,
					criteria.AliasClasses );
				condition.Add( sqlString );

				foundCriterion = true;
			}

			if( !foundCriterion )
			{
				condition.Add( "1=1" ); // TODO: fix this ugliness
			}

			StringBuilder orderBy = new StringBuilder( 30 );
			bool foundOrder = false;

			foreach( Order ord in criteria.IterateOrderings() )
			{
				if( foundOrder )
				{
					orderBy.Append( StringHelper.CommaSpace );
				}
				orderBy.Append( ord.ToSqlString( factory, criteria.CriteriaClass, Alias ) );
				foundOrder = true;
			}

			IList associations = WalkTree( persister, Alias, factory );
			InitClassPersisters( associations );
			InitStatementString( associations, condition.ToSqlString(), orderBy.ToString(), factory );

			PostInstantiate();
		}
        public SqlString GetOrderBy()
        {
            SqlStringBuilder orderBy = new SqlStringBuilder(30);

            bool first = true;

            foreach (CriteriaImpl.OrderEntry oe in rootCriteria.IterateOrderings())
            {
                if (!first)
                {
                    orderBy.Add(StringHelper.CommaSpace);
                }
                first = false;
                orderBy.Add(oe.Order.ToSqlString(oe.Criteria, this));
            }
            return(orderBy.ToSqlString());
        }
Example #4
0
        private static void CloneSubcriteriaAndOrders(CriteriaImpl clone, CriteriaImpl original)
        {
            //we need to preserve the parent criteria, we rely on the orderring when creating the
            //subcriterias initially here, so we don't need to make more than a single pass
            Hashtable newParents = new Hashtable();
            newParents[original] = clone;

            foreach (CriteriaImpl.Subcriteria subcriteria in original.IterateSubcriteria())
            {
                ICriteria currentParent = (ICriteria)newParents[subcriteria.Parent];
                if (currentParent == null)
                {
                    throw new AssertionFailure(
                        "Could not find parent for subcriteria in the previous subcriteria. If you see this error, it is a bug");
                }
                CriteriaImpl.Subcriteria clonedSubCriteria =
                    new CriteriaImpl.Subcriteria(clone, currentParent, subcriteria.Path, subcriteria.Alias, subcriteria.JoinType);
                clonedSubCriteria.SetLockMode(subcriteria.LockMode);
                newParents[subcriteria] = clonedSubCriteria;
            }

            // remap the orders
            foreach (CriteriaImpl.OrderEntry orderEntry in original.IterateOrderings())
            {
                ICriteria currentParent = (ICriteria)newParents[orderEntry.Criteria];
                if (currentParent == null)
                {
                    throw new AssertionFailure(
                        "Could not find parent for order in the previous criteria. If you see this error, it is a bug");
                }
                currentParent.AddOrder(orderEntry.Order);
            }

            // remap the restrictions to appropriate criterias
            foreach (CriteriaImpl.CriterionEntry criterionEntry in original.Restrictions)
            {
                ICriteria currentParent = (ICriteria) newParents[criterionEntry.Criteria];
                if (currentParent == null)
                {
                    throw new AssertionFailure(
                        "Could not find parent for restriction in the previous criteria. If you see this error, it is a bug.");
                }

                currentParent.Add(criterionEntry.Criterion);
            }
        }
Example #5
0
        private static ICriteria ToShardedCriteria(CriteriaImpl other, IShardedSessionImplementor shardedSession)
        {
            Preconditions.CheckNotNull(other);
            Preconditions.CheckNotNull(shardedSession);

            var entityName = other.EntityOrClassName;
            var alias      = other.Alias;

            ICriteria CriteriaFactory(ISession s) =>
            alias != null
                                        ? s.CreateCriteria(entityName, alias)
                                        : s.CreateCriteria(entityName);

            var result = new ShardedCriteriaImpl(shardedSession, other.EntityOrClassName, CriteriaFactory);

            foreach (var entry in other.IterateSubcriteria())
            {
                result.CreateCriteria(entry.Path, entry.Alias, entry.JoinType, entry.WithClause);
            }
            foreach (var entry in other.IterateExpressionEntries())
            {
                result.Add(entry.Criterion);
            }
            foreach (var entry in other.LockModes)
            {
                result.SetLockMode(entry.Key, entry.Value);
            }
            foreach (var entry in other.IterateOrderings())
            {
                result.AddOrder(entry.Order);
            }

            if (other.Cacheable)
            {
                result.SetCacheable(true);
                if (other.CacheMode != null)
                {
                    result.SetCacheMode(other.CacheMode.Value);
                }
                if (other.CacheRegion != null)
                {
                    result.SetCacheRegion(other.CacheRegion);
                }
            }

            if (other.Comment != null)
            {
                result.SetComment(other.Comment);
            }
            if (other.FetchSize > 0)
            {
                result.SetFetchSize(other.FetchSize);
            }
            if (other.FirstResult > 0)
            {
                result.SetFirstResult(other.FirstResult);
            }
            if (other.MaxResults > 0)
            {
                result.SetMaxResults(other.MaxResults);
            }
            if (other.Projection != null)
            {
                result.SetProjection(other.Projection);
            }
            if (other.ResultTransformer != null)
            {
                result.SetResultTransformer(other.ResultTransformer);
            }
            if (other.Timeout > 0)
            {
                result.SetTimeout(other.Timeout);
            }
            if (other.IsReadOnlyInitialized)
            {
                result.SetReadOnly(other.IsReadOnly);
            }

            return(result);
        }
Example #6
0
        public QueryParameters GetQueryParameters()
        {
            RowSelection selection = new RowSelection();

            selection.FirstRow  = rootCriteria.FirstResult;
            selection.MaxRows   = rootCriteria.MaxResults;
            selection.Timeout   = rootCriteria.Timeout;
            selection.FetchSize = rootCriteria.FetchSize;

            Dictionary <string, LockMode> lockModes = new Dictionary <string, LockMode>();

            foreach (KeyValuePair <string, LockMode> me in rootCriteria.LockModes)
            {
                ICriteria subcriteria = GetAliasedCriteria(me.Key);
                lockModes[GetSQLAlias(subcriteria)] = me.Value;
            }

            List <TypedValue> typedValues = new List <TypedValue>();

            // NH-specific: Get parameters for projections first
            if (this.HasProjection)
            {
                typedValues.AddRange(rootCriteria.Projection.GetTypedValues(rootCriteria, this));
            }

            foreach (CriteriaImpl.Subcriteria subcriteria in rootCriteria.IterateSubcriteria())
            {
                LockMode lm = subcriteria.LockMode;
                if (lm != null)
                {
                    lockModes[GetSQLAlias(subcriteria)] = lm;
                }
                // Get parameters that may be used in JOINs
                if (subcriteria.WithClause != null)
                {
                    typedValues.AddRange(subcriteria.WithClause.GetTypedValues(subcriteria, this));
                }
            }

            List <TypedValue> groupedTypedValues = new List <TypedValue>();

            // Type and value gathering for the WHERE clause needs to come AFTER lock mode gathering,
            // because the lock mode gathering loop now contains join clauses which can contain
            // parameter bindings (as in the HQL WITH clause).
            foreach (CriteriaImpl.CriterionEntry ce in rootCriteria.IterateExpressionEntries())
            {
                bool          criteriaContainsGroupedProjections = false;
                IProjection[] projections = ce.Criterion.GetProjections();

                if (projections != null)
                {
                    foreach (IProjection projection in projections)
                    {
                        if (projection.IsGrouped)
                        {
                            criteriaContainsGroupedProjections = true;
                            break;
                        }
                    }
                }

                if (criteriaContainsGroupedProjections)
                {
                    // GROUP BY/HAVING parameters need to be added after WHERE parameters - so don't add them
                    // to typedValues yet
                    groupedTypedValues.AddRange(ce.Criterion.GetTypedValues(ce.Criteria, this));
                }
                else
                {
                    typedValues.AddRange(ce.Criterion.GetTypedValues(ce.Criteria, this));
                }
            }

            // NH-specific: GROUP BY/HAVING parameters need to appear after WHERE parameters
            if (groupedTypedValues.Count > 0)
            {
                typedValues.AddRange(groupedTypedValues);
            }

            // NH-specific: To support expressions/projections used in ORDER BY
            foreach (CriteriaImpl.OrderEntry oe in rootCriteria.IterateOrderings())
            {
                typedValues.AddRange(oe.Order.GetTypedValues(oe.Criteria, this));
            }

            return
                (new QueryParameters(
                     typedValues.Select(tv => tv.Type).ToArray(),
                     typedValues.Select(tv => tv.Value).ToArray(),
                     lockModes,
                     selection,
                     rootCriteria.IsReadOnlyInitialized,
                     rootCriteria.IsReadOnlyInitialized ? rootCriteria.IsReadOnly : false,
                     rootCriteria.Cacheable,
                     rootCriteria.CacheRegion,
                     rootCriteria.Comment,
                     rootCriteria.LookupByNaturalKey,
                     rootCriteria.ResultTransformer,
                     _tempPagingParameterIndexes));
        }