use of io.deephaven.web.client.api.TableMap in project deephaven-core by deephaven.
the class JsFigureFactory method create.
private static Promise<JsFigure> create(JsFigureDescriptor descriptor) {
JsArray<JsTable> tables = descriptor.getTables();
if (tables == null || tables.length == 0) {
return (Promise<JsFigure>) (Promise) Promise.reject("No tables provided for Figure creation");
}
FigureDescriptor figureDescriptor = convertJsFigureDescriptor(descriptor);
FetchObjectResponse response = new FetchObjectResponse();
response.setData(figureDescriptor.serializeBinary());
Promise<?>[] tableCopyPromises = tables.map((table, index, all) -> table.copy(false)).asArray(new Promise[0]);
return Promise.all(tableCopyPromises).then(unknownTableCopies -> {
JsArray<JsTable> jsTableCopies = Js.cast(unknownTableCopies);
JsTable[] tableCopies = jsTableCopies.asArray(new JsTable[0]);
return new JsFigure(c -> c.apply(null, response), (figure, descriptor1) -> {
// We need to listen for disconnects and reconnects
boolean[] isTableDisconnected = new boolean[tableCopies.length];
ArrayList<RemoverFn> removerFns = new ArrayList<>(tableCopies.length * 3);
for (int i = 0; i < tableCopies.length; i++) {
final int tableIndex = i;
// Tables are closed when the figure is closed, no need to remove listeners later
removerFns.add(tableCopies[i].addEventListener(JsTable.EVENT_DISCONNECT, ignore -> {
isTableDisconnected[tableIndex] = true;
for (int j = 0; j < isTableDisconnected.length; j++) {
if (isTableDisconnected[j] && j != tableIndex) {
return;
}
}
figure.fireEvent(JsFigure.EVENT_DISCONNECT);
figure.unsubscribe();
}));
removerFns.add(tableCopies[i].addEventListener(JsTable.EVENT_RECONNECT, ignore -> {
isTableDisconnected[tableIndex] = false;
for (int j = 0; j < isTableDisconnected.length; j++) {
if (isTableDisconnected[j]) {
return;
}
}
try {
figure.verifyTables();
figure.fireEvent(JsFigure.EVENT_RECONNECT);
figure.enqueueSubscriptionCheck();
} catch (JsFigure.FigureSourceException e) {
final CustomEventInit init = CustomEventInit.create();
init.setDetail(e);
figure.fireEvent(JsFigure.EVENT_RECONNECTFAILED, init);
}
}));
removerFns.add(tableCopies[i].addEventListener(JsTable.EVENT_RECONNECTFAILED, err -> {
for (RemoverFn removerFn : removerFns) {
removerFn.remove();
}
figure.unsubscribe();
final CustomEventInit init = CustomEventInit.create();
init.setDetail(err);
figure.fireEvent(JsFigure.EVENT_RECONNECTFAILED, init);
}));
}
return Promise.resolve(new JsFigure.FigureTableFetchData(tableCopies, new TableMap[0], Collections.emptyMap()));
}).refetch();
});
}
use of io.deephaven.web.client.api.TableMap in project deephaven-core by deephaven.
the class JsMultiSeries method requestTable.
private void requestTable(TableMap tableMap, Object key) {
// TODO ask the server in parallel for the series name
String seriesName = descriptor.getName() + ": " + key;
tableMap.getTable(key).then(table -> {
SeriesDescriptor seriesInstance = new SeriesDescriptor();
seriesInstance.setName(seriesName);
seriesInstance.setPlotStyle(getPlotStyle());
seriesInstance.setLineColor(getOrDefault(seriesName, descriptor.getLineColor()));
seriesInstance.setShapeColor(getOrDefault(seriesName, descriptor.getPointColor()));
seriesInstance.setLinesVisible(getOrDefault(seriesName, descriptor.getLinesVisible()));
seriesInstance.setShapesVisible(getOrDefault(seriesName, descriptor.getPointsVisible()));
Boolean gradientVisible = getOrDefault(seriesName, descriptor.getGradientVisible());
if (gradientVisible != null) {
seriesInstance.setGradientVisible(gradientVisible);
}
seriesInstance.setYToolTipPattern(getOrDefault(seriesName, descriptor.getYToolTipPattern()));
seriesInstance.setXToolTipPattern(getOrDefault(seriesName, descriptor.getXToolTipPattern()));
seriesInstance.setShapeLabel(getOrDefault(seriesName, descriptor.getPointLabel()));
seriesInstance.setShapeSize(getOrDefault(seriesName, descriptor.getPointSize()));
seriesInstance.setShape(getOrDefault(seriesName, descriptor.getPointShape()));
seriesInstance.setPointLabelFormat(getOrDefault(seriesName, descriptor.getPointLabelFormat()));
int tableId = figure.registerTable(table);
seriesInstance.setDataSourcesList(descriptor.getDataSourcesList().map((multiSeriesSource, p1, p2) -> {
SourceDescriptor sourceDescriptor = new SourceDescriptor();
sourceDescriptor.setColumnName(multiSeriesSource.getColumnName());
sourceDescriptor.setAxisId(multiSeriesSource.getAxisId());
sourceDescriptor.setTableId(tableId);
sourceDescriptor.setType(multiSeriesSource.getType());
return sourceDescriptor;
}));
JsSeries series = new JsSeries(seriesInstance, figure, axes);
series.setMultiSeries(this);
series.initSources(Collections.singletonMap(tableId, table), Collections.emptyMap());
CustomEventInit init = CustomEventInit.create();
init.setDetail(series);
parent.addSeriesFromMultiSeries(series);
figure.fireEvent(JsFigure.EVENT_SERIES_ADDED, init);
parent.fireEvent(JsChart.EVENT_SERIES_ADDED, init);
return null;
});
}
use of io.deephaven.web.client.api.TableMap in project deephaven-core by deephaven.
the class JsMultiSeries method initSources.
@JsIgnore
public void initSources(Map<Integer, TableMap> plotHandlesToTableMaps) {
descriptor.getDataSourcesList().asList().stream().mapToInt(MultiSeriesSourceDescriptor::getTableMapId).distinct().forEach(plotHandle -> {
TableMap tableMap = plotHandlesToTableMaps.get(plotHandle);
tableMap.getKeys().forEach((p0, p1, p2) -> {
requestTable(tableMap, p0);
return null;
});
tableMap.addEventListener(TableMap.EVENT_KEYADDED, event -> {
requestTable(tableMap, ((CustomEvent) event).detail);
});
});
}
Aggregations