@Override public String getFieldName() { return wrappedKeyFactory.getFieldName(); } }
@Override public String getKeyName() { return this.keyFactory.getFieldName(); }
public MultiKeyLoaderImpl(KeyNameMapper keyNameMapper, KeyFactory[] keyFactories) { this.keyNameMapper = keyNameMapper; this.keyFactories = keyFactories; calculateKeySize(); this.fields = new ArrayList<>(); for(KeyFactory keyFactory : keyFactories) { this.fields.add(keyFactory.getFieldName()); } }
@Override public String getFieldName() { StringBuilder nameBuilder = new StringBuilder(); for(KeyFactory keyFactory : multiKeyloader.getKeyFactories()) { nameBuilder.append(keyFactory.getFieldName().replaceAll("_", "")); } return nameBuilder.toString(); } }
@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 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 void enrichKey(IndexableItem indexableItem, Key key) throws JasDBStorageException { for(KeyFactory keyFactory : keyFactories) { Key createdKey = keyFactory.createKey(indexableItem); key.addKey(keyNameMapper, keyFactory.getFieldName(), createdKey); } } }
public static KeyNameMapperImpl create(KeyFactory[] keyFactories) { KeyNameMapperImpl keyNameMapper = new KeyNameMapperImpl(); for(int i=0; i<keyFactories.length; i++) { KeyFactory keyFactory = keyFactories[i]; keyNameMapper.addMappedField(i, keyFactory.getFieldName()); } return keyNameMapper; }
@Override public List<IndexField> getIndexKeyFields() { if(keyFactory instanceof CompositeKeyFactory) { List<IndexField> valueFields = new ArrayList<>(); for(KeyFactory vKeyFactory : ((CompositeKeyFactory)keyFactory).getMultiKeyloader().getKeyFactories()) { valueFields.add(new SimpleIndexField(vKeyFactory.getFieldName(), vKeyFactory.getKeyType())); } return valueFields; } else { return Lists.newArrayList(new SimpleIndexField(keyFactory.getFieldName(), keyFactory.getKeyType())); } }
@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 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 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; }
public KeyInfoImpl(String headerDescriptor, String valueDescriptor) throws JasDBStorageException { KeyFactory[] keyFactories = KeyFactoryManager.parseHeader(headerDescriptor); if(keyFactories.length == 1) { this.keyFactory = keyFactories[0]; LOG.debug("Loaded key index for field: {} and factory: {}", keyFactory.getFieldName(), keyFactory); this.fields = new LinkedList<>(); this.valueFields = new LinkedList<>(); if(this.keyFactory instanceof CompositeKeyFactory) { MultiKeyloader multiKeyloader = ((CompositeKeyFactory)keyFactory).getMultiKeyloader(); this.fields.addAll(multiKeyloader.getFields()); this.keyNameMapper = multiKeyloader.getKeyNameMapper(); this.keyNameMapper.setValueMarker(multiKeyloader.getFields().size()); } else { this.fields.add(keyFactory.getFieldName()); this.keyNameMapper = new KeyNameMapperImpl(); this.keyNameMapper.setValueMarker(0); } KeyFactory[] valueFactories = KeyFactoryManager.parseHeader(valueDescriptor); for(int i=0; i<valueFactories.length; i++) { String fieldName = valueFactories[i].getFieldName(); keyNameMapper.addMappedField(fieldName); valueFields.add(fieldName); } this.multiValueKeyLoader = new MultiKeyLoaderImpl(keyNameMapper, valueFactories); this.wrapperKeyFactory = new WrappedValueKeyFactory(keyFactory, multiValueKeyLoader); } else { throw new JasDBStorageException("Unexpected key information in headers"); } }
@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 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 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); }
public KeyInfoImpl(List<IndexField> keyFields, List<IndexField> valueFields) throws JasDBStorageException { if(keyFields.size() == 1) { IndexField indexField = keyFields.get(0); this.keyFactory = KeyFactoryManager.createKeyFactory(indexField.getField(), indexField.getKeyType()); this.fields = Lists.newArrayList(keyFactory.getFieldName()); this.keyNameMapper = new KeyNameMapperImpl(); this.keyNameMapper.setValueMarker(0); } else if(keyFields.size() > 1) { MultiKeyloader keyloader = createMultiKeyLoader(keyFields, new KeyNameMapperImpl()); this.keyNameMapper = keyloader.getKeyNameMapper(); this.keyNameMapper.setValueMarker(keyFields.size()); this.keyFactory = new CompositeKeyFactory(keyloader); this.fields = keyloader.getFields(); } else { throw new JasDBStorageException("Unable to create key information, no keys specified"); } this.multiValueKeyLoader = createMultiKeyLoader(valueFields, this.keyNameMapper); this.valueFields = multiValueKeyLoader.getFields(); this.wrapperKeyFactory = new WrappedValueKeyFactory(keyFactory, multiValueKeyLoader); }