/** * Build the index row key. * * <p>The format is as follows: * * <pre> * ([encoded value][terminator for variable length fields])*[identifier] * </pre> */ private byte[] buildRowKey(IndexEntry entry) throws IOException { final StructRowKey indexEntryRowKeySerializer = definition.asStructRowKey(); return indexEntryRowKeySerializer.serialize(entry.getFieldValuesInSerializationOrder()); }
private byte[] decodeIdentifierFrom(byte[] rowKey) throws IOException { final StructRowKey structRowKey = definition.asStructRowKey(); structRowKey.iterateOver(rowKey); final StructIterator iterator = structRowKey.iterator(); int nbrFields = structRowKey.getFields().length; // ignore all but last field (i.e. the identifier) for (int i = 0; i < nbrFields - 1; i++) { iterator.skip(); } // read the last field (i.e. the identifier) return (byte[]) iterator.next(); }
private Object decodeIndexFieldFrom(String fieldName, byte[] rowKey) throws IOException { final StructRowKey structRowKey = definition.asStructRowKey(); structRowKey.iterateOver(rowKey); final StructIterator iterator = structRowKey.iterator(); int fieldPosition = definition.getFieldPosition(fieldName); if (fieldPosition == -1) { throw new MalformedQueryException("field [" + fieldName + "] is not part of the index"); } // skip all fields up to fieldPosition for (int i = 0; i < fieldPosition; i++) { iterator.skip(); } // return the requested field return iterator.next(); }
@Override public boolean filterRowKey(byte[] buffer, int offset, int length) { final StructRowKey structRowKey = indexDefinition.asStructRowKey(); structRowKey.iterateOver(buffer, offset); final StructIterator fieldsIterator = structRowKey.iterator(); final List<IndexFieldDefinition> fieldDefinitions = indexDefinition.getFields(); // for all defined field definitions for (IndexFieldDefinition field : fieldDefinitions) { // check if the field should be filtered if (indexFilter.getFields().contains(field.getName())) { final Object nextField = fieldsIterator.next(); if (indexFilter.filterField(field.getName(), nextField)) { return true; // this result is ignored } } else { try { fieldsIterator.skip(); } catch (IOException e) { throw new RuntimeException("failed to skip, index inconsistency?", e); } } } return false; // nothing was skipped }