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