示例#1
0
 public List <Movie> GetAll(int page)
 {
     StartOrCursor.Start start = new StartOrCursor.Start(page * PageSize);
     return(_solr
            .Query(SolrQuery.All, new QueryOptions()
     {
         Rows = PageSize, StartOrCursor = start
     })
            .ToList());
 }
示例#2
0
        public IEnumerable <IRow> Read()
        {
            AbstractSolrQuery query = SolrQuery.All;
            var filterQueries       = new Collection <ISolrQuery>();
            var facetQueries        = new Collection <ISolrFacetQuery>();

            if (_context.Entity.Filter.Any())
            {
                var queries = new Collection <ISolrQuery>();

                foreach (var filter in _context.Entity.Filter.Where(f => f.Type == "search" && f.Value != "*"))
                {
                    if (filter.Field == string.Empty)
                    {
                        queries.Add(new SolrQuery(filter.Expression));
                    }
                    else
                    {
                        foreach (var term in Terms(filter.Value))
                        {
                            queries.Add(new SolrQueryByField(filter.Field, term)
                            {
                                Quoted = false
                            });
                        }
                    }
                }

                query = queries.Any() ? new SolrMultipleCriteriaQuery(queries, "AND") : SolrQuery.All;

                foreach (var filter in _context.Entity.Filter.Where(f => f.Type == "filter"))
                {
                    if (filter.Field == string.Empty)
                    {
                        filterQueries.Add(new SolrQuery(filter.Expression));
                    }
                    else
                    {
                        if (filter.Value != "*")
                        {
                            foreach (var term in Terms(filter.Value))
                            {
                                queries.Add(new SolrQueryByField(filter.Field, term)
                                {
                                    Quoted = false
                                });
                            }
                        }
                    }
                }

                foreach (var filter in _context.Entity.Filter.Where(f => f.Type == "facet"))
                {
                    facetQueries.Add(new SolrFacetFieldQuery(filter.Field)
                    {
                        MinCount = filter.Min,
                        Limit    = filter.Size
                    });
                    if (filter.Value != "*")
                    {
                        if (filter.Value.IndexOf(',') > 0)
                        {
                            filterQueries.Add(new SolrQueryInList(filter.Field, filter.Value.Split(new[] { ',' })));
                        }
                        else
                        {
                            filterQueries.Add(new SolrQueryByField(filter.Field, filter.Value));
                        }
                    }
                }
            }

            int           rows;
            StartOrCursor startOrCursor;

            if (_context.Entity.IsPageRequest())
            {
                rows          = _context.Entity.PageSize;
                startOrCursor = new StartOrCursor.Start((_context.Entity.Page * _context.Entity.PageSize) - _context.Entity.PageSize);
            }
            else
            {
                rows = _context.Entity.ReadSize > 0 ? _context.Entity.ReadSize : _solr.Query(query, new QueryOptions {
                    StartOrCursor = new StartOrCursor.Start(0), Rows = 0
                }).NumFound;
                startOrCursor = _context.Entity.ReadSize == 0 ? (StartOrCursor) new StartOrCursor.Start(0) : StartOrCursor.Cursor.Start;
            }

            var sortOrder = new Collection <SortOrder>();

            foreach (var orderBy in _context.Entity.Order)
            {
                Field field;
                if (_context.Entity.TryGetField(orderBy.Field, out field))
                {
                    var name = field.SortField.ToLower();
                    sortOrder.Add(new SortOrder(name, orderBy.Sort == "asc" ? SolrNet.Order.ASC : SolrNet.Order.DESC));
                }
            }
            sortOrder.Add(new SortOrder("score", SolrNet.Order.DESC));

            var result = _solr.Query(
                query,
                new QueryOptions {
                StartOrCursor = startOrCursor,
                Rows          = rows,
                Fields        = _fieldNames,
                OrderBy       = sortOrder,
                FilterQueries = filterQueries,
                Facet         = new FacetParameters {
                    Queries = facetQueries, Sort = false
                }
            }
                );

            foreach (var filter in _context.Entity.Filter.Where(f => f.Type == "facet"))
            {
                if (result.FacetFields.ContainsKey(filter.Field))
                {
                    var facet = result.FacetFields[filter.Field];
                    var map   = _context.Process.Maps.First(m => m.Name == filter.Map);
                    foreach (var f in facet)
                    {
                        map.Items.Add(new MapItem {
                            From = $"{f.Key} ({f.Value})", To = f.Key
                        });
                    }
                }
            }

            if (result.NumFound <= 0)
            {
                yield break;
            }

            _context.Entity.Hits = result.NumFound;

            foreach (var row in result.Select(x => DocToRow(_rowFactory.Create(), _fields, x)))
            {
                _context.Increment();
                ++_localCount;
                yield return(row);
            }

            // using cursor, solr 4.7+ (un-tested)
            while (result.NextCursorMark != null)
            {
                result = _solr.Query(
                    query,
                    new QueryOptions {
                    StartOrCursor = result.NextCursorMark,
                    Rows          = _context.Entity.ReadSize,
                    Fields        = _fieldNames,
                    OrderBy       = sortOrder,
                    FilterQueries = filterQueries,
                    Facet         = new FacetParameters {
                        Queries = facetQueries, Sort = false
                    }
                }
                    );

                foreach (var row in result.Select(r => DocToRow(_rowFactory.Create(), _fields, r)))
                {
                    _context.Increment();
                    ++_localCount;
                    yield return(row);
                }
            }

            // traditional paging
            if (_context.Entity.ReadSize == 0 || _localCount >= result.NumFound)
            {
                yield break;
            }

            var pages = result.NumFound / _context.Entity.ReadSize;

            for (var page = 1; page <= pages; page++)
            {
                result = _solr.Query(
                    query,
                    new QueryOptions {
                    StartOrCursor = new StartOrCursor.Start(page * _context.Entity.ReadSize),
                    Rows          = _context.Entity.ReadSize,
                    Fields        = _fieldNames,
                    OrderBy       = sortOrder,
                    FilterQueries = filterQueries,
                    Facet         = new FacetParameters {
                        Queries = facetQueries, Sort = false
                    }
                }
                    );

                foreach (var row in result.Select(r => DocToRow(_rowFactory.Create(), _fields, r)))
                {
                    ++_localCount;
                    _context.Increment();
                    yield return(row);
                }
            }
        }
        public IEnumerable <IRow> Read()
        {
            var query = _context.Entity.Filter.Any() ? new SolrMultipleCriteriaQuery(_context.Entity.Filter.Select(f => new SolrQuery(f.Expression)), "AND") : SolrQuery.All;

            int           rows;
            StartOrCursor startOrCursor;

            if (_context.Entity.IsPageRequest())
            {
                rows          = _context.Entity.PageSize;
                startOrCursor = new StartOrCursor.Start((_context.Entity.Page * _context.Entity.PageSize) - _context.Entity.PageSize);
            }
            else
            {
                rows = _context.Entity.ReadSize > 0 ? _context.Entity.ReadSize : _solr.Query(query, new QueryOptions {
                    StartOrCursor = new StartOrCursor.Start(0), Rows = 0
                }).NumFound;
                startOrCursor = _context.Entity.ReadSize == 0 ? (StartOrCursor) new StartOrCursor.Start(0) : StartOrCursor.Cursor.Start;
            }

            var result = _solr.Query(
                query,
                new QueryOptions {
                StartOrCursor = startOrCursor,
                Rows          = rows,
                Fields        = _fieldNames
            }
                );

            if (result.NumFound <= 0)
            {
                yield break;
            }

            _context.Entity.Hits = result.NumFound;

            foreach (var row in result.Select(x => DocToRow(_rowFactory.Create(), _fields, x)))
            {
                _context.Increment();
                ++_localCount;
                yield return(row);
            }

            // using cursor, solr 4.7+ (un-tested)
            while (result.NextCursorMark != null)
            {
                result = _solr.Query(
                    query,
                    new QueryOptions {
                    StartOrCursor = result.NextCursorMark,
                    Rows          = _context.Entity.ReadSize,
                    Fields        = _fieldNames
                }
                    );

                foreach (var row in result.Select(r => DocToRow(_rowFactory.Create(), _fields, r)))
                {
                    _context.Increment();
                    ++_localCount;
                    yield return(row);
                }
            }

            // traditional paging
            if (_context.Entity.ReadSize == 0 || _localCount >= result.NumFound)
            {
                yield break;
            }

            var pages = result.NumFound / _context.Entity.ReadSize;

            for (var page = 1; page <= pages; page++)
            {
                result = _solr.Query(
                    query,
                    new QueryOptions {
                    StartOrCursor = new StartOrCursor.Start(page * _context.Entity.ReadSize),
                    Rows          = _context.Entity.ReadSize,
                    Fields        = _fieldNames
                }
                    );

                foreach (var row in result.Select(r => DocToRow(_rowFactory.Create(), _fields, r)))
                {
                    ++_localCount;
                    _context.Increment();
                    yield return(row);
                }
            }
        }