예제 #1
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(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);
            }
        }
예제 #4
0
        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);
        }
예제 #6
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);
            }

            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);
        }