use of io.cdap.cdap.spi.data.table.field.Range in project cdap by caskdata.
the class PostgreSqlStructuredTable method getCountStatement.
private String getCountStatement(Collection<Range> ranges) {
StringBuilder statement = new StringBuilder("SELECT COUNT(*) FROM ").append(tableSchema.getTableId().getName());
boolean whereAdded = false;
for (Range range : ranges) {
fieldValidator.validatePrimaryKeys(range.getBegin(), true);
fieldValidator.validatePrimaryKeys(range.getEnd(), true);
if (!range.getBegin().isEmpty() || !range.getEnd().isEmpty()) {
if (!whereAdded) {
// first WHERE condition
statement.append(" WHERE ");
whereAdded = true;
} else {
// subsequent WHERE conditions
statement.append(" OR ");
}
appendRange(statement, range);
}
}
return statement.toString();
}
use of io.cdap.cdap.spi.data.table.field.Range in project cdap by caskdata.
the class ArtifactStore method addPluginsInRangeToMap.
private void addPluginsInRangeToMap(final NamespaceId namespace, List<Id.Artifact> parentArtifacts, Iterator<StructuredRow> iterator, SortedMap<ArtifactDescriptor, PluginClass> plugins, @Nullable Predicate<io.cdap.cdap.proto.id.ArtifactId> range, int limit) {
// if predicate is null,
// filter out plugins whose artifacts are not in the system namespace and not in this namespace
range = range != null ? range : input -> NamespaceId.SYSTEM.equals(input.getParent()) || input.getParent().equals(namespace);
while (iterator.hasNext()) {
StructuredRow row = iterator.next();
ImmutablePair<ArtifactDescriptor, PluginData> pluginPair = getPlugin(row, range);
if (pluginPair == null) {
continue;
}
PluginData pluginData = pluginPair.getSecond();
// filter out plugins that don't extend this version of the parent artifact
for (Id.Artifact parentArtifactId : parentArtifacts) {
if (pluginData.isUsableBy(parentArtifactId.toEntityId()) && isAllowed(pluginData.pluginClass)) {
plugins.put(pluginPair.getFirst(), pluginData.pluginClass);
break;
}
}
if (limit < plugins.size()) {
plugins.remove(plugins.lastKey());
}
}
}
use of io.cdap.cdap.spi.data.table.field.Range in project cdap by caskdata.
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);
}
use of io.cdap.cdap.spi.data.table.field.Range in project cdap by caskdata.
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 caskdata.
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;
}
}
Aggregations