use of io.cdap.cdap.spi.data.table.field.Field in project cdap by caskdata.
the class WorkflowTable method getNeighbors.
/**
* Returns a map of WorkflowRunId to WorkflowRunRecord that are close to the WorkflowRunId provided by the user.
*
* @param id The workflow
* @param runId The runid of the workflow
* @param limit The limit on each side of the run that we want to see into
* @param timeInterval The time interval that we want the results to be spaced apart
* @return A Map of WorkflowRunId to the corresponding Workflow Run Record. A map is used so that duplicates of
* the WorkflowRunRecord are not obtained
*/
private Map<String, WorkflowRunRecord> getNeighbors(WorkflowId id, RunId runId, int limit, long timeInterval) throws IOException {
long startTime = RunIds.getTime(runId, TimeUnit.SECONDS);
Map<String, WorkflowRunRecord> workflowRunRecords = new HashMap<>();
int i = -limit;
long prevStartTime = startTime - (limit * timeInterval);
// The loop iterates across the range that is startTime - (limit * timeInterval) to
// startTime + (limit * timeInterval) since we want to capture all runs that started in this range.
// Since we want to stop getting the same key, we have the prevStartTime become 1 more than the time at which
// the last record was found if the (interval * the count of the loop) is less than the time.
long upperBound = startTime + (limit * timeInterval);
while (prevStartTime <= upperBound) {
List<Field<?>> lowerBoundFields = getPrimaryKeyFields(id, prevStartTime);
List<Field<?>> upperBoundFields = getPrimaryKeyFields(id, upperBound);
// last primary key which is numeric.
try (CloseableIterator<StructuredRow> iterator = table.scan(Range.create(lowerBoundFields, Range.Bound.INCLUSIVE, upperBoundFields, Range.Bound.INCLUSIVE), 1)) {
if (!iterator.hasNext()) {
return workflowRunRecords;
}
StructuredRow indexRow = iterator.next();
long timeOfNextRecord = indexRow.getLong(StoreDefinition.WorkflowStore.START_TIME_FIELD);
workflowRunRecords.put(indexRow.getString(StoreDefinition.WorkflowStore.RUN_ID_FIELD), getRunRecordFromRow(indexRow));
prevStartTime = startTime + (i * timeInterval) < timeOfNextRecord ? timeOfNextRecord + 1 : startTime + (i * timeInterval);
i++;
}
}
return workflowRunRecords;
}
use of io.cdap.cdap.spi.data.table.field.Field in project cdap by caskdata.
the class WorkflowTable method getRecord.
@Nullable
WorkflowRunRecord getRecord(WorkflowId id, String pid) throws IOException {
RunId runId = RunIds.fromString(pid);
long startTime = RunIds.getTime(runId, TimeUnit.SECONDS);
List<Field<?>> fields = getPrimaryKeyFields(id, startTime);
Optional<StructuredRow> indexRow = table.read(fields);
if (!indexRow.isPresent()) {
return null;
}
return getRunRecordFromRow(indexRow.get());
}
use of io.cdap.cdap.spi.data.table.field.Field in project cdap by caskdata.
the class AppMetadataStore method getRunRecordProgramPrefix.
private List<Field<?>> getRunRecordProgramPrefix(String status, @Nullable ProgramId programId) {
if (programId == null) {
return getRunRecordStatusPrefix(status);
}
List<Field<?>> fields = getRunRecordApplicationPrefix(status, new ApplicationId(programId.getNamespace(), programId.getApplication(), programId.getVersion()));
fields.add(Fields.stringField(StoreDefinition.AppMetadataStore.PROGRAM_TYPE_FIELD, programId.getType().name()));
fields.add(Fields.stringField(StoreDefinition.AppMetadataStore.PROGRAM_FIELD, programId.getProgram()));
return fields;
}
use of io.cdap.cdap.spi.data.table.field.Field in project cdap by caskdata.
the class AppMetadataStore method delete.
private void delete(RunRecordDetail record) throws IOException {
ProgramRunId programRunId = record.getProgramRunId();
List<Field<?>> key = getProgramRunInvertedTimeKey(STATUS_TYPE_MAP.get(record.getStatus()), programRunId, record.getStartTs());
getRunRecordsTable().delete(key);
}
use of io.cdap.cdap.spi.data.table.field.Field in project cdap by caskdata.
the class AppMetadataStore method getProgramRunCounts.
/**
* Get the run counts of the given program collections.
*
* @param programIds the collection of program ids to get the program
* @return the map of the program id to its run count
*/
public Map<ProgramId, Long> getProgramRunCounts(Collection<ProgramId> programIds) throws BadRequestException, IOException {
if (programIds.size() > 100) {
throw new BadRequestException(String.format("%d programs found, the maximum number supported is 100", programIds.size()));
}
Map<ProgramId, Long> result = programIds.stream().collect(Collectors.toMap(id -> id, id -> 0L, (v1, v2) -> 0L, LinkedHashMap::new));
List<List<Field<?>>> multiKeys = programIds.stream().map(id -> getProgramCountPrimaryKeys(TYPE_COUNT, id)).collect(Collectors.toList());
for (StructuredRow row : getProgramCountsTable().multiRead(multiKeys)) {
ProgramId programId = getApplicationIdFromRow(row).program(ProgramType.valueOf(row.getString(StoreDefinition.AppMetadataStore.PROGRAM_TYPE_FIELD)), row.getString(StoreDefinition.AppMetadataStore.PROGRAM_FIELD));
result.put(programId, row.getLong(StoreDefinition.AppMetadataStore.COUNTS));
}
return result;
}
Aggregations