Exemplo n.º 1
0
 public FetchReturn(
     NonScalarReturn owner,
     string ownerProperty,
     string alias,
     LockMode lockMode)
     : base(alias, lockMode)
 {
     this.owner = owner;
     this.ownerProperty = ownerProperty;
 }
Exemplo n.º 2
0
 public EntityFetchReturn(
     String alias,
     IEntityAliases entityAliases,
     NonScalarReturn owner,
     String ownerProperty,
     LockMode lockMode)
     : base(owner, ownerProperty, alias, lockMode)
 {
     this.entityAliases = entityAliases;
 }
Exemplo n.º 3
0
 public CollectionFetchReturn(
     String alias,
     NonScalarReturn owner,
     String ownerProperty,
     ICollectionAliases collectionAliases,
     IEntityAliases elementEntityAliases,
     LockMode lockMode)
     : base(owner, ownerProperty, alias, lockMode)
 {
     this.collectionAliases = collectionAliases;
     this.elementEntityAliases = elementEntityAliases;
 }
Exemplo n.º 4
0
        private IQueryable DetermineAppropriateOwnerPersister(NonScalarReturn ownerDescriptor)
        {
            string     entityName = null;
            RootReturn odrr       = ownerDescriptor as RootReturn;

            if (odrr != null)
            {
                entityName = odrr.EntityName;
            }
            else if (ownerDescriptor is CollectionReturn)
            {
                CollectionReturn     collRtn   = (CollectionReturn)ownerDescriptor;
                string               role      = collRtn.OwnerEntityName + "." + collRtn.OwnerProperty;
                ICollectionPersister persister = Factory.GetCollectionPersister(role);
                EntityType           ownerType = (EntityType)persister.ElementType;
                entityName = ownerType.GetAssociatedEntityName(Factory);
            }
            else if (ownerDescriptor is FetchReturn)
            {
                FetchReturn fetchRtn  = (FetchReturn)ownerDescriptor;
                IQueryable  persister = DetermineAppropriateOwnerPersister(fetchRtn.Owner);
                IType       ownerType = persister.GetPropertyType(fetchRtn.OwnerProperty);
                if (ownerType.IsEntityType)
                {
                    entityName = ((EntityType)ownerType).GetAssociatedEntityName(Factory);
                }
                else if (ownerType.IsCollectionType)
                {
                    IType ownerCollectionElementType = ((CollectionType)ownerType).GetElementType(Factory);
                    if (ownerCollectionElementType.IsEntityType)
                    {
                        entityName = ((EntityType)ownerCollectionElementType).GetAssociatedEntityName(Factory);
                    }
                }
            }

            if (entityName == null)
            {
                throw new HibernateException("Could not determine fetch owner : " + ownerDescriptor);
            }

            return((IQueryable)Factory.GetEntityPersister(entityName));
        }
Exemplo n.º 5
0
		public NonScalarReturn(SQLQueryContext context, bool queryHasAliases, string alias, LockMode lockMode, NonScalarReturn owner)
		{
			if (context == null)
			{
				throw new ArgumentNullException("context");
			}
			if (string.IsNullOrEmpty(alias))
			{
				throw new HibernateException("alias must be specified");
			}

			this.alias = alias;
			this.lockMode = lockMode;
			this.owner = owner;

			this.collectionPersister = context.GetCollectionPersister(alias);
			if (this.collectionPersister != null)
			{
				var collectionPropertyResultMap = context.GetCollectionPropertyResultsMap(alias);
				this.collectionAliases = queryHasAliases
					? new GeneratedCollectionAliases(collectionPropertyResultMap, this.collectionPersister, context.GetCollectionSuffix(alias))
					: (ICollectionAliases)new ColumnCollectionAliases(collectionPropertyResultMap, this.collectionPersister);
			}

			if (this.collectionPersister == null || this.CollectionPersister.ElementType.IsEntityType)
			{
				this.entityPersister = context.GetEntityPersister(alias);
				if (this.entityPersister != null)
				{
					var entityPropertyResultMap = context.GetEntityPropertyResultsMap(alias);
					this.entityAliases = queryHasAliases
						? new DefaultEntityAliases(entityPropertyResultMap, this.entityPersister, context.GetEntitySuffix(alias))
						: new ColumnEntityAliases(entityPropertyResultMap, this.entityPersister);
				}
			}
		}
