2

问题描述

语境

我正在尝试使用 Vaadin 图表可视化大型 XY 值数据集。由于数据集很大,我希望能够延迟加载将要加载的值。这可以通过设置修复窗口并允许用户更改日期来实现。因此,如果用户通过RangeSelector选择 startDate 和 endDate,则仅应加载这些值。

当前方法

每个点被建模为:

public final class TimestampedDoubleValue{
         private final long timestampInMillis;
         private final long value; 

         public TimestampedDoubleValue(long timestampInMillis,long value){
            this.value=value;
            this.timestampInMillis=timestampInMillis;
         }

         public final long getTimestampInMillis {return timestampInMillis;}
         public final long getValue {return value;}

}

我尝试采用类似于在 Vaadin Grid 中实现延迟加载的方法。https://vaadin.com/blog/lazy-loading-with-vaadin-8

为了实现延迟加载,我创建了一个 DataProvider 和一个基于 DataProvider 的 SeriesDataProvider。

但是,我在 Charts 中找不到任何有关延迟加载的文档或示例。我在 DataProvider 和 SeriesDataProvider 上找到了一些注释,但它们没有明确提到延迟加载。示例中显示的 ListDataProvider 是没有延迟加载的内存解决方案。https://vaadin.com/docs/v8/charts/java-api/charts-getting-started.html

此外,我无法确定这种方法是否可用于延迟加载,以及是否可以使用 java API 在 Vaadin Charts Timeline 中进行延迟加载。

例如,DataProviderSeries Javadoc 特别声明了以下内容:

请注意,即使您使用延迟加载 DataProvider,本系列也将以一种急切的方式工作,并一次从提供程序加载所有数据。

https://demo.vaadin.com/javadoc/com.vaadin/vaadin-charts/4.0.1/com/vaadin/addon/charts/model/DataProviderSeries.html

public class TimeseriesDataProvider<F> extends AbstractBackEndDataProvider<TimestampedDoubleValue, F> {

public final DataProviderSeries<TimestampedDoubleValue> getDataProviderSeries() {
    final DataProviderSeries<TimestampedDoubleValue> dataProviderSeries = new DataProviderSeries<>(this);
    dataProviderSeries.setX(TimestampedDoubleValue::getTimestampInMillis);
    dataProviderSeries.setY(TimestampedDoubleValue::getValue);
    dataProviderSeries.setAutomaticChartUpdateEnabled(true);

    return dataProviderSeries;
}

 /*
 * @see com.vaadin.data.provider.DataProvider#isInMemory()
 */
@Override
public final boolean isInMemory() {
    return false;
}

/*
 * @see com.vaadin.data.provider.AbstractBackEndDataProvider#fetchFromBackEnd(com.vaadin.data.provider.Query)
 */
@Override
protected Stream<TimestampedDoubleValue> fetchFromBackEnd(final Query<TimestampedDoubleValue, F> query) {
   return FetchService.streamResults();

}

/* 
 * @see com.vaadin.data.provider.AbstractBackEndDataProvider#sizeInBackEnd(com.vaadin.data.provider.Query)
 */
@Override
protected int sizeInBackEnd(final Query<TimestampedDoubleValue, F> query) {
            return FetchService.countInBackend();
}

}

问题

  1. 是否可以在时间轴中使用延迟加载,如果可以,如何?DataProviderSeries 的存在及其与 DataProvider 的联系表明它确实存在。然而,DataProviderSeries 的 Javadoc 另有建议。(看上面)。

  2. 在 DataProvider 系列中,有一个过滤器(上面代码中的类型 F)作为参数在查询内部传递。如何引入过滤器以便将其作为参数传递?

4

0 回答 0