/// <summary> /// /// </summary> /// <param name="token"></param> /// <param name="q"></param> public void Token(string token, QueryTranslator q) { string lctoken = token.ToLower(System.Globalization.CultureInfo.InvariantCulture); if (first) { first = false; if (lctoken.Equals("distinct")) { q.Distinct = true; return; } else if (lctoken.Equals("all")) { q.Distinct = false; return; } } if (afterNew) { afterNew = false; holderClass = q.GetImportedClass(token); if (holderClass == null) { throw new QueryException("class not found: " + token); } q.HolderClass = holderClass; insideNew = true; } else if (token.Equals(StringHelper.Comma)) { if (ready) { throw new QueryException("alias or expression expected in SELECT"); } q.AppendScalarSelectToken(StringHelper.CommaSpace); ready = true; } else if ("new".Equals(lctoken)) { afterNew = true; ready = false; } else if (StringHelper.OpenParen.Equals(token)) { if (!aggregate && holderClass != null && !ready) { //opening paren in new Foo ( ... ) ready = true; } else if (aggregate) { q.AppendScalarSelectToken(token); } else { throw new QueryException("aggregate function expected before ( in SELECT"); } ready = true; } else if (StringHelper.ClosedParen.Equals(token)) { if (insideNew && !aggregate && !ready) { //if we are inside a new Result(), but not inside a nested function insideNew = false; } else if (aggregate && ready) { q.AppendScalarSelectToken(token); aggregateFuncTokenList.RemoveAt(0); if (aggregateFuncTokenList.Count < 1) { aggregate = false; ready = false; } } else { throw new QueryException("( expected before ) in select"); } } else if (countArguments.Contains(lctoken)) { if (!ready || !aggregate) { throw new QueryException(token + " only allowed inside aggregate function in SELECT"); } q.AppendScalarSelectToken(token); if ("*".Equals(token)) { q.AddSelectScalar(NHibernateUtil.Int32); } //special case } else if (GetFunction(lctoken, q) != null && token == q.Unalias(token)) { // the name of an SQL function if (!ready) { throw new QueryException(", expected before aggregate function in SELECT: " + token); } aggregate = true; aggregateAddSelectScalar = true; aggregateFuncTokenList.Insert(0, lctoken); ready = false; q.AppendScalarSelectToken(token); if (!AggregateHasArgs(lctoken, q)) { q.AddSelectScalar(AggregateType(aggregateFuncTokenList, null, q)); if (!AggregateFuncNoArgsHasParenthesis(lctoken, q)) { aggregateFuncTokenList.RemoveAt(0); if (aggregateFuncTokenList.Count < 1) { aggregate = false; ready = false; } else { ready = true; } } } } else if (aggregate) { bool constantToken = false; if (!ready) { throw new QueryException("( expected after aggregate function in SELECT"); } try { ParserHelper.Parse(aggregatePathExpressionParser, q.Unalias(token), ParserHelper.PathSeparators, q); } catch (QueryException) { constantToken = true; } if (constantToken) { q.AppendScalarSelectToken(token); } else { if (aggregatePathExpressionParser.IsCollectionValued) { q.AddCollection( aggregatePathExpressionParser.CollectionName, aggregatePathExpressionParser.CollectionRole); } q.AppendScalarSelectToken(aggregatePathExpressionParser.WhereColumn); if (aggregateAddSelectScalar) { q.AddSelectScalar(AggregateType(aggregateFuncTokenList, aggregatePathExpressionParser.WhereColumnType, q)); aggregateAddSelectScalar = false; } aggregatePathExpressionParser.AddAssociation(q); } } else { if (!ready) { throw new QueryException(", expected in SELECT"); } ParserHelper.Parse(pathExpressionParser, q.Unalias(token), ParserHelper.PathSeparators, q); if (pathExpressionParser.IsCollectionValued) { q.AddCollection( pathExpressionParser.CollectionName, pathExpressionParser.CollectionRole); } else if (pathExpressionParser.WhereColumnType.IsEntityType) { q.AddSelectClass(pathExpressionParser.SelectName); } q.AppendScalarSelectTokens(pathExpressionParser.WhereColumns); q.AddSelectScalar(pathExpressionParser.WhereColumnType); pathExpressionParser.AddAssociation(q); ready = false; } }