public static QueryDbFieldAttribute Init(this QueryDbFieldAttribute query)
        {
            query.ValueStyle = ValueStyle.Single;
            if (query.Template == null)
            {
                return(query);
            }
            if (query.ValueFormat != null &&
                !(query.Template.Contains("{Value1}") || query.Template.Contains("{Values}")))
            {
                return(query);
            }

            var i = 0;

            while (query.Template.Contains("{Value" + (i + 1) + "}"))
            {
                i++;
            }
            if (i > 0)
            {
                query.ValueStyle = ValueStyle.Multiple;
                query.ValueArity = i;
            }
            else
            {
                query.ValueStyle = !query.Template.Contains("{Values}")
                    ? ValueStyle.Single
                    : ValueStyle.List;
            }
            return(query);
        }
Esempio n. 2
0
        public void Register(IAppHost appHost)
        {
            foreach (var entry in ImplicitConventions)
            {
                var key = entry.Key.Trim('%');
                var fmt = entry.Value;
                var query = new QueryDbFieldAttribute {
                    Template = fmt
                }.Init();
                if (entry.Key.EndsWith("%"))
                {
                    StartsWithConventions[key] = query;
                }
                if (entry.Key.StartsWith("%"))
                {
                    EndsWithConventions[key] = query;
                }
            }

            appHost.GetContainer().Register <IAutoQuery>(c =>
                                                         new AutoQuery
            {
                IgnoreProperties         = IgnoreProperties,
                IllegalSqlFragmentTokens = IllegalSqlFragmentTokens,
                MaxLimit                      = MaxLimit,
                EnableUntypedQueries          = EnableUntypedQueries,
                EnableSqlFilters              = EnableRawSqlFilters,
                OrderByPrimaryKeyOnLimitQuery = OrderByPrimaryKeyOnPagedQuery,
                QueryFilters                  = QueryFilters,
                ResponseFilters               = ResponseFilters,
                StartsWithConventions         = StartsWithConventions,
                EndsWithConventions           = EndsWithConventions,
                UseNamedConnection            = UseNamedConnection,
            })
            .ReusedWithin(ReuseScope.None);

            appHost.Metadata.GetOperationAssemblies()
            .Each(x => LoadFromAssemblies.Add(x));

            ((ServiceStackHost)appHost).ServiceAssemblies.Each(x => {
                if (!LoadFromAssemblies.Contains(x))
                {
                    LoadFromAssemblies.Add(x);
                }
            });

            if (EnableAutoQueryViewer && appHost.GetPlugin <AutoQueryMetadataFeature>() == null)
            {
                appHost.LoadPlugin(new AutoQueryMetadataFeature {
                    MaxLimit = MaxLimit
                });
            }
        }
        public static QueryDbFieldAttribute Combine(this QueryDbFieldAttribute field, QueryDbFieldAttribute convention)
        {
            if (convention == null)
            {
                return(field);
            }

            return(new QueryDbFieldAttribute
            {
                Term = field.Term,
                Operand = field.Operand ?? convention.Operand,
                Template = field.Template ?? convention.Template,
                Field = field.Field ?? convention.Field,
                ValueFormat = field.ValueFormat ?? convention.ValueFormat,
                ValueStyle = field.ValueStyle,
                ValueArity = field.ValueArity != 0 ? field.ValueArity : convention.ValueArity,
            });
        }
 public MatchQuery(Tuple <ModelDefinition, FieldDefinition> match, QueryDbFieldAttribute implicitQuery)
 {
     ModelDef      = match.Item1;
     FieldDef      = match.Item2;
     ImplicitQuery = implicitQuery;
 }
        private static void AddCondition(SqlExpression <From> q, string defaultTerm, string quotedColumn, object value, QueryDbFieldAttribute implicitQuery)
        {
            var seq = value as IEnumerable;

            if (value is string)
            {
                seq = null;
            }

            if (seq != null && value is ICollection collection && collection.Count == 0)
            {
                return;
            }

            var format = seq == null
                ? (value != null ? quotedColumn + " = {0}" : quotedColumn + " IS NULL")
                : quotedColumn + " IN ({0})";

            if (implicitQuery != null)
            {
                var operand = implicitQuery.Operand ?? "=";
                if (implicitQuery.Term == QueryTerm.Or)
                {
                    defaultTerm = "OR";
                }
                else if (implicitQuery.Term == QueryTerm.And)
                {
                    defaultTerm = "AND";
                }

                format = "(" + quotedColumn + " " + operand + " {0}" + ")";
                if (implicitQuery.Template != null)
                {
                    format = implicitQuery.Template.Replace("{Field}", quotedColumn);

                    if (implicitQuery.ValueStyle == ValueStyle.Multiple)
                    {
                        if (value == null)
                        {
                            return;
                        }
                        if (seq == null)
                        {
                            throw new ArgumentException($"{implicitQuery.Field} requires {implicitQuery.ValueArity} values");
                        }

                        var args = new object[implicitQuery.ValueArity];
                        int i    = 0;
                        foreach (var x in seq)
                        {
                            if (i < args.Length)
                            {
                                format = format.Replace("{Value" + (i + 1) + "}", "{" + i + "}");
                                var arg = x;
                                if (implicitQuery.ValueFormat != null)
                                {
                                    arg = string.Format(implicitQuery.ValueFormat, arg);
                                }
                                args[i++] = arg;
                            }
                        }

                        q.AddCondition(defaultTerm, format, args);
                        return;
                    }
                    if (implicitQuery.ValueStyle == ValueStyle.List)
                    {
                        if (value == null)
                        {
                            return;
                        }
                        if (seq == null)
                        {
                            throw new ArgumentException("{0} expects a list of values".Fmt(implicitQuery.Field));
                        }

                        format = format.Replace("{Values}", "{0}");
                        value  = new SqlInValues(seq);
                    }
                    else
                    {
                        format = format.Replace("{Value}", "{0}");
                    }

                    if (implicitQuery.ValueFormat != null)
                    {
                        value = string.Format(implicitQuery.ValueFormat, value);
                    }
                }
            }
            else
            {
                if (seq != null)
                {
                    value = new SqlInValues(seq);
                }
            }

            q.AddCondition(defaultTerm, format, value);
        }
        public void Register(IAppHost appHost)
        {
            if (StripUpperInLike)
            {
                if (ImplicitConventions.TryGetValue("%Like%", out var convention) && convention == CaseInsensitiveLikeFormat)
                {
                    ImplicitConventions["%Like%"] = CaseSensitiveLikeFormat;
                }

                foreach (var attr in EndsWithConventions)
                {
                    if (attr.Value.Template == CaseInsensitiveLikeFormat)
                    {
                        attr.Value.Template = CaseSensitiveLikeFormat;
                    }
                }
            }

            foreach (var entry in ImplicitConventions)
            {
                var key = entry.Key.Trim('%');
                var fmt = entry.Value;
                var query = new QueryDbFieldAttribute {
                    Template = fmt
                }.Init();
                if (entry.Key.EndsWith("%"))
                {
                    StartsWithConventions[key] = query;
                }
                if (entry.Key.StartsWith("%"))
                {
                    EndsWithConventions[key] = query;
                }
            }

            appHost.GetContainer().Register <IAutoQueryDb>(c => new AutoQuery
            {
                IgnoreProperties         = IgnoreProperties,
                IllegalSqlFragmentTokens = IllegalSqlFragmentTokens,
                MaxLimit                      = MaxLimit,
                IncludeTotal                  = IncludeTotal,
                EnableUntypedQueries          = EnableUntypedQueries,
                EnableSqlFilters              = EnableRawSqlFilters,
                OrderByPrimaryKeyOnLimitQuery = OrderByPrimaryKeyOnPagedQuery,
                QueryFilters                  = QueryFilters,
                ResponseFilters               = ResponseFilters,
                StartsWithConventions         = StartsWithConventions,
                EndsWithConventions           = EndsWithConventions,
                UseNamedConnection            = UseNamedConnection,
            })
            .ReusedWithin(ReuseScope.None);

            appHost.Metadata.GetOperationAssemblies()
            .Each(x => LoadFromAssemblies.Add(x));

            appHost.ServiceAssemblies.Each(x => {
                if (!LoadFromAssemblies.Contains(x))
                {
                    LoadFromAssemblies.Add(x);
                }
            });

            if (EnableAutoQueryViewer && appHost.GetPlugin <AutoQueryMetadataFeature>() == null)
            {
                appHost.LoadPlugin(new AutoQueryMetadataFeature {
                    MaxLimit = MaxLimit
                });
            }

            appHost.GetPlugin <MetadataFeature>()
            ?.AddLink(MetadataFeature.AvailableFeatures, "http://docs.servicestack.net/autoquery", nameof(AutoQueryFeature));
        }