Exemplo n.º 6
0
        public CustomLoader(ICustomQuery customQuery, ISessionFactoryImplementor factory) : base(factory)
        {
            sql = customQuery.SQL;
            querySpaces.UnionWith(customQuery.QuerySpaces);
            parametersSpecifications = customQuery.CollectedParametersSpecifications.ToList();

            List <IQueryable>     entitypersisters = new List <IQueryable>();
            List <int>            entityowners     = new List <int>();
            List <IEntityAliases> entityaliases    = new List <IEntityAliases>();

            List <IQueryableCollection> collectionpersisters = new List <IQueryableCollection>();
            List <int> collectionowners = new List <int>();
            List <ICollectionAliases> collectionaliases = new List <ICollectionAliases>();

            List <LockMode> lockmodes = new List <LockMode>();
            List <IResultColumnProcessor> resultColumnProcessors = new List <IResultColumnProcessor>();
            List <IReturn> nonScalarReturnList = new List <IReturn>();
            List <IType>   resulttypes         = new List <IType>();
            List <string>  specifiedAliases    = new List <string>();

            List <bool> includeInResultRowList = new List <bool>();

            int  returnableCounter = 0;
            bool hasScalars        = false;

            foreach (IReturn rtn in customQuery.CustomQueryReturns)
            {
                if (rtn is ScalarReturn)
                {
                    ScalarReturn scalarRtn = (ScalarReturn)rtn;
                    resulttypes.Add(scalarRtn.Type);
                    specifiedAliases.Add(scalarRtn.ColumnAlias);
                    resultColumnProcessors.Add(new ScalarResultColumnProcessor(scalarRtn.ColumnAlias, scalarRtn.Type));
                    includeInResultRowList.Add(true);
                    hasScalars = true;
                }
                else if (rtn is RootReturn)
                {
                    RootReturn rootRtn   = (RootReturn)rtn;
                    IQueryable persister = (IQueryable)factory.GetEntityPersister(rootRtn.EntityName);
                    entitypersisters.Add(persister);
                    lockmodes.Add(rootRtn.LockMode);
                    resultColumnProcessors.Add(new NonScalarResultColumnProcessor(returnableCounter++));
                    nonScalarReturnList.Add(rtn);
                    entityowners.Add(-1);
                    resulttypes.Add(persister.Type);
                    specifiedAliases.Add(rootRtn.Alias);
                    entityaliases.Add(rootRtn.EntityAliases);
                    querySpaces.UnionWith(persister.QuerySpaces);
                    includeInResultRowList.Add(true);
                }
                else if (rtn is CollectionReturn)
                {
                    CollectionReturn     collRtn   = (CollectionReturn)rtn;
                    string               role      = collRtn.OwnerEntityName + "." + collRtn.OwnerProperty;
                    IQueryableCollection persister = (IQueryableCollection)factory.GetCollectionPersister(role);
                    collectionpersisters.Add(persister);
                    lockmodes.Add(collRtn.LockMode);
                    resultColumnProcessors.Add(new NonScalarResultColumnProcessor(returnableCounter++));
                    nonScalarReturnList.Add(rtn);
                    collectionowners.Add(-1);
                    resulttypes.Add(persister.Type);
                    specifiedAliases.Add(collRtn.Alias);
                    collectionaliases.Add(collRtn.CollectionAliases);
                    // determine if the collection elements are entities...
                    IType elementType = persister.ElementType;
                    if (elementType.IsEntityType)
                    {
                        IQueryable elementPersister = (IQueryable)((EntityType)elementType).GetAssociatedJoinable(factory);
                        entitypersisters.Add(elementPersister);
                        entityowners.Add(-1);
                        entityaliases.Add(collRtn.ElementEntityAliases);
                        querySpaces.UnionWith(elementPersister.QuerySpaces);
                    }
                    includeInResultRowList.Add(true);
                }
                else if (rtn is EntityFetchReturn)
                {
                    EntityFetchReturn fetchRtn        = (EntityFetchReturn)rtn;
                    NonScalarReturn   ownerDescriptor = fetchRtn.Owner;
                    int ownerIndex = nonScalarReturnList.IndexOf(ownerDescriptor);
                    entityowners.Add(ownerIndex);
                    lockmodes.Add(fetchRtn.LockMode);
                    IQueryable ownerPersister = DetermineAppropriateOwnerPersister(ownerDescriptor);
                    EntityType fetchedType    = (EntityType)ownerPersister.GetPropertyType(fetchRtn.OwnerProperty);
                    string     entityName     = fetchedType.GetAssociatedEntityName(Factory);
                    IQueryable persister      = (IQueryable)factory.GetEntityPersister(entityName);
                    entitypersisters.Add(persister);
                    nonScalarReturnList.Add(rtn);
                    specifiedAliases.Add(fetchRtn.Alias);
                    entityaliases.Add(fetchRtn.EntityAliases);
                    querySpaces.UnionWith(persister.QuerySpaces);
                    includeInResultRowList.Add(false);
                }
                else if (rtn is CollectionFetchReturn)
                {
                    CollectionFetchReturn fetchRtn        = (CollectionFetchReturn)rtn;
                    NonScalarReturn       ownerDescriptor = fetchRtn.Owner;
                    int ownerIndex = nonScalarReturnList.IndexOf(ownerDescriptor);
                    collectionowners.Add(ownerIndex);
                    lockmodes.Add(fetchRtn.LockMode);
                    IQueryable           ownerPersister = DetermineAppropriateOwnerPersister(ownerDescriptor);
                    string               role           = ownerPersister.EntityName + '.' + fetchRtn.OwnerProperty;
                    IQueryableCollection persister      = (IQueryableCollection)factory.GetCollectionPersister(role);
                    collectionpersisters.Add(persister);
                    nonScalarReturnList.Add(rtn);
                    specifiedAliases.Add(fetchRtn.Alias);
                    collectionaliases.Add(fetchRtn.CollectionAliases);
                    // determine if the collection elements are entities...
                    IType elementType = persister.ElementType;
                    if (elementType.IsEntityType)
                    {
                        IQueryable elementPersister = (IQueryable)((EntityType)elementType).GetAssociatedJoinable(factory);
                        entitypersisters.Add(elementPersister);
                        entityowners.Add(ownerIndex);
                        entityaliases.Add(fetchRtn.ElementEntityAliases);
                        querySpaces.UnionWith(elementPersister.QuerySpaces);
                    }
                    includeInResultRowList.Add(false);
                }
                else
                {
                    throw new HibernateException("unexpected custom query return type : " + rtn.GetType().FullName);
                }
            }

            entityPersisters     = entitypersisters.ToArray();
            entityOwners         = entityowners.ToArray();
            entityAliases        = entityaliases.ToArray();
            collectionPersisters = collectionpersisters.ToArray();
            collectionOwners     = collectionowners.ToArray();
            collectionAliases    = collectionaliases.ToArray();
            lockModes            = lockmodes.ToArray();
            resultTypes          = resulttypes.ToArray();
            transformerAliases   = specifiedAliases.ToArray();
            rowProcessor         = new ResultRowProcessor(hasScalars, resultColumnProcessors.ToArray());
            includeInResultRow   = includeInResultRowList.ToArray();
        }
