protected override SqlProvider VisitFreeText(FreeTextProvider provider)
        {
            SqlFreeTextTable fromTable;

            QueryParameterBinding[] bindings;

            var stringTypeMapping = Driver.GetTypeMapping(StringType);
            var criteriaBinding   = new QueryParameterBinding(
                stringTypeMapping, provider.SearchCriteria.Invoke, QueryParameterBindingType.Regular);

            var index   = provider.PrimaryIndex.Resolve(Handlers.Domain.Model);
            var table   = Mapping[index.ReflectedType];
            var columns = provider.Header.Columns.Select(column => column.Name).ToList();

            if (provider.TopN == null)
            {
                fromTable = SqlDml.FreeTextTable(table, criteriaBinding.ParameterReference, columns);
                bindings  = new[] { criteriaBinding };
            }
            else
            {
                var intTypeMapping = Driver.GetTypeMapping(Int32Type);
                var topNBinding    = new QueryParameterBinding(intTypeMapping, context => provider.TopN.Invoke(context), QueryParameterBindingType.Regular);
                fromTable = SqlDml.FreeTextTable(table, criteriaBinding.ParameterReference, columns, topNBinding.ParameterReference);
                bindings  = new[] { criteriaBinding, topNBinding };
            }
            var fromTableRef = SqlDml.QueryRef(fromTable);
            var select       = SqlDml.Select(fromTableRef);

            select.Columns.Add(fromTableRef.Columns[0]);
            select.Columns.Add(SqlDml.Cast(fromTableRef.Columns[1], SqlType.Double), "RANK");

            return(CreateProvider(select, bindings, provider));
        }
Esempio n. 2
0
        protected override SqlProvider VisitFreeText(FreeTextProvider provider)
        {
            var rankColumnName    = provider.Header.Columns.Last().Name;
            var stringTypeMapping = Driver.GetTypeMapping(typeof(string));
            var binding           = new QueryParameterBinding(stringTypeMapping,
                                                              provider.SearchCriteria.Invoke, QueryParameterBindingType.Regular);

            SqlSelect select           = SqlDml.Select();
            var       realPrimaryIndex = provider.PrimaryIndex.Resolve(Handlers.Domain.Model);
            var       index            = realPrimaryIndex.ReflectedType.Indexes.PrimaryIndex;
            var       query            = BuildProviderQuery(index);
            var       table            = Mapping[realPrimaryIndex.ReflectedType];
            var       fromTable        = SqlDml.FreeTextTable(table, binding.ParameterReference, table.Columns.Select(column => column.Name).AddOne(rankColumnName).ToList());
            var       fromTableRef     = SqlDml.QueryRef(fromTable);

            foreach (var column in query.Columns)
            {
                select.Columns.Add(fromTableRef.Columns[column.Name] ?? column);
            }
            select.Columns.Add(SqlDml.Cast(fromTableRef.Columns[rankColumnName], SqlType.Double), rankColumnName);
            select.From = fromTableRef;
            if (provider.TopN != null)
            {
                select.Limit = provider.TopN.Invoke();
                select.OrderBy.Add(select.Columns[rankColumnName], false);
            }
            return(CreateProvider(select, binding, provider));
        }
Esempio n. 3
0
        protected override SqlProvider VisitFreeText(FreeTextProvider provider)
        {
            var rankColumnName    = provider.Header.Columns[provider.Header.Columns.Count - 1].Name;
            var stringTypeMapping = Driver.GetTypeMapping(WellKnownTypes.StringType);
            var binding           = new QueryParameterBinding(stringTypeMapping,
                                                              provider.SearchCriteria.Invoke, QueryParameterBindingType.Regular);

            var select           = SqlDml.Select();
            var realPrimaryIndex = provider.PrimaryIndex.Resolve(Handlers.Domain.Model);
            var index            = realPrimaryIndex.ReflectedType.Indexes.PrimaryIndex;
            var query            = BuildProviderQuery(index);
            var table            = Mapping[realPrimaryIndex.ReflectedType];
            var fromTable        = SqlDml.FreeTextTable(table, binding.ParameterReference,
                                                        table.Columns.Select(column => column.Name).Append(rankColumnName).ToArray(table.Columns.Count + 1));
            var fromTableRef = SqlDml.QueryRef(fromTable);

            foreach (var column in query.Columns)
            {
                select.Columns.Add(fromTableRef.Columns[column.Name] ?? column);
            }

            select.Columns.Add(SqlDml.Cast(fromTableRef.Columns[rankColumnName], SqlType.Double), rankColumnName);
            select.From = fromTableRef;
            if (provider.TopN == null)
            {
                return(CreateProvider(select, binding, provider));
            }

            var intTypeMapping = Driver.GetTypeMapping(typeof(int));
            var topNBinding    = new QueryParameterBinding(
                intTypeMapping, context => provider.TopN.Invoke(context), QueryParameterBindingType.Regular);

            select.Limit = topNBinding.ParameterReference;
            select.OrderBy.Add(select.Columns[rankColumnName], false);
            return(CreateProvider(select, new[] { binding, topNBinding }, provider));
        }
Esempio n. 4
0
 protected override SqlProvider VisitFreeText(FreeTextProvider provider)
 {
     throw new NotSupportedException();
 }
 /// <inheritdoc/>
 protected override Provider VisitFreeText(FreeTextProvider provider)
 {
     mappings[provider] = Enumerable.Range(0, provider.Header.Length).ToList();
     return(provider);
 }
Esempio n. 6
0
 /// <summary>
 /// Compiles <see cref="FreeTextProvider"/>.
 /// </summary>
 /// <param name="provider">FreeText provider.</param>
 protected abstract TResult VisitFreeText(FreeTextProvider provider);
Esempio n. 7
0
 /// <inheritdoc/>
 protected override Provider VisitFreeText(FreeTextProvider provider)
 {
     mappings[provider] = CollectionUtils.RangeToList(0, provider.Header.Length);
     return(provider);
 }
Esempio n. 8
0
 protected override Provider VisitFreeText(FreeTextProvider provider)
 {
     sortOrder = new DirectionCollection <int>();
     return(provider);
 }