问题描述
语境
我正在尝试使用 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,本系列也将以一种急切的方式工作,并一次从提供程序加载所有数据。
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();
}
}
问题
是否可以在时间轴中使用延迟加载,如果可以,如何?DataProviderSeries 的存在及其与 DataProvider 的联系表明它确实存在。然而,DataProviderSeries 的 Javadoc 另有建议。(看上面)。
在 DataProvider 系列中,有一个过滤器(上面代码中的类型 F)作为参数在查询内部传递。如何引入过滤器以便将其作为参数传递?