Ejemplo n.º 1
0
 protected virtual void AppendToken(QueryTranslator q, SqlString token)
 {
     if (expectingIndex > 0)
     {
         pathExpressionParser.SetLastCollectionElementIndexValue(token);
     }
     else
     {
         q.AppendWhereToken(token);
     }
 }
Ejemplo n.º 2
0
 protected virtual void AppendToken(QueryTranslator q, string token)
 {
     if (expectingIndex > 0)
     {
         pathExpressionParser.SetLastCollectionElementIndexValue(new SqlString(token));
     }
     else
     {
         // a String.Empty can get passed in here.  If that occurs
         // then don't create a new SqlString for it - just ignore
         // it since it adds nothing to the sql being generated.
         if (!string.IsNullOrEmpty(token))
         {
             q.AppendWhereToken(new SqlString(token));
         }
     }
 }
Ejemplo n.º 3
0
        private void DoToken(string token, QueryTranslator q)
        {
            if (q.IsName(StringHelper.Root(token)))                  //path expression
            {
                DoPathExpression(q.Unalias(token), q);
            }
            else if (token.StartsWith(ParserHelper.HqlVariablePrefix))                //named query parameter
            {
                q.AddNamedParameter(token.Substring(1));
                // this is only a temporary parameter to help with the parsing of hql -
                // when the type becomes known then this will be converted to its real
                // parameter type.
                AppendToken(q, new SqlString(new object[] { new Parameter(StringHelper.SqlParameter) }));
            }
            else if (token.Equals(StringHelper.SqlParameter))
            {
                //if the token is a "?" then we have a Parameter so convert it to a SqlCommand.Parameter
                // instead of appending a "?" to the WhereTokens
                q.AppendWhereToken(new SqlString(new object[] { new Parameter(StringHelper.SqlParameter) }));
            }
            else
            {
                IQueryable persister = q.GetPersisterUsingImports(token);
                if (persister != null)                  // the name of a class
                {
                    object discrim = persister.DiscriminatorSQLValue;
                    if (InFragment.Null == discrim || InFragment.NotNull == discrim)
                    {
                        throw new QueryException("subclass test not allowed for null or not null discriminator");
                    }
                    AppendToken(q, discrim.ToString());
                }
                else
                {
                    object constant;
                    string fieldName    = null;
                    string typeName     = null;
                    string importedName = null;

                    int indexOfDot = token.IndexOf(StringHelper.Dot);
                    // don't even bother to do the lookups if the indexOfDot is not
                    // greater than -1.  This will save all the string modifications.

                    // This allows us to resolve to the full type before obtaining the value e.g. FooStatus.OFF -> NHibernate.Model.FooStatus.OFF
                    if (indexOfDot > -1)
                    {
                        fieldName    = StringHelper.Unqualify(token);
                        typeName     = StringHelper.Qualifier(token);
                        importedName = q.factory.GetImportedClassName(typeName);
                    }

                    if (indexOfDot > -1 &&
                        (constant = ReflectHelper.GetConstantValue(importedName, fieldName)) != null)
                    {
                        // need to get the NHibernate Type so we can convert the Enum or field from
                        // a class into it's string representation for hql.
                        IType type;
                        try
                        {
                            type = TypeFactory.HeuristicType(constant.GetType().AssemblyQualifiedName);
                        }
                        catch (MappingException me)
                        {
                            throw new QueryException(me);
                        }

                        if (type == null)
                        {
                            throw new QueryException(string.Format("Could not determin the type of: {0}", token));
                        }

                        try
                        {
                            AppendToken(q, (( ILiteralType )type).ObjectToSQLString(constant));
                        }
                        catch (Exception e)
                        {
                            throw new QueryException("Could not format constant value to SQL literal: " + token, e);
                        }
                    }
                    else
                    {
                        //anything else

                        string negatedToken = negated ? ( string )negations[token.ToLower(System.Globalization.CultureInfo.InvariantCulture)] : null;
                        if (negatedToken != null && (!betweenSpecialCase || !"or".Equals(negatedToken)))
                        {
                            AppendToken(q, negatedToken);
                        }
                        else
                        {
                            AppendToken(q, token);
                        }
                    }
                }
            }
        }