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(q.EnabledFilters)); CloseExpression(q, string.Empty); // this is ugly here, but needed because its a subquery q.AddQuerySpaces(q.GetCollectionPersister(pathExpressionParser.CollectionRole).CollectionSpaces); } else { if (pathExpressionParser.IsExpectingCollectionIndex) { expectingIndex++; } else { AddJoin(pathExpressionParser.WhereJoin, q); AppendToken(q, pathExpressionParser.WhereColumn); } } }
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); }
/// <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); } }
private void DereferenceCollection(String propertyName, String role, QueryTranslator q) { collectionRole = role; IQueryableCollection collPersister = q.GetCollectionPersister(role); string name = q.CreateNameForCollection(role); AddJoin(name, collPersister.CollectionType); //if ( collPersister.HasWhere ) //{ // join.AddCondition( collPersister.GetSQLWhereString( name ) ); //} collectionName = name; collectionOwnerName = currentName; currentName = name; currentProperty = propertyName; componentPath.Length = 0; //componentPath = new StringBuilder(); currentPropertyMapping = new CollectionPropertyMapping(collPersister); }
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); }
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); } JoinSequence fromJoins = new JoinSequence(q.Factory) .SetUseThetaStyle(useThetaStyleJoin) .SetRoot(collPersister, collectionName) .SetNext(joinSequence.Copy()); if (!continuation) { AddJoin(collectionName, collPersister.CollectionType); } joinSequence.AddCondition(new SqlString(collectionName + '.' + indexCols[0] + " = ")); CollectionElement elem = new CollectionElement(); elem.ElementColumns = collPersister.GetElementColumnNames(collectionName); elem.Type = collPersister.ElementType; elem.IsOneToMany = collPersister.IsOneToMany; elem.Alias = collectionName; elem.JoinSequence = joinSequence; collectionElements.Add(elem); //addlast SetExpectingCollectionIndex(); q.AddCollection(collectionName, collectionRole); q.AddJoin(collectionName, fromJoins); }