@Override public void enrichKey(IndexableItem indexableItem, Key key) throws JasDBStorageException { for(KeyFactory keyFactory : keyFactories) { Key createdKey = keyFactory.createKey(indexableItem); key.addKey(keyNameMapper, keyFactory.getFieldName(), createdKey); } } }
private void mergeKeys(Key mergeInto, Key mergeFrom, KeyNameMapper sourceNameMapper, KeyNameMapper targetNameMapper) { Set<String> sourceFields = sourceNameMapper.getFieldSet(); sourceFields.removeAll(targetNameMapper.getFieldSet()); if(!sourceFields.isEmpty()) { for(String sourceField : sourceFields) { targetNameMapper.addMappedField(sourceField); mergeInto.addKey(targetNameMapper, sourceField, mergeFrom); } } } }
@Override public void loadKeys(Key targetKey, int offset, ByteBuffer keyBuffer) throws JasDBStorageException { int curPosition = offset; for(KeyFactory keyFactory : keyFactories) { Key valueKey = keyFactory.loadKey(curPosition, keyBuffer); targetKey.addKey(keyNameMapper, keyFactory.getFieldName(), valueKey); curPosition += keyFactory.getKeySize(); } }
@Override public Set<Key> createMultivalueKeys(IndexableItem indexableItem) throws JasDBStorageException { KeyNameMapper nameMapper = multiKeyloader.getKeyNameMapper(); Set<Key> currentKeys = new HashSet<>(); currentKeys.add(new CompositeKey()); for(KeyFactory keyFactory : multiKeyloader.getKeyFactories()) { Set<Key> subKeys = keyFactory.createMultivalueKeys(indexableItem); Set<Key> productSet = new HashSet<>(); for(Key currentKey : currentKeys) { for(Key subKey : subKeys) { Key key = currentKey.cloneKey(true); key.addKey(nameMapper, keyFactory.getFieldName(), subKey.cloneKey(false)); productSet.add(key); } } currentKeys = productSet; } return currentKeys; }
@Override public void updateRecord(UUIDKey documentId, ClonableDataStream dataStream) throws JasDBStorageException { Key documentKey = documentId.cloneKey(); documentKey.addKey(keyInfo.getKeyNameMapper(), "data", new DataKey(dataStream)); index.updateKey(documentId, documentKey); } }
@Override public void updateRecord(UUIDKey documentId, ClonableDataStream dataStream) throws JasDBStorageException { long updatedDocumentPointer = writer.updateRecord(RecordStreamUtil.toString(dataStream), () -> getRecordPointer(documentId), (oldp, newp) -> { if(oldp != newp) { Key newKey = documentId.cloneKey(false).addKey(keyInfo.getKeyNameMapper(), "RECORD_POINTER", new LongKey(newp)); try { index.updateKey(documentId, newKey); } catch (JasDBStorageException e) { LOG.error("", e); } } }); }
@Override public KeyLoadResult loadKeys(Key targetKey, int offset, DataBlock dataBlock) throws JasDBStorageException { int curOffset = offset; DataBlock currentBlock = dataBlock; for(KeyFactory keyFactory : keyFactories) { KeyLoadResult valueKeyResult = keyFactory.loadKey(curOffset, currentBlock); targetKey.addKey(keyNameMapper, keyFactory.getFieldName(), valueKeyResult.getLoadedKey()); currentBlock = valueKeyResult.getEndBlock(); curOffset = valueKeyResult.getNextOffset(); } return new KeyLoadResultImpl(targetKey, currentBlock, curOffset); }
@Override public void writeRecord(UUIDKey documentId, ClonableDataStream dataStream) throws JasDBStorageException { Key documentKey = documentId.cloneKey(); documentKey.addKey(keyInfo.getKeyNameMapper(), "data", new DataKey(dataStream)); StatRecord insertDataRecordIndex = StatisticsMonitor.createRecord("insert:data:record"); index.insertIntoIndex(documentKey); insertDataRecordIndex.stop(); }
@Override public void writeRecord(UUIDKey documentId, ClonableDataStream dataStream) throws JasDBStorageException { String recordContents = RecordStreamUtil.toString(dataStream); writer.writeRecord(recordContents, p -> { try { index.insertIntoIndex(documentId.cloneKey(false).addKey(keyInfo.getKeyNameMapper(), "RECORD_POINTER", new LongKey(p))); } catch(JasDBStorageException e) { try { removeRecord(documentId); } catch (JasDBStorageException e1) { LOG.error("", e); } throw new RuntimeJasDBException("Unable to write record already exists", e); } }); }
LOG.debug("Missing index pointer: {}", p); Key insertKey = key.cloneKey(false) .addKey(keyInfo.getKeyNameMapper(), "RECORD_POINTER", new LongKey(p));
private IndexSearchResultIterator ensureSortingParams(IndexSearchResultIterator results, Set<String> requiredFields) throws JasDBStorageException { if(!requiredFields.isEmpty()) { KeyNameMapper keyNameMapper = results.getKeyNameMapper(); for(Key key : results) { UUIDKey documentKey = KeyUtil.getDocumentKey(results.getKeyNameMapper(), key); RecordResult recordResult = recordWriter.readRecord(documentKey); Entity entity = SimpleEntity.fromStream(recordResult.getStream()); for(String requiredField : requiredFields) { Property property = entity.getProperty(requiredField); if(property != null) { Key propertyKey = PropertyKeyMapper.mapToKey(property); keyNameMapper.addMappedField(requiredField); key.addKey(keyNameMapper, requiredField, propertyKey); } } } results.reset(); } return results; }
@Override public SearchCondition mergeCondition(KeyNameMapper nameMapper, String sourceField, String mergeField, SearchCondition condition) { if(condition instanceof EqualsCondition) { CompositeKey compositeKey; if(key instanceof CompositeKey) { compositeKey = (CompositeKey) key; } else { compositeKey = new CompositeKey(); compositeKey.addKey(nameMapper, sourceField, key); } return new EqualsCondition(compositeKey.addKey(nameMapper, mergeField, ((EqualsCondition) condition).getKey())); } else if(condition instanceof RangeCondition) { RangeCondition rangeCondition = (RangeCondition) condition; Key startKey = null, endKey = null; if(rangeCondition.getStart() != null) { startKey = new CompositeKey() .addKey(nameMapper, sourceField, key) .addKey(nameMapper, mergeField, rangeCondition.getStart()); } if(rangeCondition.getEnd() != null) { endKey = new CompositeKey() .addKey(nameMapper, sourceField, key) .addKey(nameMapper, mergeField, rangeCondition.getEnd()); } return new RangeCondition(startKey, rangeCondition.isStartIncluded(), endKey, rangeCondition.isEndIncluded()); } return null; }