Пример #1
0
        public static void ProcessDynamicFilterParameters(
            SqlString sqlFragment,
            IParameterContainer container,
            HqlSqlWalker walker)
        {
            if (walker.EnabledFilters.Count == 0 &&
                (!HasDynamicFilterParam(sqlFragment)) &&
                (!(HasCollectionFilterParam(sqlFragment))))
            {
                return;
            }

            Dialect.Dialect dialect = walker.SessionFactoryHelper.Factory.Dialect;

            string symbols = new StringBuilder().Append(ParserHelper.HqlSeparators)
                             .Append(dialect.OpenQuote)
                             .Append(dialect.CloseQuote)
                             .ToString();

            StringTokenizer tokens = new StringTokenizer(sqlFragment.ToString(), symbols, true);
            StringBuilder   result = new StringBuilder();

            foreach (string token in tokens)
            {
                if (token.StartsWith(ParserHelper.HqlVariablePrefix))
                {
                    string     filterParameterName = token.Substring(1);
                    string[]   parts            = StringHelper.ParseFilterParameterName(filterParameterName);
                    FilterImpl filter           = ( FilterImpl )walker.EnabledFilters[parts[0]];
                    Object     value            = filter.GetParameter(parts[1]);
                    IType      type             = filter.FilterDefinition.GetParameterType(parts[1]);
                    String     typeBindFragment = StringHelper.Join(
                        ",",
                        ArrayHelper.FillArray("?", type.GetColumnSpan(walker.SessionFactoryHelper.Factory))
                        );
                    string bindFragment = (value != null && value is ICollection)
                                                        ? StringHelper.Join(",", ArrayHelper.FillArray(typeBindFragment, (( ICollection )value).Count))
                                                        : typeBindFragment;
                    //result.Append( bindFragment );
                    result.Append(token);
                    container.AddEmbeddedParameter(new DynamicFilterParameterSpecification(parts[0], parts[1], type));
                }
                else
                {
                    result.Append(token);
                }
            }

            container.Text = result.ToString();
        }