@Override public <K> boolean remove(final K key, final Serializer<K> keySerializer) throws IOException { final boolean contains = containsKey(key, keySerializer); if (contains) { final byte[] rowIdBytes = serialize(key, keySerializer); hBaseClientService.delete(hBaseCacheTableName, rowIdBytes); } return contains; }
@Override public <K> boolean remove(final K key, final Serializer<K> keySerializer) throws IOException { final boolean contains = containsKey(key, keySerializer); if (contains) { final byte[] rowIdBytes = serialize(key, keySerializer); hBaseClientService.delete(hBaseCacheTableName, rowIdBytes); } return contains; }
@Override public void scan(final String tableName, final Collection<Column> columns, final String filterExpression, final long minTime, final ResultHandler handler) throws IOException { scan(tableName, columns, filterExpression, minTime, null, handler); }
@Override public <K, V> V get(final K key, final Serializer<K> keySerializer, final Deserializer<V> valueDeserializer) throws IOException { final byte[] rowIdBytes = serialize(key, keySerializer); final HBaseRowHandler handler = new HBaseRowHandler(); final List<Column> columnsList = new ArrayList<Column>(0); hBaseClientService.scan(hBaseCacheTableName, rowIdBytes, rowIdBytes, columnsList, authorizations, handler); if (handler.numRows() > 1) { throw new IOException("Found multiple rows in HBase for key"); } else if(handler.numRows() == 1) { return deserialize( handler.getLastResultBytes(), valueDeserializer); } else { return null; } }
@Override public <K> boolean containsKey(final K key, final Serializer<K> keySerializer) throws IOException { final byte[] rowIdBytes = serialize(key, keySerializer); final HBaseRowHandler handler = new HBaseRowHandler(); final List<Column> columnsList = new ArrayList<Column>(0); hBaseClientService.scan(hBaseCacheTableName, rowIdBytes, rowIdBytes, columnsList, authorizations, handler); return (handler.numRows() > 0); }
@Override public <K, V> void put(final K key, final V value, final Serializer<K> keySerializer, final Serializer<V> valueSerializer) throws IOException { List<PutColumn> putColumns = new ArrayList<PutColumn>(1); final byte[] rowIdBytes = serialize(key, keySerializer); final byte[] valueBytes = serialize(value, valueSerializer); final PutColumn putColumn = new PutColumn(hBaseColumnFamilyBytes, hBaseColumnQualifierBytes, valueBytes); putColumns.add(putColumn); hBaseClientService.put(hBaseCacheTableName, rowIdBytes, putColumns); }
@Override public <K, V> boolean putIfAbsent(final K key, final V value, final Serializer<K> keySerializer, final Serializer<V> valueSerializer) throws IOException { final byte[] rowIdBytes = serialize(key, keySerializer); final byte[] valueBytes = serialize(value, valueSerializer); final PutColumn putColumn = new PutColumn(hBaseColumnFamilyBytes, hBaseColumnQualifierBytes, valueBytes); return hBaseClientService.checkAndPut(hBaseCacheTableName, rowIdBytes, hBaseColumnFamilyBytes, hBaseColumnQualifierBytes, null, putColumn); }
@Override public <K, V> V get(final K key, final Serializer<K> keySerializer, final Deserializer<V> valueDeserializer) throws IOException { final byte[] rowIdBytes = serialize(key, keySerializer); final HBaseRowHandler handler = new HBaseRowHandler(); final List<Column> columnsList = new ArrayList<Column>(0); hBaseClientService.scan(hBaseCacheTableName, rowIdBytes, rowIdBytes, columnsList, authorizations, handler); if (handler.numRows() > 1) { throw new IOException("Found multiple rows in HBase for key"); } else if(handler.numRows() == 1) { return deserialize( handler.getLastResultBytes(), valueDeserializer); } else { return null; } }
@Override public <K, V> void put(final K key, final V value, final Serializer<K> keySerializer, final Serializer<V> valueSerializer) throws IOException { List<PutColumn> putColumns = new ArrayList<PutColumn>(1); final byte[] rowIdBytes = serialize(key, keySerializer); final byte[] valueBytes = serialize(value, valueSerializer); final PutColumn putColumn = new PutColumn(hBaseColumnFamilyBytes, hBaseColumnQualifierBytes, valueBytes); putColumns.add(putColumn); hBaseClientService.put(hBaseCacheTableName, rowIdBytes, putColumns); }
@Override public <K, V> boolean putIfAbsent(final K key, final V value, final Serializer<K> keySerializer, final Serializer<V> valueSerializer) throws IOException { final byte[] rowIdBytes = serialize(key, keySerializer); final byte[] valueBytes = serialize(value, valueSerializer); final PutColumn putColumn = new PutColumn(hBaseColumnFamilyBytes, hBaseColumnQualifierBytes, valueBytes); return hBaseClientService.checkAndPut(hBaseCacheTableName, rowIdBytes, hBaseColumnFamilyBytes, hBaseColumnQualifierBytes, null, putColumn); }
@Override public <K> boolean containsKey(final K key, final Serializer<K> keySerializer) throws IOException { final byte[] rowIdBytes = serialize(key, keySerializer); final HBaseRowHandler handler = new HBaseRowHandler(); final List<Column> columnsList = new ArrayList<Column>(0); hBaseClientService.scan(hBaseCacheTableName, rowIdBytes, rowIdBytes, columnsList, authorizations, handler); return (handler.numRows() > 0); }
/** * Note that the implementation of getAndPutIfAbsent is not atomic. * The putIfAbsent is atomic, but a getAndPutIfAbsent does a get and then a putIfAbsent. * If there is an existing value and it is updated in betweern the two steps, then the existing (unmodified) value will be returned. * If the existing value was deleted between the two steps, getAndPutIfAbsent will correctly return null. * This should not generally be an issue with cache processors such as DetectDuplicate. * */ @Override public <K, V> V getAndPutIfAbsent(final K key, final V value, final Serializer<K> keySerializer, final Serializer<V> valueSerializer, final Deserializer<V> valueDeserializer) throws IOException { // Between the get and the putIfAbsent, the value could be deleted or updated. // Logic below takes care of the deleted case but not the updated case. // This is probably fine since DistributedMapCache and DetectDuplicate expect to receive the original cache value // Could possibly be fixed by implementing AtomicDistributedMapCache (Map Cache protocol version 2) final V got = get(key, keySerializer, valueDeserializer); final boolean wasAbsent = putIfAbsent(key, value, keySerializer, valueSerializer); if (! wasAbsent) return got; else return null; }
@Override public void delete(final String tableName, final byte[] rowId) throws IOException { delete(tableName, rowId, null); }
@Override public void delete(final String tableName, final byte[] rowId) throws IOException { delete(tableName, rowId, null); }
@Override public void scan(final String tableName, final Collection<Column> columns, final String filterExpression, final long minTime, final ResultHandler handler) throws IOException { scan(tableName, columns, filterExpression, minTime, null, handler); }
protected String getKey() { return "getHBase-" + getIdentifier() + "-state"; }
protected byte[] getRow(final String row, final String encoding) { //check to see if we need to modify the rowKey before we pass it down to the PutFlowFile byte[] rowKeyBytes = null; if(BINARY_ENCODING_VALUE.contentEquals(encoding)){ rowKeyBytes = clientService.toBytesBinary(row); }else{ rowKeyBytes = row.getBytes(StandardCharsets.UTF_8); } return rowKeyBytes; } /**
@Override protected List<PropertyDescriptor> getSupportedPropertyDescriptors() { final List<PropertyDescriptor> properties = super.getSupportedPropertyDescriptors(); properties.add(ROW_ID_LOCATION); properties.add(FLOWFILE_FETCH_COUNT); properties.add(BATCH_SIZE); properties.add(KEY_SEPARATOR); properties.add(VISIBLITY_LABEL); properties.add(CHARSET); return properties; }
@Override public void delete(String tableName, List<byte[]> rowIds) throws IOException { delete(tableName, rowIds); }
@Override public void delete(String tableName, List<byte[]> rowIds) throws IOException { delete(tableName, rowIds); }