Описание проблемы
Context
Я пытаюсь визуализировать большой набор данных значений X-Y с помощью диаграмм Ваадина.
Я хотел бы иметь возможность загружать лениво значения, которые будут загружены, так как набор данных большой. Этого можно достичь, установив окно исправлений и позволяя пользователю изменять даты. Поэтому, если пользователь выбирает startDate и endDate через RangeSelector , должны загружаться только эти значения.
Текущий подход
Каждая точка моделируется как:
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;}
}
Я пытаюсь следовать подходу, подобному тому, который использовался для реализации отложенной загрузки в сетке Ваадина. https://vaadin.com/blog/lazy-loading-with-vaadin-8
Для реализации отложенной загрузки я создаю DataProvider и SeriesDataProvider, основанный на DataProvider.
Однако я не смог найти никакой документации или примеров относительно отложенной загрузки в Чартах. Я нашел некоторые заметки о DataProvider и SeriesDataProvider, но в них явно не упоминается отложенная загрузка. ListDataProvider, показанный в примерах, является решением в памяти без отложенной загрузки. https://vaadin.com/docs/v8/charts/java-api/charts-getting-started.html
Кроме того, я не могу определить, может ли этот подход использоваться для отложенной загрузки и возможна ли отложенная загрузка вообще в шкале времени диаграмм Vaadin с использованием Java-API.
Например, в Javadoc DataProviderSeries указано следующее:
Обратите внимание, что даже если вы используете ленивую загрузку 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();
}
}
Вопросы
Можно ли использовать отложенную загрузку на временной шкале, если да, то как? Существование DataProviderSeries и его связь с DataProvider предполагает, что это так. Однако Javadoc DataProviderSeries предлагает иное. (см. выше).
В серии DataProvider есть фильтр (введите F в приведенном выше коде), который передается внутри запроса в качестве аргумента. Как ввести фильтр, чтобы он передавался в качестве аргумента?