use of io.cdap.cdap.api.dataset.table.Row in project cdap by cdapio.
the class IndexedObjectStore method readAllByIndex.
/**
* Read all the objects from the objectStore for a given index. Returns all the objects that match the secondaryKey.
* Returns an empty list if no values are found. Never returns null.
*
* @param secondaryKey for the lookup.
* @return List of Objects matching the secondaryKey.
*/
@ReadOnly
public List<T> readAllByIndex(byte[] secondaryKey) {
List<T> resultList = new ArrayList<>();
// Lookup the secondaryKey and get all the keys in primary
// Each row with secondaryKey as rowKey contains column named as the primary key
// of every object that can be looked up using the secondaryKey
Row row = index.get(secondaryKey);
// if the index has no match, return nothing
if (!row.isEmpty()) {
resultList = row.getColumns().keySet().stream().map(objectStore::read).collect(Collectors.toList());
}
return Collections.unmodifiableList(resultList);
}
use of io.cdap.cdap.api.dataset.table.Row in project cdap by cdapio.
the class IndexedTable method delete.
@WriteOnly
@Override
public void delete(byte[] row) {
Row existingRow = table.get(row);
if (existingRow.isEmpty()) {
// no row to delete
return;
}
// delete all index entries
deleteIndexEntries(existingRow);
// delete the row
table.delete(row);
}
use of io.cdap.cdap.api.dataset.table.Row in project cdap by cdapio.
the class KeyValueTable method scan.
/**
* Scans table.
* @param startRow start row inclusive. {@code null} means start from first row of the table
* @param stopRow stop row exclusive. {@code null} means scan all rows to the end of the table
* @return {@link io.cdap.cdap.api.dataset.lib.CloseableIterator} of
* {@link KeyValue KeyValue<byte[], byte[]>}
*/
public CloseableIterator<KeyValue<byte[], byte[]>> scan(byte[] startRow, byte[] stopRow) {
final Scanner scanner = table.scan(startRow, stopRow);
return new AbstractCloseableIterator<KeyValue<byte[], byte[]>>() {
private boolean closed = false;
@Override
protected KeyValue<byte[], byte[]> computeNext() {
if (closed) {
return endOfData();
}
Row next = scanner.next();
if (next != null) {
return new KeyValue<>(next.getRow(), next.get(KEY_COLUMN));
}
close();
return null;
}
@Override
public void close() {
scanner.close();
endOfData();
closed = true;
}
};
}
use of io.cdap.cdap.api.dataset.table.Row in project cdap by cdapio.
the class DefaultPreviewStore method deleteExpiredData.
@Override
public void deleteExpiredData(long ttlInSeconds) {
Gson gson = new GsonBuilder().registerTypeAdapter(EntityId.class, new EntityIdTypeAdapter()).create();
byte[] startRowKey = new MDSKey.Builder().add(META_ROW_KEY_PREFIX).build().getKey();
byte[] stopRowKey = new MDSKey(Bytes.stopKeyForPrefix(startRowKey)).getKey();
long currentTimeInSeconds = System.currentTimeMillis() / 1000;
try (Scanner scanner = previewTable.scan(startRowKey, stopRowKey, null, null, null)) {
Row indexRow;
while ((indexRow = scanner.next()) != null) {
Map<byte[], byte[]> columns = indexRow.getColumns();
String applicationIdGson = Bytes.toString(columns.get(APPID));
if (applicationIdGson == null) {
continue;
}
ApplicationId applicationId = gson.fromJson(applicationIdGson, ApplicationId.class);
long applicationSubmitTime = RunIds.getTime(applicationId.getApplication(), TimeUnit.SECONDS);
if ((currentTimeInSeconds - applicationSubmitTime) > ttlInSeconds) {
remove(applicationId);
}
}
} catch (IOException e) {
throw new RuntimeException("Error while scanning the preview requests for deletion.", e);
}
}
use of io.cdap.cdap.api.dataset.table.Row in project cdap by cdapio.
the class DefaultPreviewStore method get.
@Override
public Map<String, List<JsonElement>> get(ApplicationId applicationId, String tracerName) {
// PreviewStore is a singleton and we have to create gson for each operation since gson is not thread safe.
Gson gson = new GsonBuilder().registerTypeAdapter(Schema.class, new SchemaTypeAdapter()).create();
byte[] startRowKey = getPreviewRowKeyBuilder(DATA_ROW_KEY_PREFIX, applicationId).add(tracerName).build().getKey();
byte[] stopRowKey = new MDSKey(Bytes.stopKeyForPrefix(startRowKey)).getKey();
Map<String, List<JsonElement>> result = new HashMap<>();
try (Scanner scanner = previewTable.scan(startRowKey, stopRowKey, null, null, null)) {
Row indexRow;
while ((indexRow = scanner.next()) != null) {
Map<byte[], byte[]> columns = indexRow.getColumns();
String propertyName = Bytes.toString(columns.get(PROPERTY));
JsonElement value = gson.fromJson(Bytes.toString(columns.get(VALUE)), JsonElement.class);
List<JsonElement> values = result.computeIfAbsent(propertyName, k -> new ArrayList<>());
values.add(value);
}
} catch (IOException e) {
String message = String.format("Error while reading preview data for application '%s' and tracer '%s'.", applicationId, tracerName);
throw new RuntimeException(message, e);
}
return result;
}
Aggregations