问题说明
上下文
我正在尝试使用Vaadin Charts可视化大型X-Y值数据集。 我希望能够懒得加载由于数据集很大而将加载的值。这可以通过设置修复窗口并允许用户更改日期来实现。因此,如果用户通过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。
但是我在图表中找不到任何关于延迟加载的文档或示例。我在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类型),它作为参数在查询中传递。如何引入过滤器以便将其作为参数传递?