コード例 #1
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="q"></param>
		/// <returns></returns>
		public string AddFromCollection( QueryTranslator q )
		{
			IType collectionElementType = PropertyType;

			if( collectionElementType == null )
			{
				throw new QueryException( string.Format( "must specify 'elements' for collection valued property in from clause: {0}", path ) );
			}
			if( collectionElementType.IsEntityType )
			{
				// an association
				IQueryableCollection collectionPersister = q.GetCollectionPersister( collectionRole );
				IQueryable entityPersister = (IQueryable) collectionPersister.ElementPersister;
				System.Type clazz = entityPersister.MappedClass;

				string[] collectionElementColumns = CurrentColumns();

				string elementName;
				if ( collectionPersister.IsOneToMany )
				{
					elementName = collectionName;
					// allow index() function
					q.DecoratePropertyMapping( elementName, collectionPersister );
				}
				else
				{
					// many to many
					q.AddCollection( collectionName, collectionRole );
					elementName = q.CreateNameFor( clazz );
					string[] keyColumnNames = entityPersister.IdentifierColumnNames;
					join.AddJoin( entityPersister.TableName, elementName, collectionElementColumns, keyColumnNames, joinType );
				}
				q.AddFrom( elementName, clazz, join );
				currentPropertyMapping = new CollectionPropertyMapping( collectionPersister );
				return elementName;
			}
			else
			{
				// collection of values
				q.AddFromCollection( collectionName, collectionRole, join );
				return collectionName;
			}
		}
コード例 #2
0
		private void DereferenceCollection(String propertyName, String role, QueryTranslator q)
		{
			collectionRole = role;
			IQueryableCollection collPersister = q.GetCollectionPersister( role );
			string[] colNames = collPersister.KeyColumnNames;
			string name = q.CreateNameForCollection(role);
			AddJoin( collPersister.TableName, name, colNames );

			if ( collPersister.HasWhere ) 
			{
				join.AddCondition( collPersister.GetSQLWhereString( name ) );
			}
			collectionName = name;
			collectionOwnerName = currentName;
			currentName = name;
			currentProperty = propertyName;
			componentPath = null;
			//componentPath = new StringBuilder();
			currentPropertyMapping = new CollectionPropertyMapping( collPersister );
		}
コード例 #3
0
		private void PrepareForIndex( QueryTranslator q )
		{
			IQueryableCollection collPersister = q.GetCollectionPersister( collectionRole );

			if( !collPersister.HasIndex )
			{
				throw new QueryException( "unindexed collection before []" );
			}
			string[ ] indexCols = collPersister.IndexColumnNames;
			if( indexCols.Length != 1 )
			{
				throw new QueryException( "composite-index appears in []: " + path );
			}
			string[ ] keyCols = collPersister.KeyColumnNames;

			JoinFragment ojf = q.CreateJoinFragment( useThetaStyleJoin );
			ojf.AddCrossJoin( collPersister.TableName, collectionName );
			ojf.AddFromFragmentString( join.ToFromFragmentString );
			if( collPersister.IsOneToMany )
			{
				IQueryable persister = (IQueryable) collPersister.ElementPersister;
				ojf.AddJoins(
					( (IJoinable) persister).FromJoinFragment( collectionName, true, false ),
					( (IJoinable) persister).WhereJoinFragment( collectionName, true, false )
					);
			}

			if( !continuation )
			{
				AddJoin( collPersister.TableName, collectionName, keyCols );
			}
			join.AddCondition( collectionName, indexCols, " = " );

			string[ ] eltCols = collPersister.ElementColumnNames;

			CollectionElement elem = new CollectionElement();
			elem.ElementColumns = StringHelper.Qualify( collectionName, eltCols );
			elem.Type = collPersister.ElementType;
			elem.IsOneToMany = collPersister.IsOneToMany;
			elem.Alias = collectionName;
			elem.Join = join;
			collectionElements.Add( elem ); //addlast
			SetExpectingCollectionIndex();

			q.AddCollection( collectionName, collectionRole );
			q.AddJoin( collectionName, ojf );
		}
コード例 #4
0
		private void DoPathExpression( string token, QueryTranslator q )
		{
			Preprocess( token, q );

			StringTokenizer tokens = new StringTokenizer( token, ".", true );
			pathExpressionParser.Start( q );
			foreach( string tok in tokens )
			{
				pathExpressionParser.Token( tok, q );
			}
			pathExpressionParser.End( q );

			if( pathExpressionParser.IsCollectionValued )
			{
				OpenExpression( q, string.Empty );
				AppendToken( q, pathExpressionParser.GetCollectionSubquery() );
				CloseExpression( q, string.Empty );
				// this is ugly here, but needed because its a subquery
				q.AddQuerySpace( q.GetCollectionPersister( pathExpressionParser.CollectionRole ).CollectionSpace );
			}
			else
			{
				if( pathExpressionParser.IsExpectingCollectionIndex )
				{
					expectingIndex++;
				}
				else
				{
					AddJoin( pathExpressionParser.WhereJoin, q );
					AppendToken( q, pathExpressionParser.WhereColumn );
				}
			}
		}