use of io.deephaven.web.client.api.JsTable in project deephaven-core by deephaven.
the class JsInputTable method deleteTables.
public Promise<JsInputTable> deleteTables(JsTable[] tablesToDelete) {
if (tablesToDelete.length == 0) {
return Promise.resolve(this);
}
// for each table, make a view on that table of only key columns, then union the tables and drop together
final List<JsRunnable> cleanups = new ArrayList<>();
final Ticket ticketToDelete;
final Promise<?> failureToReport;
if (tablesToDelete.length == 1) {
JsTable onlyTable = tablesToDelete[0];
// don't try too hard to find matching columns, if it looks like we have a match go for it
if (onlyTable.getColumns().length == keys.length && onlyTable.findColumns(keys).length == keys.length) {
ticketToDelete = onlyTable.getHandle().makeTicket();
failureToReport = Promise.resolve((Object) null);
} else {
// view the only table
ticketToDelete = table.getConnection().getConfig().newTicket();
cleanups.add(() -> table.getConnection().releaseTicket(ticketToDelete));
SelectOrUpdateRequest view = new SelectOrUpdateRequest();
view.setSourceId(onlyTable.state().getHandle().makeTableReference());
view.setResultId(ticketToDelete);
view.setColumnSpecsList(keys);
failureToReport = Callbacks.grpcUnaryPromise(c -> table.getConnection().tableServiceClient().view(view, table.getConnection().metadata(), c::apply));
}
} else {
// there is more than one table here, construct a merge after making a view of each table
ticketToDelete = table.getConnection().getConfig().newTicket();
cleanups.add(() -> table.getConnection().releaseTicket(ticketToDelete));
BatchTableRequest batch = new BatchTableRequest();
for (int i = 0; i < tablesToDelete.length; i++) {
JsTable toDelete = tablesToDelete[i];
SelectOrUpdateRequest view = new SelectOrUpdateRequest();
view.setSourceId(toDelete.state().getHandle().makeTableReference());
view.setColumnSpecsList(keys);
batch.addOps(new Operation()).setView(view);
}
MergeTablesRequest mergeRequest = new MergeTablesRequest();
mergeRequest.setSourceIdsList(IntStream.range(0, tablesToDelete.length).mapToObj(i -> {
TableReference ref = new TableReference();
ref.setBatchOffset(i);
return ref;
}).toArray(TableReference[]::new));
mergeRequest.setResultId(ticketToDelete);
batch.addOps(new Operation()).setMerge(mergeRequest);
failureToReport = new Promise<>((resolve, reject) -> {
ResponseStreamWrapper<ExportedTableCreationResponse> wrapper = ResponseStreamWrapper.of(table.getConnection().tableServiceClient().batch(batch, table.getConnection().metadata()));
wrapper.onData(response -> {
// kill the promise on the first failure we see
if (!response.getSuccess()) {
reject.onInvoke(response.getErrorInfo());
}
});
wrapper.onEnd(status -> resolve.onInvoke((Object) null));
});
}
// perform the delete on the current input table
DeleteTableRequest deleteRequest = new DeleteTableRequest();
deleteRequest.setInputTable(table.getHeadHandle().makeTicket());
deleteRequest.setTableToRemove(ticketToDelete);
return Callbacks.grpcUnaryPromise(c -> {
table.getConnection().inputTableServiceClient().deleteTableFromInputTable(deleteRequest, table.getConnection().metadata(), c::apply);
}).then(success -> {
cleanups.forEach(JsRunnable::run);
return Promise.resolve(this);
}, err -> {
cleanups.forEach(JsRunnable::run);
// call
return (Promise) failureToReport.then(ignore -> Promise.reject(err));
});
}
use of io.deephaven.web.client.api.JsTable in project deephaven-core by deephaven.
the class JsFigure method refetch.
@JsIgnore
public Promise<JsFigure> refetch() {
plotHandlesToTables = new HashMap<>();
return Callbacks.grpcUnaryPromise(fetch::fetch).then(response -> {
this.descriptor = FigureDescriptor.deserializeBinary(response.getData_asU8());
charts = descriptor.getChartsList().asList().stream().map(chartDescriptor -> new JsChart(chartDescriptor, this)).toArray(JsChart[]::new);
JsObject.freeze(charts);
return this.tableFetch.fetch(this, response);
}).then(tableFetchData -> {
// all tables are wired up, need to map them to the series instances
tables = tableFetchData.tables;
tableMaps = tableFetchData.tableMaps;
plotHandlesToTableMaps = tableFetchData.plotHandlesToTableMaps;
onClose = tableFetchData.onClose;
for (int i = 0; i < tables.length; i++) {
JsTable table = tables[i];
registerTableWithId(table, Js.cast(JsArray.of((double) i)));
}
Arrays.stream(charts).flatMap(c -> Arrays.stream(c.getSeries())).forEach(s -> s.initSources(plotHandlesToTables, plotHandlesToTableMaps));
Arrays.stream(charts).flatMap(c -> Arrays.stream(c.getMultiSeries())).forEach(s -> s.initSources(plotHandlesToTableMaps));
return null;
}).then(ignore -> {
unsuppressEvents();
fireEvent(EVENT_RECONNECT);
return Promise.resolve(this);
}, err -> {
final FigureFetchError fetchError = new FigureFetchError(LazyPromise.ofObject(err), this.descriptor != null ? this.descriptor.getErrorsList() : new JsArray<>());
final CustomEventInit init = CustomEventInit.create();
init.setDetail(fetchError);
unsuppressEvents();
fireEvent(EVENT_RECONNECTFAILED, init);
suppressEvents();
// noinspection unchecked,rawtypes
return (Promise<JsFigure>) (Promise) Promise.reject(fetchError);
});
}
use of io.deephaven.web.client.api.JsTable in project deephaven-core by deephaven.
the class JsFigure method enqueueSubscriptionCheck.
@JsIgnore
public void enqueueSubscriptionCheck() {
if (!subCheckEnqueued) {
for (JsTable table : tables) {
if (table.isClosed()) {
throw new IllegalStateException("Cannot subscribe, at least one table is disconnected");
}
}
subCheckEnqueued = true;
LazyPromise.runLater(this::updateSubscriptions);
}
}
use of io.deephaven.web.client.api.JsTable 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.JsTable in project deephaven-core by deephaven.
the class JsWidgetExportedObject method fetch.
@JsMethod
public Promise<?> fetch() {
if (getType().equals(JsVariableChanges.TABLE)) {
return Callbacks.<ExportedTableCreationResponse, Object>grpcUnaryPromise(c -> {
connection.tableServiceClient().getExportedTableCreationResponse(ticket.getTicket(), connection.metadata(), c::apply);
}).then(etcr -> {
ClientTableState cts = connection.newStateFromUnsolicitedTable(etcr, "table for widget");
JsTable table = new JsTable(connection, cts);
// never attempt a reconnect, since we might have a different widget schema entirely
table.addEventListener(JsTable.EVENT_DISCONNECT, ignore -> table.close());
return Promise.resolve(table);
});
} else {
return this.connection.getObject(new JsVariableDefinition(ticket.getType(), null, ticket.getTicket().getTicket_asB64(), null));
}
}
Aggregations