public List multiGet()

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;
    }