/// <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; string clazz = entityPersister.EntityName; 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); AddJoin(elementName, (IAssociationType) collectionElementType); } q.AddFrom(elementName, clazz, joinSequence); currentPropertyMapping = new CollectionPropertyMapping(collectionPersister); return elementName; } // collection of values q.AddFromCollection(collectionName, collectionRole, joinSequence); 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 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); }
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); } } }