Exemplo n.º 7
0
        private IQueryable DetermineAppropriateOwnerPersister(NonScalarReturn ownerDescriptor)
        {
            string entityName = null;
            if (ownerDescriptor is RootReturn)
            {
                entityName = ((RootReturn) ownerDescriptor).EntityName;
            }
            else if (ownerDescriptor is CollectionReturn)
            {
                CollectionReturn collRtn = (CollectionReturn) ownerDescriptor;
                string role = collRtn.OwnerEntityName + "." + collRtn.OwnerProperty;
                ICollectionPersister persister = Factory.GetCollectionPersister(role);
                EntityType ownerType = (EntityType) persister.ElementType;
                entityName = ownerType.GetAssociatedEntityName(Factory);
            }
            else if (ownerDescriptor is FetchReturn)
            {
                FetchReturn fetchRtn = (FetchReturn) ownerDescriptor;
                IQueryable persister = DetermineAppropriateOwnerPersister(fetchRtn.Owner);
                IType ownerType = persister.GetPropertyType(fetchRtn.OwnerProperty);
                if (ownerType.IsEntityType)
                {
                    entityName = ((EntityType)ownerType).GetAssociatedEntityName(Factory);
                }
                else if (ownerType.IsCollectionType)
                {
                    IType ownerCollectionElementType = ((CollectionType) ownerType).GetElementType(Factory);
                    if (ownerCollectionElementType.IsEntityType)
                    {
                        entityName = ((EntityType) ownerCollectionElementType).GetAssociatedEntityName(Factory);
                    }
                }
            }

            if (entityName == null)
            {
                throw new HibernateException("Could not determine fetch owner : " + ownerDescriptor);
            }

            return (IQueryable) Factory.GetEntityPersister(entityName);
        }