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