public static IndexSearchResultIteratorCollection distinct(IndexSearchResultIteratorCollection collection) throws JasDBStorageException { List<Key> keys = collection.getKeys(); Set<Key> documentKeys = new HashSet<>(); for(Iterator<Key> distinctIterator = keys.iterator(); distinctIterator.hasNext(); ) { Key documentKey = KeyUtil.getDocumentKey(collection.getKeyNameMapper(), distinctIterator.next()); if(!documentKeys.contains(documentKey)) { documentKeys.add(documentKey); } else { distinctIterator.remove(); } } return new IndexSearchResultIteratorImpl(keys, collection.getKeyNameMapper()); }
@Override public IndexSearchResultIteratorCollection mergeIterators(IndexSearchResultIteratorCollection mergeInto, IndexSearchResultIteratorCollection... results) { List<Key> mergedKeys = new ArrayList<>(mergeInto.getKeys()); for(IndexSearchResultIteratorCollection collection : results) { mergeInto(mergedKeys, collection); } return new IndexSearchResultIteratorImpl(mergedKeys, mergeInto.getKeyNameMapper()); }
public IndexSearchResultIteratorCollection doTableScanFindAll() throws JasDBStorageException { List<Key> keys = new ArrayList<>(); RecordIterator recordIterator = recordWriter.readAllRecords(); recordIterator.forEach(r -> keys.add(recordToKey(r))); return new IndexSearchResultIteratorImpl(keys, DEFAULT_DOC_ID_MAPPER.clone()); }
private IndexSearchResultIteratorCollection doLeaveSearch(LeaveBlock leaveBlock, Key desiredKey) { List<Key> results = new ArrayList<>(1); if(leaveBlock.contains(desiredKey)) { results.add(leaveBlock.getKey(desiredKey)); } return new IndexSearchResultIteratorImpl(results, keyInfo.getKeyNameMapper().clone()); }
@Override public IndexSearchResultIteratorCollection mergeIterators(IndexSearchResultIteratorCollection mergeInto, IndexSearchResultIteratorCollection... results) throws JasDBStorageException { List<Key> mergeIntoKeys = new LinkedList<>(); for(Key mergeKey : mergeInto.getKeys()) { mergeIntoKeys.add(mergeKey.cloneKey(true)); } KeyNameMapper keyNameMapper = mergeInto.getKeyNameMapper(); for(IndexSearchResultIteratorCollection collection : results) { mergeCollection(collection, mergeIntoKeys, keyNameMapper); } return new IndexSearchResultIteratorImpl(mergeIntoKeys, keyNameMapper); }
public IndexSearchResultIteratorCollection doTableScan(BlockOperation operation, Set<String> fields, IndexSearchResultIteratorCollection currentResults) throws JasDBStorageException { BlockMerger merger = operation.getMerger(); List<Key> foundKeys = new ArrayList<>(); Set<String> payloadFields = new HashSet<>(fields); payloadFields.add(SimpleEntity.DOCUMENT_ID); payloadFields.removeIf(field -> !operation.hasConditions(field)); if(currentResults != null) { LOG.debug("Doing table scan for fields: {} with limited set: {}", fields, currentResults.size()); for(Key key : currentResults) { RecordResult result = recordWriter.readRecord(KeyUtil.getDocumentKey(currentResults.getKeyNameMapper(), key)); doTableScanConditions(operation, merger, foundKeys, result, fields); } } else { LOG.debug("Doing a full table scan for fields: {}", fields); RecordIterator recordIterator = recordWriter.readAllRecords(); for(RecordResult result : recordIterator) { doTableScanConditions(operation, merger, foundKeys, result, payloadFields); } } return new IndexSearchResultIteratorImpl(foundKeys, DEFAULT_DOC_ID_MAPPER.clone()); }
@Override public IndexSearchResultIteratorCollection search(SearchCondition condition, SearchLimit limit) throws JasDBStorageException { IndexIterator indexIterator = new FullIndexIterator(rootBlock, lockManager, blockPersister); EqualsCondition equalsCondition = EqualsSearchOperation.validateCondition(keyInfo, condition); Key undesiredKey = equalsCondition.getKey(); List<Key> results = new LinkedList<>(); for(Key key : indexIterator) { if(key.compare(undesiredKey, CompareMethod.EQUALS).getCompare() != 0) { results.add(key); } if(limit.isMaxReached(results.size())) { break; } } return new IndexSearchResultIteratorImpl(results, keyInfo.getKeyNameMapper()); } }
public QueryResult search(BlockOperation blockOperation, SearchLimit limit, List<SortParameter> params) throws JasDBStorageException { StatRecord record = StatisticsMonitor.createRecord("bag:search:blockHierarchy"); IndexSearchResultIteratorCollection results = doBlockHierarchy(blockOperation, limit); record.stop(); results = results != null ? results : new IndexSearchResultIteratorImpl(new ArrayList<>(0), new KeyNameMapperImpl()); if(params != null && !params.isEmpty()) { record = StatisticsMonitor.createRecord("bag:search:sort"); results = doSort(results, params); record.stop(); } if(limit.getBegin() >= 0 && limit.getMax() > 0) { List<Key> k = results.subset(limit.getBegin(), limit.getMax()); results = new IndexSearchResultIteratorImpl(k, results.getKeyNameMapper()); } results = DistinctCollectionUtil.distinct(results); return new QueryResultIteratorImpl(results, limit, this.recordWriter); }
private IndexSearchResultIteratorCollection doSort(IndexSearchResultIteratorCollection results, List<SortParameter> params) throws JasDBStorageException { Set<String> requiredKeys = new HashSet<>(); for(SortParameter sortParam : params) { String paramField = sortParam.getField(); if(!results.getKeyNameMapper().isMapped(paramField)) { LOG.debug("Sorting field: {} not present in index results following keys present: {}", paramField, results.getKeyNameMapper()); requiredKeys.add(paramField); } } ensureSortingParams(results, requiredKeys); for(SortParameter sortParam : params) { String field = sortParam.getField(); if(results.getKeyNameMapper().isMapped(field)) { List<Key> sortedKeys = doMergeSort(results.getKeys(), sortParam.getField(), sortParam.getOrder(), results.getKeyNameMapper()); results = new IndexSearchResultIteratorImpl(sortedKeys, results.getKeyNameMapper()); } } return results; }
return new IndexSearchResultIteratorImpl(results, keyInfo.getKeyNameMapper().clone()); } finally { lockManager.releaseLockChain();