private Key validateKey(KeyFactory factory, Key key) throws JasDBStorageException { if(key != null && !factory.supportsKey(key)) { return factory.convertKey(key); } else { return key; } }
@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); } } }
@Override public boolean isMultiValueKey(IndexableItem indexableItem) throws JasDBStorageException { return wrappedKeyFactory.isMultiValueKey(indexableItem); }
@Override public void writeKeys(Key sourceKey, int offset, ByteBuffer keyBuffer) throws JasDBStorageException { int curPosition = offset; for(KeyFactory keyFactory : keyFactories) { Key value = sourceKey.getKey(keyNameMapper, keyFactory.getFieldName()); if(value != null) { keyFactory.writeKey(value, curPosition, keyBuffer); } curPosition += keyFactory.getKeySize(); } }
@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(); } }
public static Set<Key> createEntityKeys(Entity entity, Index index) throws JasDBStorageException { StatRecord createKey = StatisticsMonitor.createRecord("bag:createKey"); KeyFactory keyFactory = index.getKeyInfo().getKeyFactory(); Set<Key> insertKeys; if(keyFactory.isMultiValueKey(entity)) { insertKeys = keyFactory.createMultivalueKeys(entity); } else { insertKeys = new HashSet<>(); insertKeys.add(keyFactory.createKey(entity)); } createKey.stop(); return insertKeys; }
@Override public Key convertKey(Key key) throws JasDBStorageException { if(key instanceof CompositeKey) { CompositeKey compositeKey = (CompositeKey) key; KeyNameMapper mapper = multiKeyloader.getKeyNameMapper(); for(KeyFactory keyFactory : multiKeyloader.getKeyFactories()) { Key partialKey = compositeKey.getKey(mapper, keyFactory.getFieldName()); if(partialKey != null && !keyFactory.supportsKey(partialKey)) { Key convertedKey = keyFactory.convertKey(partialKey); compositeKey.addKey(mapper, keyFactory.getFieldName(), convertedKey); } } return key; } else { CompositeKey compositeKey = new CompositeKey(); compositeKey.setValueMarker(1); compositeKey.setKeys(new Key[]{key}); return compositeKey; } }
@Override public void writeKey(Key key, int curPosition, ByteBuffer byteBuffer) throws JasDBStorageException { wrappedKeyFactory.writeKey(key, curPosition, byteBuffer); }
@Override public KeyLoadResult loadKey(int offset, DataBlock dataBlock) throws JasDBStorageException { return wrappedKeyFactory.loadKey(offset, dataBlock); }
@Override public Key loadKey(int curPosition, ByteBuffer byteBuffer) throws JasDBStorageException { Key loadedKey = keyFactory.loadKey(curPosition, byteBuffer); if(loadedKey != null) { int valueOffset = curPosition + keyFactory.getKeySize(); this.multiValueKeyLoader.loadKeys(loadedKey, valueOffset, byteBuffer); return loadedKey; } else { return null; } }
@Override public void writeKey(Key key, int curPosition, ByteBuffer byteBuffer) throws JasDBStorageException { this.keyFactory.writeKey(key, curPosition, byteBuffer); int valueOffset = curPosition + keyFactory.getKeySize(); this.multiValueKeyLoader.writeKeys(key, valueOffset, byteBuffer); }
@Override public DataBlock writeKeys(Key sourceKey, DataBlock dataBlock) throws JasDBStorageException { DataBlock currentBlock = dataBlock; for(KeyFactory keyFactory : keyFactories) { Key value = sourceKey.getKey(keyNameMapper, keyFactory.getFieldName()); if(value != null) { currentBlock = keyFactory.writeKey(value, currentBlock); } else { throw new JasDBStorageException("Cannot insert key into index, field: " + keyFactory.getFieldName() + " missing in key: " + sourceKey); } } return currentBlock; }
@Override public boolean supportsKey(Key key) { if(key instanceof CompositeKey) { CompositeKey compositeKey = (CompositeKey) key; KeyNameMapper mapper = multiKeyloader.getKeyNameMapper(); for(KeyFactory keyFactory : multiKeyloader.getKeyFactories()) { Key partialKey = compositeKey.getKey(mapper, keyFactory.getFieldName()); if(partialKey == null || !keyFactory.supportsKey(partialKey)) { return false; } } } return false; }
@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 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 List<IndexField> getIndexValueFields() { List<IndexField> valueFields = new ArrayList<>(); for(KeyFactory vKeyFactory : multiValueKeyLoader.getKeyFactories()) { valueFields.add(new SimpleIndexField(vKeyFactory.getFieldName(), vKeyFactory.getKeyType())); } return valueFields; }
@Override public Key convertKey(Key key) throws JasDBStorageException { return wrappedKeyFactory.convertKey(key); }
@Override public boolean supportsKey(Key key) { return wrappedKeyFactory.supportsKey(key); }
@Override public String getFieldName() { return wrappedKeyFactory.getFieldName(); } }
@Override public Set<Key> createMultivalueKeys(IndexableItem indexableItem) throws JasDBStorageException { Set<Key> keys = wrappedKeyFactory.createMultivalueKeys(indexableItem); for(Key key : keys) { this.valueLoader.enrichKey(indexableItem, key); } return keys; }