Search in sources :

Example 1 with JsTable

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));
    });
}
Also used : SelectOrUpdateRequest(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.SelectOrUpdateRequest) IntStream(java.util.stream.IntStream) JsRunnable(io.deephaven.web.shared.fu.JsRunnable) BatchTableRequest(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.BatchTableRequest) Arrays(java.util.Arrays) JsOptional(jsinterop.annotations.JsOptional) Promise(elemental2.promise.Promise) JsPropertyMap(jsinterop.base.JsPropertyMap) ArrayList(java.util.ArrayList) Callbacks(io.deephaven.web.client.api.Callbacks) JsProperty(jsinterop.annotations.JsProperty) TableReference(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.TableReference) Operation(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.batchtablerequest.Operation) JsTable(io.deephaven.web.client.api.JsTable) DeleteTableRequest(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.DeleteTableRequest) ResponseStreamWrapper(io.deephaven.web.client.api.barrage.stream.ResponseStreamWrapper) JsType(jsinterop.annotations.JsType) JsObject(elemental2.core.JsObject) SelectOrUpdateRequest(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.SelectOrUpdateRequest) Ticket(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket) ExportedTableCreationResponse(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ExportedTableCreationResponse) AddTableRequest(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.AddTableRequest) MergeTablesRequest(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.MergeTablesRequest) Column(io.deephaven.web.client.api.Column) JsIgnore(jsinterop.annotations.JsIgnore) List(java.util.List) Ticket(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket) JsRunnable(io.deephaven.web.shared.fu.JsRunnable) ArrayList(java.util.ArrayList) Operation(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.batchtablerequest.Operation) DeleteTableRequest(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.DeleteTableRequest) Promise(elemental2.promise.Promise) JsTable(io.deephaven.web.client.api.JsTable) TableReference(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.TableReference) BatchTableRequest(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.BatchTableRequest) ResponseStreamWrapper(io.deephaven.web.client.api.barrage.stream.ResponseStreamWrapper) MergeTablesRequest(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.MergeTablesRequest) JsObject(elemental2.core.JsObject)

Example 2 with JsTable

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);
    });
}
Also used : Arrays(java.util.Arrays) JsOptional(jsinterop.annotations.JsOptional) JsBiConsumer(io.deephaven.web.shared.fu.JsBiConsumer) HashMap(java.util.HashMap) HasEventHandling(io.deephaven.web.client.api.HasEventHandling) Promise(elemental2.promise.Promise) JsPropertyMap(jsinterop.base.JsPropertyMap) Callbacks(io.deephaven.web.client.api.Callbacks) JsProperty(jsinterop.annotations.JsProperty) HashSet(java.util.HashSet) Js(jsinterop.base.Js) FetchObjectResponse(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectResponse) WorkerConnection(io.deephaven.web.client.api.WorkerConnection) JsTable(io.deephaven.web.client.api.JsTable) Map(java.util.Map) JsType(jsinterop.annotations.JsType) NoSuchElementException(java.util.NoSuchElementException) LazyPromise(io.deephaven.web.client.fu.LazyPromise) JsObject(elemental2.core.JsObject) TableMap(io.deephaven.web.client.api.TableMap) AxisDescriptor(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor.AxisDescriptor) JsLog(io.deephaven.web.client.fu.JsLog) FigureDescriptor(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor) Set(java.util.Set) ClientTableState(io.deephaven.web.client.state.ClientTableState) CustomEventInit(elemental2.dom.CustomEventInit) ExportedTableCreationResponse(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ExportedTableCreationResponse) Collectors(java.util.stream.Collectors) JsArray(elemental2.core.JsArray) JsIgnore(jsinterop.annotations.JsIgnore) Stream(java.util.stream.Stream) Promise(elemental2.promise.Promise) LazyPromise(io.deephaven.web.client.fu.LazyPromise) JsTable(io.deephaven.web.client.api.JsTable) JsArray(elemental2.core.JsArray) CustomEventInit(elemental2.dom.CustomEventInit) JsIgnore(jsinterop.annotations.JsIgnore)

Example 3 with JsTable

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);
    }
}
Also used : JsTable(io.deephaven.web.client.api.JsTable) JsIgnore(jsinterop.annotations.JsIgnore)

Example 4 with JsTable

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();
    });
}
Also used : IThenable(elemental2.promise.IThenable) TableMap(io.deephaven.web.client.api.TableMap) RemoverFn(io.deephaven.web.shared.fu.RemoverFn) FigureDescriptor(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor) JsMethod(jsinterop.annotations.JsMethod) HashMap(java.util.HashMap) CustomEventInit(elemental2.dom.CustomEventInit) Promise(elemental2.promise.Promise) JsPropertyMap(jsinterop.base.JsPropertyMap) JsArray(elemental2.core.JsArray) ArrayList(java.util.ArrayList) Js(jsinterop.base.Js) FetchObjectResponse(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectResponse) JsTable(io.deephaven.web.client.api.JsTable) Map(java.util.Map) Collections(java.util.Collections) io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor) ArrayList(java.util.ArrayList) Promise(elemental2.promise.Promise) JsTable(io.deephaven.web.client.api.JsTable) RemoverFn(io.deephaven.web.shared.fu.RemoverFn) CustomEventInit(elemental2.dom.CustomEventInit) FetchObjectResponse(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectResponse) FigureDescriptor(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor)

Example 5 with JsTable

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));
    }
}
Also used : Callbacks(io.deephaven.web.client.api.Callbacks) JsProperty(jsinterop.annotations.JsProperty) TypedTicket(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.TypedTicket) JsVariableDefinition(io.deephaven.web.client.api.console.JsVariableDefinition) WorkerConnection(io.deephaven.web.client.api.WorkerConnection) JsVariableChanges(io.deephaven.web.client.api.console.JsVariableChanges) JsTable(io.deephaven.web.client.api.JsTable) JsMethod(jsinterop.annotations.JsMethod) ClientTableState(io.deephaven.web.client.state.ClientTableState) Promise(elemental2.promise.Promise) ExportedTableCreationResponse(io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ExportedTableCreationResponse) JsTable(io.deephaven.web.client.api.JsTable) JsVariableDefinition(io.deephaven.web.client.api.console.JsVariableDefinition) ClientTableState(io.deephaven.web.client.state.ClientTableState) JsMethod(jsinterop.annotations.JsMethod)

Aggregations

JsTable (io.deephaven.web.client.api.JsTable)9 Promise (elemental2.promise.Promise)7 ExportedTableCreationResponse (io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ExportedTableCreationResponse)5 Callbacks (io.deephaven.web.client.api.Callbacks)5 JsIgnore (jsinterop.annotations.JsIgnore)5 JsProperty (jsinterop.annotations.JsProperty)5 JsPropertyMap (jsinterop.base.JsPropertyMap)5 JsObject (elemental2.core.JsObject)4 CustomEventInit (elemental2.dom.CustomEventInit)4 FigureDescriptor (io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor)4 Arrays (java.util.Arrays)4 JsOptional (jsinterop.annotations.JsOptional)4 JsType (jsinterop.annotations.JsType)4 JsArray (elemental2.core.JsArray)3 FetchObjectResponse (io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectResponse)3 TableMap (io.deephaven.web.client.api.TableMap)3 WorkerConnection (io.deephaven.web.client.api.WorkerConnection)3 ClientTableState (io.deephaven.web.client.state.ClientTableState)3 AxisDescriptor (io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor.AxisDescriptor)2 AddTableRequest (io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.AddTableRequest)2