use of io.cdap.cdap.spi.data.table.field.Range in project cdap by cdapio.
the class AppMetadataStore method scanActiveRuns.
/**
* Scans active runs, starting from the given cursor.
*
* @param cursor the cursor to start the scan. A cursor can be obtained
* from the call to the given {@link BiConsumer} for some previous scan, or use
* {@link Cursor#EMPTY} to start a scan at the beginning.
* @param limit maximum number of records to scan
* @param consumer a {@link BiConsumer} to consume the scan result
* @throws IOException if failed to query the storage
*/
public void scanActiveRuns(Cursor cursor, int limit, BiConsumer<Cursor, RunRecordDetail> consumer) throws IOException {
Collection<Field<?>> begin = cursor.fields;
if (begin.isEmpty()) {
begin = getRunRecordStatusPrefix(TYPE_RUN_RECORD_ACTIVE);
}
Range range = Range.create(begin, cursor.bound, getRunRecordStatusPrefix(TYPE_RUN_RECORD_ACTIVE), Range.Bound.INCLUSIVE);
StructuredTable table = getRunRecordsTable();
try (CloseableIterator<StructuredRow> iterator = table.scan(range, limit)) {
while (iterator.hasNext()) {
StructuredRow row = iterator.next();
consumer.accept(new Cursor(row.getPrimaryKeys(), Range.Bound.EXCLUSIVE), deserializeRunRecordMeta(row));
}
}
}
use of io.cdap.cdap.spi.data.table.field.Range in project cdap by cdapio.
the class AppMetadataStore method scanApplications.
/**
* Scans applications. Allows to optionally set namespace / filters and implement pagination. For pagination
* set {@link ScanApplicationsRequest#getScanFrom()} to the last application id of the previous page.
*
* @param request parameters defining filters and sorting
* @param func a {@link Function} to consume application metadata entries generated by the scan. The boolean
* value returned is {@code true}, the scan will continue; otherwise the scan will stop and return.
* Note that the parameter is a {@link Map.Entry} to allow lazy deserialization of
* {@link ApplicationMeta} and it should not be replaced with {@link BiFunction}.
* @see ScanApplicationsRequest#builder(ScanApplicationsRequest) to create a next page / batch request
* @throws IOException if failed to scan the storage
*/
public void scanApplications(ScanApplicationsRequest request, Function<Map.Entry<ApplicationId, ApplicationMeta>, Boolean> func) throws IOException {
Range.Bound startBound = Range.Bound.INCLUSIVE;
Collection<Field<?>> startFields = request.getNamespaceId() == null ? Collections.emptyList() : Collections.singletonList(Fields.stringField(StoreDefinition.AppMetadataStore.NAMESPACE_FIELD, request.getNamespaceId().getNamespace()));
Range.Bound endBound = Range.Bound.INCLUSIVE;
Collection<Field<?>> endFields = startFields;
if (request.getScanFrom() != null) {
if (request.getNamespaceId() != null && !request.getNamespaceId().equals(request.getScanFrom().getNamespaceId())) {
throw new IllegalArgumentException("Requested to start scan from application " + request.getScanFrom() + " that is outside of scan namespace " + request.getNamespaceId());
}
startBound = Range.Bound.EXCLUSIVE;
startFields = getApplicationPrimaryKeys(request.getScanFrom());
}
if (request.getScanTo() != null) {
if (request.getNamespaceId() != null && !request.getNamespaceId().equals(request.getScanTo().getNamespaceId())) {
throw new IllegalArgumentException("Requested to finish scan at application " + request.getScanTo() + " that is outside of scan namespace " + request.getNamespaceId());
}
endBound = Range.Bound.EXCLUSIVE;
endFields = getApplicationPrimaryKeys(request.getScanTo());
}
Range range;
if (request.getSortOrder() == SortOrder.ASC) {
range = Range.create(startFields, startBound, endFields, endBound);
} else {
range = Range.create(endFields, endBound, startFields, startBound);
}
// As of now this is where we push filter to. it does not go to the StructuredTable,
// but we don't deserialize ApplicationMeta unless needed
Predicate<AppScanEntry> scanEntryPredicate = e -> true;
for (ApplicationFilter filter : request.getFilters()) {
if (filter instanceof ApplicationFilter.ApplicationIdFilter) {
scanEntryPredicate = scanEntryPredicate.and(e -> ((ApplicationFilter.ApplicationIdFilter) filter).test(e.getKey()));
} else if (filter instanceof ApplicationFilter.ArtifactIdFilter) {
scanEntryPredicate = scanEntryPredicate.and(e -> ((ApplicationFilter.ArtifactIdFilter) filter).test(e.getValue().getSpec().getArtifactId()));
} else {
throw new UnsupportedOperationException("Application filter " + filter + " is not supported");
}
}
StructuredTable table = getApplicationSpecificationTable();
int limit = request.getLimit();
try (CloseableIterator<StructuredRow> iterator = table.scan(range, Integer.MAX_VALUE, request.getSortOrder())) {
boolean keepScanning = true;
while (iterator.hasNext() && keepScanning && limit > 0) {
StructuredRow row = iterator.next();
AppScanEntry scanEntry = new AppScanEntry(row);
if (scanEntryPredicate.test(scanEntry)) {
keepScanning = func.apply(scanEntry);
limit--;
}
}
}
}
use of io.cdap.cdap.spi.data.table.field.Range in project cdap by cdapio.
the class ConfigTable method list.
public List<Config> list(String namespace, String type) throws IOException {
List<Field<?>> scanStart = new ArrayList<>(2);
scanStart.add(Fields.stringField(StoreDefinition.ConfigStore.NAMESPACE_FIELD, namespace));
scanStart.add(Fields.stringField(StoreDefinition.ConfigStore.TYPE_FIELD, type));
Range range = Range.singleton(scanStart);
try (CloseableIterator<StructuredRow> iter = table.scan(range, Integer.MAX_VALUE)) {
List<Config> result = new ArrayList<>();
while (iter.hasNext()) {
StructuredRow row = iter.next();
result.add(fromRow(row));
}
return result;
}
}
use of io.cdap.cdap.spi.data.table.field.Range in project cdap by cdapio.
the class ConnectionStore method listConnections.
/**
* Get all the connections in the given namespace
*
* @param namespace the namespace to look up
* @return the list of connections in this namespace
*/
public List<Connection> listConnections(NamespaceSummary namespace) {
return TransactionRunners.run(transactionRunner, context -> {
StructuredTable table = context.getTable(TABLE_ID);
Range range = Range.singleton(getNamespaceKeys(namespace));
List<Connection> connections = new ArrayList<>();
try (CloseableIterator<StructuredRow> rowIter = table.scan(range, Integer.MAX_VALUE)) {
rowIter.forEachRemaining(structuredRow -> connections.add(GSON.fromJson(structuredRow.getString(CONNECTION_DATA_FIELD), Connection.class)));
}
return connections;
});
}
use of io.cdap.cdap.spi.data.table.field.Range in project cdap by cdapio.
the class ArtifactStore method getPluginClasses.
/**
* Get all plugin classes of the given type that extend the given parent artifact.
* Results are returned as a map from plugin artifact to plugins in that artifact.
*
* @param namespace the namespace to search for plugins. The system namespace is always included
* @param parentArtifactId the id of the artifact to find plugins for
* @param type the type of plugin to look for or {@code null} for matching any type
* @return an unmodifiable map of plugin artifact to plugin classes for all plugin classes accessible by the
* given artifact. The map will never be null. If there are no plugin classes, an empty map will be returned.
* @throws ArtifactNotFoundException if the artifact to find plugins for does not exist
* @throws IOException if there was an exception reading metadata from the metastore
*/
public SortedMap<ArtifactDescriptor, Set<PluginClass>> getPluginClasses(NamespaceId namespace, Id.Artifact parentArtifactId, @Nullable String type) throws ArtifactNotFoundException, IOException {
return TransactionRunners.run(transactionRunner, context -> {
StructuredTable artifactDataTable = getTable(context, StoreDefinition.ArtifactStore.ARTIFACT_DATA_TABLE);
SortedMap<ArtifactDescriptor, Set<PluginClass>> plugins = getPluginsInArtifact(artifactDataTable, parentArtifactId, input -> (type == null || type.equals(input.getType())) && isAllowed(input));
// Scan plugins
StructuredTable pluginTable = getTable(context, StoreDefinition.ArtifactStore.PLUGIN_DATA_TABLE);
try (CloseableIterator<StructuredRow> iterator = pluginTable.scan(createPluginScanRange(parentArtifactId, type), Integer.MAX_VALUE)) {
while (iterator.hasNext()) {
StructuredRow row = iterator.next();
addPluginToMap(namespace, parentArtifactId, plugins, row);
}
}
// Scan universal plugins
StructuredTable uniPluginTable = getTable(context, StoreDefinition.ArtifactStore.UNIV_PLUGIN_DATA_TABLE);
List<Range> ranges = Arrays.asList(createUniversalPluginScanRange(namespace.getNamespace(), type), createUniversalPluginScanRange(NamespaceId.SYSTEM.getNamespace(), type));
for (Range range : ranges) {
try (CloseableIterator<StructuredRow> iterator = uniPluginTable.scan(range, Integer.MAX_VALUE)) {
while (iterator.hasNext()) {
StructuredRow row = iterator.next();
addPluginToMap(namespace, parentArtifactId, plugins, row);
}
}
}
return Collections.unmodifiableSortedMap(plugins);
}, ArtifactNotFoundException.class, IOException.class);
}
Aggregations