in oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/measure/BanyanDBMetricsDAO.java [66:146]
public List<Metrics> multiGet(Model model, List<Metrics> metrics) throws IOException {
MetadataRegistry.Schema schema = MetadataRegistry.INSTANCE.findMetadata(model);
if (schema == null) {
throw new IOException(model.getName() + " is not registered");
}
final Map<String, List<String>> seriesIDColumns = new HashMap<>();
if (model.getBanyanDBModelExtension().isStoreIDTag()) {
seriesIDColumns.put(BanyanDBConverter.ID, new ArrayList<>());
} else {
model.getColumns().forEach(c -> {
BanyanDBExtension ext = c.getBanyanDBExtension();
if (ext == null) {
return;
}
if (ext.isSeriesID()) {
seriesIDColumns.put(c.getColumnName().getName(), new ArrayList<>());
}
});
if (seriesIDColumns.isEmpty()) {
seriesIDColumns.put(ENTITY_ID, new ArrayList<>());
}
}
String tc = model.getBanyanDBModelExtension().getTimestampColumn();
final String tsCol = Strings.isBlank(tc) ? TIME_BUCKET : tc;
long begin = 0L, end = 0L;
StringBuilder idStr = new StringBuilder();
for (Metrics m : metrics) {
List<StorageID.Fragment> fragments = m.id().read();
if (model.getBanyanDBModelExtension().isStoreIDTag()) {
if (fragments.size() != 1) {
log.error("[{}]fragments' size is more than expected", fragments);
continue;
}
Object val = fragments.get(0).getValue();
fragments = Arrays.asList(new StorageID.Fragment(
new String[]{BanyanDBConverter.ID},
String.class,
true,
val));
}
AnalyticalResult result = analyze(fragments, tsCol, seriesIDColumns);
idStr.append(result.cols()).append("=").append(m.id().build()).append(",");
if (!result.success) {
continue;
}
if (begin == 0 || result.begin < begin) {
begin = result.begin;
}
if (end == 0 || result.end > end) {
end = result.end;
}
}
TimestampRange timestampRange = null;
if (begin != 0L || end != 0L) {
timestampRange = new TimestampRange(begin, end);
} else {
log.info("{}[{}] will scan all blocks", model.getName(), idStr);
}
List<Metrics> metricsInStorage = new ArrayList<>(metrics.size());
MeasureQueryResponse resp = query(false, schema, schema.getTags(), schema.getFields(), timestampRange, new QueryBuilder<MeasureQuery>() {
@Override
protected void apply(MeasureQuery query) {
seriesIDColumns.entrySet().forEach(entry -> {
if (!entry.getValue().isEmpty()) {
query.or(in(entry.getKey(), entry.getValue()));
}
});
}
});
if (resp.size() == 0) {
return Collections.emptyList();
}
for (final DataPoint dataPoint : resp.getDataPoints()) {
metricsInStorage.add(storageBuilder.storage2Entity(new BanyanDBConverter.StorageToMeasure(schema, dataPoint)));
}
return metricsInStorage;
}