diff --git a/grpc-api/src/main/java/io/deephaven/grpc_api/table/inputtables/InputTableServiceGrpcImpl.java b/grpc-api/src/main/java/io/deephaven/grpc_api/table/inputtables/InputTableServiceGrpcImpl.java index 03e5f80b7f3..f9b9b55e462 100644 --- a/grpc-api/src/main/java/io/deephaven/grpc_api/table/inputtables/InputTableServiceGrpcImpl.java +++ b/grpc-api/src/main/java/io/deephaven/grpc_api/table/inputtables/InputTableServiceGrpcImpl.java @@ -64,6 +64,10 @@ public void addTableToInputTable(AddTableRequest request, StreamObserver { + responseObserver.onNext(AddTableResponse.getDefaultInstance()); + responseObserver.onCompleted(); + }); } catch (IOException ioException) { throw GrpcUtil.statusRuntimeException(Code.DATA_LOSS, "Error adding table to input table"); } @@ -111,6 +115,10 @@ public void deleteTableFromInputTable(DeleteTableRequest request, // actually delete the table's contents try { mutableInputTable.delete(tableToDelete); + GrpcUtil.safelyExecuteLocked(responseObserver, () -> { + responseObserver.onNext(DeleteTableResponse.getDefaultInstance()); + responseObserver.onCompleted(); + }); } catch (IOException ioException) { throw GrpcUtil.statusRuntimeException(Code.DATA_LOSS, "Error deleting table from inputtable"); diff --git a/proto/raw-js-openapi/src/index.js b/proto/raw-js-openapi/src/index.js index 7cbd8e58a2b..af785cab82e 100644 --- a/proto/raw-js-openapi/src/index.js +++ b/proto/raw-js-openapi/src/index.js @@ -3,12 +3,14 @@ require("deephaven/proto/table_pb"); require("deephaven/proto/console_pb"); require("deephaven/proto/ticket_pb"); require("deephaven/proto/application_pb"); +require("deephaven/proto/inputtable_pb"); require("Flight_pb") require("BrowserFlight_pb") var sessionService = require("deephaven/proto/session_pb_service"); var tableService = require("deephaven/proto/table_pb_service"); var consoleService = require("deephaven/proto/console_pb_service"); var applicationService = require("deephaven/proto/application_pb_service"); +var inputTableService = require("deephaven/proto/inputtable_pb_service"); var browserFlightService = require("BrowserFlight_pb_service"); var flightService = require("Flight_pb_service"); @@ -33,6 +35,8 @@ var io = { deephaven: { ticket_pb: proto.io.deephaven.proto.backplane.grpc, application_pb: proto.io.deephaven.proto.backplane.grpc, application_pb_service: applicationService, + inputtable_pb: proto.io.deephaven.proto.backplane.grpc, + inputtable_pb_service: inputTableService, }, barrage: { "flatbuf": { diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/Column.java b/web/client-api/src/main/java/io/deephaven/web/client/api/Column.java index 3f929828907..1d4e70bc301 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/Column.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/Column.java @@ -32,6 +32,7 @@ public class Column { private String constituentType; private String description; + private final boolean isInputTableKeyColumn; @JsMethod(namespace = "dh.Column") public static CustomColumn formatRowColor(String expression) { @@ -44,7 +45,8 @@ public static CustomColumn createCustomColumn(String name, String expression) { } public Column(int jsIndex, int index, Integer formatColumnIndex, Integer styleColumnIndex, String type, String name, - boolean isPartitionColumn, Integer formatStringColumnIndex, String description) { + boolean isPartitionColumn, Integer formatStringColumnIndex, String description, + boolean inputTableKeyColumn) { this.jsIndex = jsIndex; this.index = index; this.formatColumnIndex = formatColumnIndex; @@ -54,6 +56,7 @@ public Column(int jsIndex, int index, Integer formatColumnIndex, Integer styleCo this.isPartitionColumn = isPartitionColumn; this.formatStringColumnIndex = formatStringColumnIndex; this.description = description; + this.isInputTableKeyColumn = inputTableKeyColumn; } @JsMethod @@ -133,6 +136,10 @@ public boolean getIsPartitionColumn() { return isPartitionColumn; } + public boolean isInputTableKeyColumn() { + return isInputTableKeyColumn; + } + @JsMethod public Sort sort() { return new Sort(this); diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/JsTable.java b/web/client-api/src/main/java/io/deephaven/web/client/api/JsTable.java index 8f7354d207d..a71c2dea834 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/JsTable.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/JsTable.java @@ -2,7 +2,6 @@ import elemental2.core.Global; import elemental2.core.JsArray; -import elemental2.core.JsString; import elemental2.dom.CustomEventInit; import elemental2.dom.DomGlobal; import elemental2.promise.IThenable.ThenOnFulfilledCallbackFn; @@ -16,6 +15,8 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.SelectDistinctRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.SnapshotTableRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.runchartdownsamplerequest.ZoomRange; +import io.deephaven.web.client.api.barrage.def.ColumnDefinition; +import io.deephaven.web.client.api.barrage.def.TableAttributesDefinition; import io.deephaven.web.client.api.batch.RequestBatcher; import io.deephaven.web.client.api.filter.FilterCondition; import io.deephaven.web.client.api.input.JsInputTable; @@ -217,16 +218,16 @@ public Promise inputTable() { if (!hasInputTable) { return Js.uncheckedCast(Promise.reject("Table is not an InputTable")); } - return new Promise<>((resolve, reject) -> { - // workerConnection.getServer().fetchInputTable(getHeadHandle(), Callbacks.of((success, fail) -> { - // if (fail == null) { - // resolve.onInvoke(new JsInputTable(this, success.getKeys(), success.getValues())); - // } else { - // reject.onInvoke(fail); - // } - // })); - throw new UnsupportedOperationException("inputTable"); - }); + String[] keyCols = new String[0]; + String[] valueCols = new String[0]; + for (int i = 0; i < getColumns().length; i++) { + if (getColumns().getAt(i).isInputTableKeyColumn()) { + keyCols[keyCols.length] = getColumns().getAt(i).getName(); + } else { + valueCols[valueCols.length] = getColumns().getAt(i).getName(); + } + } + return Promise.resolve(new JsInputTable(this, keyCols, valueCols)); } @JsMethod @@ -255,31 +256,22 @@ public void close() { public String[] getAttributes() { TableAttributesDefinition attrs = lastVisibleState().getTableDef().getAttributes(); return Stream.concat( - attrs.getAsMap().keySet().stream(), - Stream.of(attrs.getRemainingKeys())).toArray(String[]::new); + Arrays.stream(attrs.getKeys()), + attrs.getRemainingAttributeKeys().stream()).toArray(String[]::new); } @JsMethod public Object getAttribute(String attributeName) { TableAttributesDefinition attrs = lastVisibleState().getTableDef().getAttributes(); // If the value was present as something easy to serialize, return it. - String value = attrs.getAsMap().get(attributeName); + String value = attrs.getValue(attributeName); if (value != null) { return value; } - // Else check to see if it was present in the remaining keys (things that werent serialized) - boolean found = false; - for (int i = 0; i < attrs.getRemainingKeys().length; i++) { - if (attrs.getRemainingKeys()[i].equals(attributeName)) { - found = true; - break; - } - } - - // If not, return the value null - this shouldn't be used to detect absence of an attribute, - // use getAttributes() for that. - if (!found) { + // Else check to see if it was present in the remaining keys (things that werent serialized). + // This shouldn't be used to detect the absence of an attribute, use getAttributes() for that + if (!attrs.getRemainingAttributeKeys().contains(attributeName)) { return null; } diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/QueryConnectable.java b/web/client-api/src/main/java/io/deephaven/web/client/api/QueryConnectable.java index 589ab4d1ee9..5897d36a067 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/QueryConnectable.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/QueryConnectable.java @@ -10,6 +10,7 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.GetConsoleTypesRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.GetConsoleTypesResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.StartConsoleRequest; +import io.deephaven.web.client.api.barrage.stream.ResponseStreamWrapper; import io.deephaven.web.client.fu.CancellablePromise; import io.deephaven.web.client.fu.JsLog; import io.deephaven.web.client.fu.LazyPromise; diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/Sort.java b/web/client-api/src/main/java/io/deephaven/web/client/api/Sort.java index 9952391a328..d3ed7ed1b2a 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/Sort.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/Sort.java @@ -11,7 +11,7 @@ public class Sort { REVERSE = "REVERSE"; private static final Column REVERSE_COLUMN = - new Column(-1, -1, null, null, "", "__REVERSE_COLUMN", false, null, null); + new Column(-1, -1, null, null, "", "__REVERSE_COLUMN", false, null, null, false); private final Column column; private String direction; diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java index 992aae397d2..da286dc9931 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java @@ -23,15 +23,21 @@ import io.deephaven.javascript.proto.dhinternal.flatbuffers.Long; import io.deephaven.javascript.proto.dhinternal.grpcweb.Grpc; import io.deephaven.javascript.proto.dhinternal.grpcweb.grpc.Code; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.barrage.flatbuf.barrage_generated.io.deephaven.barrage.flatbuf.*; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.barrage.flatbuf.barrage_generated.io.deephaven.barrage.flatbuf.BarrageMessageType; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.barrage.flatbuf.barrage_generated.io.deephaven.barrage.flatbuf.BarrageMessageWrapper; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.barrage.flatbuf.barrage_generated.io.deephaven.barrage.flatbuf.BarrageSubscriptionOptions; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.barrage.flatbuf.barrage_generated.io.deephaven.barrage.flatbuf.BarrageSubscriptionRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.barrage.flatbuf.barrage_generated.io.deephaven.barrage.flatbuf.BarrageUpdateMetadata; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.barrage.flatbuf.barrage_generated.io.deephaven.barrage.flatbuf.ColumnConversionMode; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FieldInfo; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FieldsChangeUpdate; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.ListFieldsRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb_service.ApplicationServiceClient; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FetchFigureRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.LogSubscriptionData; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.LogSubscriptionRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb_service.ConsoleServiceClient; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FieldInfo; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FieldsChangeUpdate; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.ListFieldsRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb_service.InputTableServiceClient; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb.HandshakeRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb.HandshakeResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb.ReleaseRequest; @@ -50,13 +56,16 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb_service.TableServiceClient; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.web.client.api.barrage.BarrageUtils; +import io.deephaven.web.client.api.barrage.def.InitialTableDefinition; import io.deephaven.web.client.api.barrage.stream.BiDiStream; +import io.deephaven.web.client.api.barrage.stream.ResponseStreamWrapper; import io.deephaven.web.client.api.batch.RequestBatcher; import io.deephaven.web.client.api.batch.TableConfig; import io.deephaven.web.client.api.console.JsVariableChanges; import io.deephaven.web.client.api.console.JsVariableDefinition; -import io.deephaven.web.client.api.csv.CsvTypeParser; +import io.deephaven.web.client.api.i18n.JsTimeZone; import io.deephaven.web.client.api.lifecycle.HasLifecycle; +import io.deephaven.web.client.api.parse.JsDataHandler; import io.deephaven.web.client.api.state.StateCache; import io.deephaven.web.client.api.tree.JsTreeTable; import io.deephaven.web.client.api.widget.plot.JsFigure; @@ -66,13 +75,7 @@ import io.deephaven.web.client.state.ClientTableState; import io.deephaven.web.client.state.HasTableBinding; import io.deephaven.web.client.state.TableReviver; -import io.deephaven.web.shared.data.ConnectToken; -import io.deephaven.web.shared.data.DeltaUpdates; -import io.deephaven.web.shared.data.InitialTableDefinition; -import io.deephaven.web.shared.data.LogItem; -import io.deephaven.web.shared.data.TableMapHandle; -import io.deephaven.web.shared.data.TableSnapshot; -import io.deephaven.web.shared.data.TableSubscriptionRequest; +import io.deephaven.web.shared.data.*; import io.deephaven.web.shared.fu.JsConsumer; import io.deephaven.web.shared.fu.JsRunnable; import io.deephaven.web.shared.ide.VariableType; @@ -84,9 +87,15 @@ import javax.annotation.Nullable; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.BitSet; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.*; +import java.util.Optional; +import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -161,6 +170,7 @@ private enum State { private ApplicationServiceClient applicationServiceClient; private FlightServiceClient flightServiceClient; private BrowserFlightServiceClient browserFlightServiceClient; + private InputTableServiceClient inputTableServiceClient; private final StateCache cache = new StateCache(); private final JsWeakMap batchers = new JsWeakMap<>(); @@ -201,6 +211,8 @@ public WorkerConnection(QueryConnectable info, Supplier new ApplicationServiceClient(info.getServerUrl(), JsPropertyMap.of("debug", debugGrpc)); browserFlightServiceClient = new BrowserFlightServiceClient(info.getServerUrl(), JsPropertyMap.of("debug", debugGrpc)); + inputTableServiceClient = + new InputTableServiceClient(info.getServerUrl(), JsPropertyMap.of("debug", debugGrpc)); // builder.setConnectionErrorHandler(msg -> info.failureHandled(String.valueOf(msg))); @@ -837,6 +849,10 @@ public FlightServiceClient flightServiceClient() { return flightServiceClient; } + public InputTableServiceClient inputTableServiceClient() { + return inputTableServiceClient; + } + public BrowserHeaders metadata() { return metadata; } @@ -845,13 +861,13 @@ public BiDiStream.Factory streamFactory() { return new BiDiStream.Factory<>(this::metadata, config::newTicketInt, useWebsockets); } - public Promise newTable(String[] columnNames, String[] types, String[][] data, String userTimeZone, + public Promise newTable(String[] columnNames, String[] types, Object[][] data, String userTimeZone, HasEventHandling failHandler) { // Store the ref to the data using an array we can clear out, so the data is garbage collected later // This means the table can only be created once, but that's probably what we want in this case anyway - final String[][][] dataRef = new String[][][] {data}; + final Object[][][] dataRef = new Object[][][] {data}; return newState(failHandler, (c, cts, metadata) -> { - final String[][] d = dataRef[0]; + final Object[][] d = dataRef[0]; if (d == null) { c.apply("Data already released, cannot re-create table", null); return; @@ -862,14 +878,14 @@ public Promise newTable(String[] columnNames, String[] types, String[][ Builder schema = new Builder(1024); // while we're examining columns, build the copiers for data - List columns = new ArrayList<>(); + List columns = new ArrayList<>(); double[] fields = new double[columnNames.length]; for (int i = 0; i < columnNames.length; i++) { String columnName = columnNames[i]; String columnType = types[i]; - CsvTypeParser.CsvColumn writer = CsvTypeParser.getColumn(columnType); + JsDataHandler writer = JsDataHandler.getHandler(columnType); columns.add(writer); double nameOffset = schema.createString(columnName); @@ -935,9 +951,13 @@ public Promise newTable(String[] columnNames, String[] types, String[][ // iterate each column, building buffers and fieldnodes, as well as building the actual payload List buffers = new ArrayList<>(); - List nodes = new ArrayList<>(); + List nodes = new ArrayList<>(); + JsDataHandler.ParseContext context = new JsDataHandler.ParseContext(); + if (userTimeZone != null) { + context.timeZone = JsTimeZone.getTimeZone(userTimeZone); + } for (int i = 0; i < data.length; i++) { - columns.get(i).writeColumn(data[i], nodes::add, buffers::add); + columns.get(i).write(data[i], context, nodes::add, buffers::add); } // write down the buffers for the RecordBatch @@ -958,7 +978,7 @@ public Promise newTable(String[] columnNames, String[] types, String[][ RecordBatch.startNodesVector(bodyData, nodes.size()); for (int i = nodes.size() - 1; i >= 0; i--) { - CsvTypeParser.Node node = nodes.get(i); + JsDataHandler.Node node = nodes.get(i); FieldNode.createFieldNode(bodyData, Long.create(node.length(), 0), Long.create(node.nullCount(), 0)); } double nodesOffset = bodyData.endVector(); diff --git a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/ColumnDefinition.java b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/def/ColumnDefinition.java similarity index 82% rename from web/shared-beans/src/main/java/io/deephaven/web/shared/data/ColumnDefinition.java rename to web/client-api/src/main/java/io/deephaven/web/client/api/barrage/def/ColumnDefinition.java index 8d955e07b1e..d378d61bf66 100644 --- a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/ColumnDefinition.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/def/ColumnDefinition.java @@ -1,8 +1,6 @@ -package io.deephaven.web.shared.data; +package io.deephaven.web.client.api.barrage.def; -import java.io.Serializable; - -public class ColumnDefinition implements Serializable { +public class ColumnDefinition { private int columnIndex; private String name; private String type; @@ -18,6 +16,8 @@ public class ColumnDefinition implements Serializable { // Indicates that this is a style column for the row private boolean forRow; + private boolean isInputTableKeyColumn; + private String description; public String getName() { return name; @@ -118,4 +118,20 @@ public String getStyleColumnName() { public void setStyleColumnName(String styleColumn) { this.styleColumn = styleColumn; } + + public void setInputTableKeyColumn(boolean inputTableKeyColumn) { + this.isInputTableKeyColumn = inputTableKeyColumn; + } + + public boolean isInputTableKeyColumn() { + return isInputTableKeyColumn; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } } diff --git a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/InitialTableDefinition.java b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/def/InitialTableDefinition.java similarity index 51% rename from web/shared-beans/src/main/java/io/deephaven/web/shared/data/InitialTableDefinition.java rename to web/client-api/src/main/java/io/deephaven/web/client/api/barrage/def/InitialTableDefinition.java index a2fa23a5879..ff513188fd1 100644 --- a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/InitialTableDefinition.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/def/InitialTableDefinition.java @@ -1,17 +1,12 @@ -package io.deephaven.web.shared.data; - -import java.io.Serializable; +package io.deephaven.web.client.api.barrage.def; /** * A table definition constructed when using the fetch command; also includes the table id and size, which are not * normally part of a table definition (as they will change when the table evolves) */ -public class InitialTableDefinition implements Serializable { +public class InitialTableDefinition { private ColumnDefinition[] columns; - private TableHandle id; - private long size; - private boolean isFlat; private TableAttributesDefinition attributes; public ColumnDefinition[] getColumns() { @@ -23,33 +18,6 @@ public InitialTableDefinition setColumns(final ColumnDefinition[] columns) { return this; } - public TableHandle getId() { - return id; - } - - public InitialTableDefinition setId(TableHandle id) { - this.id = id; - return this; - } - - public long getSize() { - return size; - } - - public InitialTableDefinition setSize(long size) { - this.size = size; - return this; - } - - public boolean isFlat() { - return isFlat; - } - - public InitialTableDefinition setFlat(boolean flat) { - isFlat = flat; - return this; - } - public TableAttributesDefinition getAttributes() { return attributes; } diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/def/TableAttributesDefinition.java b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/def/TableAttributesDefinition.java new file mode 100644 index 00000000000..32d2a15849e --- /dev/null +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/def/TableAttributesDefinition.java @@ -0,0 +1,83 @@ +package io.deephaven.web.client.api.barrage.def; + +import io.deephaven.web.shared.data.RollupDefinition; + +import java.io.Serializable; +import java.util.Map; +import java.util.Set; + +public class TableAttributesDefinition { + public static final String INPUT_TABLE_ATTRIBUTE = "InputTable", + TOTALS_TABLE_ATTRIBUTE = "TotalsTable", + TABLE_DESCRIPTION_ATTRIBUTE = "TableDescription", + HIERARCHICAL_SOURCE_TABLE_ATTRIBUTE = "HierarchicalSourceTable", + HIERARCHICAL_SOURCE_INFO_ATTRIBUTE = "HierarchicalSourceTableInfo", + LAYOUT_HINTS_ATTRIBUTE = "LayoutHints", + PLUGIN_NAME = "PluginName"; + + private static final String HIERARCHICAL_COLUMN_NAME = + HIERARCHICAL_SOURCE_INFO_ATTRIBUTE + ".hierarchicalColumnName"; + private static final String HIERARCHICAL_BY_COLUMN = HIERARCHICAL_SOURCE_INFO_ATTRIBUTE + ".byColumns"; + private static final String HIERARCHICAL_LEAF_TYPE = HIERARCHICAL_SOURCE_INFO_ATTRIBUTE + ".leafType"; + + // special cased attributes that have a complex type yet are always sent + private RollupDefinition rollupDefinition;// rollup subtype of "HierarchicalSourceTableInfo" + + private final Map map; + private final Set remainingAttributeKeys; + + public TableAttributesDefinition(Map keys, Set remainingAttributes) { + map = keys; + this.remainingAttributeKeys = remainingAttributes; + if (map.containsKey(HIERARCHICAL_COLUMN_NAME)) { + // marker present for tree table metadata + rollupDefinition = new RollupDefinition(); + rollupDefinition.setByColumns(map.get(HIERARCHICAL_BY_COLUMN).split(",")); + rollupDefinition.setLeafType(RollupDefinition.LeafType.valueOf(map.get(HIERARCHICAL_LEAF_TYPE))); + } + } + + public boolean isInputTable() { + return remainingAttributeKeys.contains(INPUT_TABLE_ATTRIBUTE); + } + + public RollupDefinition getRollupDefinition() { + return rollupDefinition; + } + + public void setRollupDefinition(final RollupDefinition rollupDefinition) { + this.rollupDefinition = rollupDefinition; + } + + public String getTreeHierarchicalColumnName() { + return map.get(HIERARCHICAL_COLUMN_NAME); + } + + public String[] getKeys() { + return map.keySet().toArray(new String[0]); + } + + public String getValue(String key) { + return map.get(key); + } + + public Set getRemainingAttributeKeys() { + return remainingAttributeKeys; + } + + public String getTotalsTableConfig() { + return map.get(TOTALS_TABLE_ATTRIBUTE); + } + + public String getDescription() { + return map.get(TABLE_DESCRIPTION_ATTRIBUTE); + } + + public String getPluginName() { + return map.get(PLUGIN_NAME); + } + + public String getLayoutHints() { + return map.get(LAYOUT_HINTS_ATTRIBUTE); + } +} diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/stream/BiDiStream.java b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/stream/BiDiStream.java index eaa04ca1f9a..de4ea5518f3 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/stream/BiDiStream.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/stream/BiDiStream.java @@ -4,7 +4,6 @@ import elemental2.core.JsArray; import io.deephaven.javascript.proto.dhinternal.browserheaders.BrowserHeaders; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; -import io.deephaven.web.client.api.ResponseStreamWrapper; import io.deephaven.web.shared.fu.JsBiConsumer; import io.deephaven.web.shared.fu.JsConsumer; import io.deephaven.web.shared.fu.JsFunction; diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/ResponseStreamWrapper.java b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/stream/ResponseStreamWrapper.java similarity index 97% rename from web/client-api/src/main/java/io/deephaven/web/client/api/ResponseStreamWrapper.java rename to web/client-api/src/main/java/io/deephaven/web/client/api/barrage/stream/ResponseStreamWrapper.java index 73be955cc6e..260badbe0eb 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/ResponseStreamWrapper.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/barrage/stream/ResponseStreamWrapper.java @@ -1,4 +1,4 @@ -package io.deephaven.web.client.api; +package io.deephaven.web.client.api.barrage.stream; import elemental2.core.Function; import io.deephaven.javascript.proto.dhinternal.browserheaders.BrowserHeaders; diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/batch/RequestBatcher.java b/web/client-api/src/main/java/io/deephaven/web/client/api/batch/RequestBatcher.java index e9d0639ddb4..63c78fbd3f0 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/batch/RequestBatcher.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/batch/RequestBatcher.java @@ -8,6 +8,7 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ExportedTableCreationResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.TableReference; import io.deephaven.web.client.api.*; +import io.deephaven.web.client.api.barrage.stream.ResponseStreamWrapper; import io.deephaven.web.client.api.batch.BatchBuilder.BatchOp; import io.deephaven.web.client.api.filter.FilterCondition; import io.deephaven.web.client.fu.JsLog; diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/csv/CsvTypeParser.java b/web/client-api/src/main/java/io/deephaven/web/client/api/csv/CsvTypeParser.java deleted file mode 100644 index 10ee8b3d3ef..00000000000 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/csv/CsvTypeParser.java +++ /dev/null @@ -1,482 +0,0 @@ -package io.deephaven.web.client.api.csv; - -import elemental2.core.ArrayBuffer; -import elemental2.core.Float64Array; -import elemental2.core.Int32Array; -import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.arrow.flight.flatbuf.schema_generated.org.apache.arrow.flatbuf.*; -import io.deephaven.javascript.proto.dhinternal.flatbuffers.Builder; -import io.deephaven.web.client.api.i18n.JsDateTimeFormat; -import io.deephaven.web.client.api.i18n.JsTimeZone; -import io.deephaven.web.client.api.subscription.QueryConstants; -import io.deephaven.web.shared.data.LocalTime; -import io.deephaven.web.shared.fu.JsConsumer; -import jsinterop.base.Js; - -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.BitSet; -import java.util.Objects; -import java.util.function.Function; - -/** - * Helper class for parsing CSV data into Columns of the correct type. - */ -public class CsvTypeParser { - private static final Uint8Array EMPTY = new Uint8Array(0); - - enum ArrowType implements CsvColumn { - STRING(Type.Utf8, "java.lang.String") { - @Override - public double writeType(Builder builder) { - return Utf8.createUtf8(builder); - } - - @Override - public void writeColumn(String[] strings, JsConsumer addNode, JsConsumer addBuffer) { - int nullCount = 0; - BitSet nulls = new BitSet(strings.length); - Int32Array positions = ArrowType.makeBuffer(strings.length + 1, 4, Int32Array::new); - // work out the total length we'll need for the payload, plus padding - int payloadLength = Arrays.stream(strings).filter(Objects::nonNull).mapToInt(String::length).sum(); - Uint8Array payload = makeBuffer(payloadLength); - - int lastOffset = 0; - for (int i = 0; i < strings.length; i++) { - String str = strings[i]; - positions.setAt(i, (double) lastOffset); - byte[] bytes = str.getBytes(StandardCharsets.UTF_8); - payload.set(Js.uncheckedCast(bytes), lastOffset); - lastOffset += bytes.length; - } - positions.setAt(strings.length, (double) lastOffset); - - // validity, positions, payload - addBuffer.apply(makeValidityBuffer(nullCount, nulls)); - addBuffer.apply(new Uint8Array(positions.buffer)); - addBuffer.apply(payload); - - addNode.apply(new Node(strings.length, nullCount)); - } - }, - DATE_TIME(Type.Int, DATE_TIME_TYPE) { - @Override - public double writeType(Builder builder) { - return Int.createInt(builder, 64, true); - } - - @Override - public void writeColumn(String[] strings, JsConsumer addNode, JsConsumer addBuffer) { - // TODO #1041 this type is expected to work - throw new IllegalArgumentException("Can't serialize DateTime for CSV"); - } - }, - INTEGER(Type.Int, "int") { - @Override - public double writeType(Builder builder) { - return Int.createInt(builder, 32, true); - } - - @Override - public void writeColumn(String[] strings, JsConsumer addNode, JsConsumer addBuffer) { - int nullCount = 0; - BitSet nulls = new BitSet(strings.length); - Int32Array payload = - ArrowType.makeBuffer(strings.length, Int32Array.BYTES_PER_ELEMENT, Int32Array::new); - for (int i = 0; i < strings.length; i++) { - if (strings[i] == null || strings[i].trim().isEmpty()) { - payload.setAt(i, (double) QueryConstants.NULL_INT); - nullCount++; - } else { - payload.setAt(i, (double) Integer.parseInt(strings[i].trim().replaceAll(",", ""))); - nulls.set(i); - } - } - - // validity, then payload - addBuffer.apply(makeValidityBuffer(nullCount, nulls)); - addBuffer.apply(new Uint8Array(payload.buffer)); - - addNode.apply(new Node(strings.length, nullCount)); - } - }, - SHORT(Type.Int, "short") { - @Override - public double writeType(Builder builder) { - return Int.createInt(builder, 16, true); - } - }, - LONG(Type.Int, "long") { - @Override - public double writeType(Builder builder) { - return Int.createInt(builder, 64, true); - } - - @Override - public void writeColumn(String[] strings, JsConsumer addNode, JsConsumer addBuffer) { - int nullCount = 0; - BitSet nulls = new BitSet(strings.length); - Float64Array payload = new Float64Array(strings.length);// using float because we can convert longs to - // doubles, though not cheaply - for (int i = 0; i < strings.length; i++) { - long value; - if (strings[i] == null || strings[i].trim().isEmpty()) { - value = QueryConstants.NULL_LONG; - nullCount++; - } else { - value = Long.parseLong(strings[i].trim().replaceAll(",", "")); - nulls.set(i); - } - payload.setAt(i, Double.longBitsToDouble(value)); - } - - // validity, then payload - addBuffer.apply(makeValidityBuffer(nullCount, nulls)); - addBuffer.apply(new Uint8Array(payload.buffer)); - - addNode.apply(new Node(strings.length, nullCount)); - } - }, - BYTE(Type.Int, "byte") { - @Override - public double writeType(Builder builder) { - return Int.createInt(builder, 8, true); - } - }, - CHAR(Type.Int, "char") { - @Override - public double writeType(Builder builder) { - return Int.createInt(builder, 16, false); - } - }, - FLOAT(Type.FloatingPoint, "float") { - @Override - public double writeType(Builder builder) { - return FloatingPoint.createFloatingPoint(builder, Precision.SINGLE); - } - }, - DOUBLE(Type.FloatingPoint, "double") { - @Override - public double writeType(Builder builder) { - return FloatingPoint.createFloatingPoint(builder, Precision.DOUBLE); - } - - @Override - public void writeColumn(String[] strings, JsConsumer addNode, JsConsumer addBuffer) { - int nullCount = 0; - BitSet nulls = new BitSet(strings.length); - Float64Array payload = new Float64Array(strings.length);// 64 bits, already aligned - for (int i = 0; i < strings.length; i++) { - if (strings[i] == null || strings[i].trim().isEmpty()) { - payload.setAt(i, QueryConstants.NULL_DOUBLE); - nullCount++; - } else { - payload.setAt(i, Double.parseDouble(strings[i].trim().replaceAll(",", ""))); - nulls.set(i); - } - } - - // validity, then payload - addBuffer.apply(makeValidityBuffer(nullCount, nulls)); - addBuffer.apply(new Uint8Array(payload.buffer)); - - addNode.apply(new Node(strings.length, nullCount)); - } - }, - - BOOLEAN(Type.Int, "boolean") { - @Override - public double writeType(Builder builder) { - return Int.createInt(builder, 8, true); - } - }, - - BIG_DECIMAL(Type.Binary, "java.util.BigDecimal") { - @Override - public double writeType(Builder builder) { - return Binary.createBinary(builder); - } - }, - BIG_INTEGER(Type.Binary, "java.util.BigInteger") { - @Override - public double writeType(Builder builder) { - return Binary.createBinary(builder); - } - }, - - LOCAL_DATE(Type.FixedSizeBinary, "java.time.LocalDate") { - @Override - public double writeType(Builder builder) { - return FixedSizeBinary.createFixedSizeBinary(builder, 6); - } - }, - LOCAL_TIME(Type.FixedSizeBinary, "java.time.LocalTime") { - @Override - public double writeType(Builder builder) { - return FixedSizeBinary.createFixedSizeBinary(builder, 7); - } - - @Override - public void writeColumn(String[] strings, JsConsumer addNode, JsConsumer addBuffer) { - // TODO #1041 this type is expected to work - throw new IllegalArgumentException("Can't serialize DateTime for CSV"); - } - }, - - LIST(Type.List) { - @Override - public double writeType(Builder builder) { - return List.createList(builder); - } - }; - - private static Uint8Array makeValidityBuffer(int nullCount, BitSet nulls) { - if (nullCount != 0) { - byte[] nullsAsByteArray = nulls.toByteArray(); - Uint8Array nullsAsTypedArray = makeBuffer(nullsAsByteArray.length); - nullsAsTypedArray.set(Js.uncheckedCast(nullsAsByteArray)); - return nullsAsTypedArray; - } else { - return EMPTY; - } - } - - private static T makeBuffer(int elementCount, double bytesPerElement, - Function constructor) { - return constructor.apply(makeBuffer(elementCount * (int) bytesPerElement).buffer); - } - - public static Uint8Array makeBuffer(int length) { - int bytesExtended = length & 0x7; - if (bytesExtended > 0) { - length += 8 - bytesExtended; - } - return new Uint8Array(length); - } - - private final int typeType; - private final String deephavenType; - - ArrowType(int typeType, String deephavenType) { - this.typeType = typeType; - this.deephavenType = deephavenType; - } - - ArrowType(int typeType) { - this.typeType = typeType; - this.deephavenType = "unknown";// TODO remove this - } - - @Override - public String deephavenType() { - return deephavenType; - } - - @Override - public int typeType() { - return typeType; - } - - @Override - public abstract double writeType(Builder builder); - - @Override - public void writeColumn(String[] strings, JsConsumer addNode, JsConsumer addBuffer) { - throw new IllegalArgumentException("Type " + this + " not yet supported for CSV upload"); - } - } - - // CSV Column types - public static final String INTEGER = "int"; - public static final String LONG = "long"; - public static final String DOUBLE = "double"; - public static final String BOOLEAN = "bool"; - public static final String DATE_TIME = "datetime"; - public static final String LOCAL_TIME = "localtime"; - public static final String LOCAL_DATE = "localdate"; - - // DbDateTime and LocalTime are not visible to this code - private static final String DATE_TIME_TYPE = "io.deephaven.db.tables.utils.DBDateTime"; - private static final String LOCAL_TIME_TYPE = "java.time.LocalTime"; - - private static final String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss"; - private static final int SEPARATOR_INDEX = 10; - - public static class Node { - private final int length; - private final int nullCount; - - public Node(int length, int nullCount) { - this.length = length; - this.nullCount = nullCount; - } - - public int length() { - return length; - } - - public int nullCount() { - return nullCount; - } - } - - public interface CsvColumn { - String deephavenType(); - - int typeType(); - - double writeType(Builder builder); - - void writeColumn(String[] strings, JsConsumer addNode, JsConsumer addBuffer); - } - - public static CsvColumn getColumn(String columnType) { - switch (columnType) { - case "string": - case "String": - case "java.lang.String": { - return ArrowType.STRING; - } - case DATE_TIME: - case DATE_TIME_TYPE: { - return ArrowType.DATE_TIME; - } - case LONG: { - return ArrowType.LONG; - } - case INTEGER: { - return ArrowType.INTEGER; - } - case "byte": { - return ArrowType.BYTE; - } - case "char": { - return ArrowType.CHAR; - } - case "short": { - return ArrowType.SHORT; - } - case DOUBLE: { - return ArrowType.DOUBLE; - } - case "float": { - return ArrowType.FLOAT; - } - case "boolean": - case BOOLEAN: { - return ArrowType.BOOLEAN; - } - case LOCAL_DATE: { - return ArrowType.LOCAL_DATE; - } - case LOCAL_TIME: { - return ArrowType.LOCAL_TIME; - } - case "java.util.BigDecimal": { - return ArrowType.BIG_DECIMAL; - } - case "java.util.BigInteger": { - return ArrowType.BIG_INTEGER; - } - default: { - throw new IllegalArgumentException("Unsupported type " + columnType); - } - } - } - - @SuppressWarnings("unused") // TODO #1041 - private static long parseDateTime(String str, String userTimeZone) { - final String s = ensureSeparator(str); - final int spaceIndex = s.indexOf(' '); - final String dateTimeString; - final String timeZoneString; - if (spaceIndex == -1) { - // Zulu is an exception to the space rule - if (s.endsWith("Z")) { - dateTimeString = s.substring(0, s.length() - 1); - timeZoneString = "Z"; - } else { - dateTimeString = s; - timeZoneString = null; - } - } else { - dateTimeString = s.substring(0, spaceIndex); - timeZoneString = s.substring(spaceIndex + 1); - } - final String pattern = getSubsecondPattern(dateTimeString); - final String tzString = timeZoneString == null ? userTimeZone : timeZoneString; - final com.google.gwt.i18n.client.TimeZone timeZone = JsTimeZone.getTimeZone(tzString).unwrap(); - return JsDateTimeFormat.getFormat(pattern).parseWithTimezoneAsLong(dateTimeString, timeZone, - JsTimeZone.needsDstAdjustment(timeZoneString)); - } - - // Updates the pattern for the correct number of subsecond digits 'S' - private static String getSubsecondPattern(String s) { - final int decimalIndex = s.indexOf('.'); - if (decimalIndex == -1) { - // No subsecond digits - return DATE_TIME_PATTERN; - } - final int numDigits = s.length() - decimalIndex - 1; - final StringBuilder stringBuilder = new StringBuilder(numDigits); - for (int i = 0; i < numDigits; i++) { - stringBuilder.append('S'); - } - return DATE_TIME_PATTERN + "." + stringBuilder.toString(); - } - - // Ensures that the 'T' separator character is in the the date time - private static String ensureSeparator(String s) { - if (s.charAt(SEPARATOR_INDEX) == ' ') { - return s.replaceFirst(" ", "T"); - } - return s; - } - - @SuppressWarnings("unused") // TODO #1041 - private static LocalTime parseLocalTime(String s) { - long dayNanos = 0; - long subsecondNanos = 0; - - final int tIndex = s.indexOf('T'); - if (tIndex != -1) { - dayNanos = 86400000000000L * Integer.parseInt(s.substring(0, tIndex)); - s = s.substring(tIndex + 1); - } - - final int decimalIndex = s.indexOf('.'); - if (decimalIndex != -1) { - subsecondNanos = parseNanos(s.substring(decimalIndex + 1)); - s = s.substring(0, decimalIndex); - } - - final String[] tokens = s.split(":"); - if (tokens.length == 2) { // hh:mm - return new LocalTime(Byte.parseByte(tokens[0]), Byte.parseByte(tokens[1]), (byte) 0, - (int) (dayNanos + subsecondNanos)); - } else if (tokens.length == 3) { // hh:mm:ss - return new LocalTime(Byte.parseByte(tokens[0]), Byte.parseByte(tokens[1]), Byte.parseByte(tokens[2]), - (int) (dayNanos + subsecondNanos)); - } - - return null; - } - - private static long parseNanos(final String input) { - long result = 0; - for (int i = 0; i < 9; i++) { - result *= 10; - final int digit; - if (i >= input.length()) { - digit = 0; - } else { - digit = Character.digit(input.charAt(i), 10); - if (digit < 0) { - throw new NumberFormatException("Invalid character for nanoseconds conversion: " + input.charAt(i)); - } - } - result += digit; - } - return result; - } -} diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/input/ColumnValueDehydrater.java b/web/client-api/src/main/java/io/deephaven/web/client/api/input/ColumnValueDehydrater.java deleted file mode 100644 index 611bde7b2c4..00000000000 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/input/ColumnValueDehydrater.java +++ /dev/null @@ -1,237 +0,0 @@ -package io.deephaven.web.client.api.input; - -import elemental2.core.Function; -import elemental2.core.JsArray; -import elemental2.core.Reflect; -import io.deephaven.web.shared.data.ColumnValue; -import jsinterop.base.Js; - -import java.math.BigDecimal; -import java.math.BigInteger; - -import static io.deephaven.web.shared.data.ColumnValue.*; - -/** - * A tool for turning javascript objects (and all their "glory") into usable {@link ColumnValue} objects. - * - * This is only usable within client code. - */ -public class ColumnValueDehydrater { - - public static String serialize(String type, Object value) { - return serialize(type, value, false); - } - - private static String serialize(String type, Object value, boolean arrayComponent) { - // Should be symmetric with ColumnValueRehydrater. - // for now, we will fall back to .toString support - - if (value == null || ("null".equals(value) && !"java.lang.String".equals(type))) { - // we'll permit the string "null" if the type is a string, otherwise assume client - // accidentally toString'd a null value - return nullSentinel(); - } - if (type.contains("[]")) { - if (!JsArray.isArray(value)) { - throw new UnsupportedOperationException("Expected array type " + type + " but got " + value); - } - final String componentType = type.replace("[]", ""); - StringBuilder result = new StringBuilder(); - Js.>uncheckedCast(value).forEach((v, i, a) -> { - if (result.length() > 0) { - result.append(ARRAY_DELIMITER); - } - if (v == null) { - result.append(nullSentinel()); - } else { - String subSer = serialize(componentType, v, true); - // handle our escaped characters: - for (char c : subSer.toCharArray()) { - switch (c) { - // \0 (null) -> \1\0 - case NULL_SENTINEL: - result.append(ESCAPER).append(NULL_SENTINEL); - break; - // \1 (escaper) -> \1\2 - case ESCAPER: - result.append(ESCAPER).append(ESCAPER_ESCAPED); - break; - // , (array delimiter) - case ARRAY_DELIMITER: - result.append(ESCAPER).append(ARRAY_DELIMITER); - break; - default: - result.append(c); - } - } - } - return result.toString(); - }); - return result.toString(); - } - - switch (Js.typeof(value)) { - case "boolean": { - switch (type) { - case "boolean": - case "java.lang.Boolean": - return Js.isTruthy(value) ? "1" : "0"; - } - throw illegal("boolean", value); - } - case "number": { - // only support number-y types. - double val = (double) value; - switch (type) { - case "java.lang.String": - return String.valueOf(value); - case "int": - case "java.lang.Integer": - // perhaps add (optional) validation that users are actually sending ints. - // like `web.typesafe=true` to turn on paranoia checks. - return val == Integer.MIN_VALUE ? nullSentinel() : Integer.toString((int) val); - case "double": - case "java.lang.Double": - case "java.math.BigDecimal": - case "java.math.BigInteger": - return val == -Double.MAX_VALUE ? nullSentinel() : Double.toString(val); - case "long": - case "java.lang.Long": - case "io.deephaven.db.tables.utils.DBDateTime": - // TODO: check if Long.MIN_VALUE actually works as expected from js; - // in theory, the cast here will make the rounding, if any, equivalent - return val == (double) Long.MIN_VALUE ? nullSentinel() : Long.toString((long) val); - case "byte": - case "java.lang.Byte": - return val == Byte.MIN_VALUE ? nullSentinel() : Byte.toString((byte) val); - case "boolean": - case "java.lang.Boolean": - checkBooleanValue(val); - assert val == (byte) val : "Malformed boolean value " + val; - return Byte.toString((byte) val); - case "char": - case "java.lang.Character": - return val == Character.MAX_VALUE ? nullSentinel() : String.valueOf(value).substring(0, 1); - case "short": - case "java.lang.Short": - return val == Short.MIN_VALUE ? nullSentinel() : Short.toString((short) val); - case "float": - case "java.lang.Float": - return val == Float.MIN_VALUE ? nullSentinel() : Float.toString((float) val); - default: - throw unsupported(value); - } - } // done w/ number - case "string": { - - String v = (String) value; - - switch (type) { - case "java.lang.String": - return arrayComponent ? v : // arrays are escaped in the forEach loop above - v.replaceAll(nullSentinel(), ESCAPER + nullSentinel()); - case "io.deephaven.db.tables.utils.DBDateTime": - // TODO: check if datetime string to parse into a long timestamp. - // otherwise, we expect long ints for DBDateTime (for now) - case "int": - case "java.lang.Integer": - case "long": - case "java.lang.Long": - case "byte": - case "java.lang.Byte": - case "short": - case "java.lang.Short": - case "java.math.BigInteger": - // new BigInteger() should validate all of the above - assert !new BigInteger(v).toString().isEmpty(); // something we don't want to pay for in prod - return v.split("[.]")[0]; // be forgiving to js... - case "double": - case "java.lang.Double": - case "float": - case "java.lang.Float": - case "java.math.BigDecimal": - // new BigDecimal() should validate all of the above - assert !new BigDecimal(v).toString().isEmpty(); // something we don't want to pay for in prod - return v; - case "boolean": - case "java.lang.Boolean": - if ("false".equals(v.toLowerCase())) { - return "0"; - } - if ("true".equals(v.toLowerCase())) { - return "1"; - } - if ("null".equals(v.toLowerCase())) { - return "-1"; - } - checkBooleanValue(Byte.parseByte(v)); - return v; - case "char": - case "java.lang.Character": - return v.substring(0, 1); - } - assert !(arrayComponent && v.contains(escaper())) - : "\\1 is a control character that should not be sent in unhandled array types."; - return v; // good luck - } - case "object": { - if (JsArray.isArray(value)) { - // arrays should already be handled - throw unsupported(value); - } - // check for a function starting w/ name (enums)... - Function name = findNameFunction(value); - if (name != null) { - return String.valueOf(name.bind(value).call()); - } - // fail - throw unsupported(value); - } - } - throw unsupported(value); - } - - private static boolean checkBooleanValue(double val) { - if (!(val == 1 || val == 0 || val == -1)) { - throw illegal("boolean", val); - } - return true; - } - - private static Function findNameFunction(Object value) { - Function name = findFunction(value, "name"); - if (name == null) { - name = findFunction(value, "n"); - } - return name; - } - - private static Function findFunction(Object value, String prefix) { - // This probably isn't the correct way to "guess" enum values, - // but we can probably come up with the correct heuristic for - // PRETTY vs. OBF compilation obfuscation levels. - // For now, if these lookups fail, the enum type in question - // will throw an error (we'll fix this up when we add testing - // and more rigorous support for "common types"). - Object proto = Reflect.get(value, "prototype"); - for (Object o : Reflect.ownKeys(proto)) { - final String key = String.valueOf(o); - if (key.startsWith(prefix)) { - Object result = Reflect.get(proto, key); - if ("function".equals(Js.typeof(result))) { - return Js.uncheckedCast(result); - } - } - } - return null; - } - - private static UnsupportedOperationException unsupported(Object value) { - return new UnsupportedOperationException("Cannot handle " + Js.typeof(value) + " : " + value); - } - - private static IllegalArgumentException illegal(String type, Object value) { - return new IllegalArgumentException( - "Cannot handle " + Js.typeof(value) + " value " + value + " for " + type + " column"); - } -} diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/input/JsInputTable.java b/web/client-api/src/main/java/io/deephaven/web/client/api/input/JsInputTable.java index 613d1ed097e..ff4fd9120f3 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/input/JsInputTable.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/input/JsInputTable.java @@ -1,20 +1,23 @@ package io.deephaven.web.client.api.input; -import elemental2.core.Global; import elemental2.core.JsObject; import elemental2.promise.Promise; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.AddTableRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.DeleteTableRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.BatchTableRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ExportedTableCreationResponse; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.MergeTablesRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.SelectOrUpdateRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.TableReference; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.batchtablerequest.Operation; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.web.client.api.Callbacks; import io.deephaven.web.client.api.Column; import io.deephaven.web.client.api.JsTable; -import io.deephaven.web.client.api.WorkerConnection; -import io.deephaven.web.client.api.batch.BatchBuilder; -import io.deephaven.web.client.state.ClientTableState; -import io.deephaven.web.shared.batch.BatchTableRequest; -import io.deephaven.web.shared.batch.BatchTableResponse; -import io.deephaven.web.shared.data.ColumnValue; -import io.deephaven.web.shared.data.RowValues; +import io.deephaven.web.client.api.barrage.stream.ResponseStreamWrapper; import io.deephaven.web.shared.fu.JsRunnable; import jsinterop.annotations.JsIgnore; +import jsinterop.annotations.JsOptional; import jsinterop.annotations.JsProperty; import jsinterop.annotations.JsType; import jsinterop.base.JsPropertyMap; @@ -22,6 +25,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.IntStream; /** * A js type for operating on input tables. @@ -60,37 +64,28 @@ public Column[] getValueColumns() { return table.findColumns(values); } - public Promise addRow(JsPropertyMap row) { - return addRows(new JsPropertyMap[] {row}); + public Promise addRow(JsPropertyMap row, @JsOptional String userTimeZone) { + return addRows(new JsPropertyMap[] {row}, userTimeZone); } - public Promise addRows(JsPropertyMap[] rows) { - return Callbacks.promise(table, c -> { - final RowValues[] rowValues = new RowValues[rows.length]; - - for (int i = 0; i < rows.length; i++) { - final JsPropertyMap row = rows[i]; - // assert that all keys are filled in... - for (String key : keys) { - if (!row.has(key)) { - throw new IllegalStateException("Missing key " + key + " in " + Global.JSON.stringify(row)); - } - } - - // starts up a request to the server - final List v = new ArrayList<>(); - for (String key : keys) { - v.add(newValue(key, row.get(key))); - } - for (String key : values) { - v.add(newValue(key, row.get(key))); - } - - rowValues[i] = new RowValues(v.toArray(new ColumnValue[v.size()])); + public Promise addRows(JsPropertyMap[] rows, @JsOptional String userTimeZone) { + String[] names = + Arrays.stream(table.lastVisibleState().getColumns()).map(Column::getName).toArray(String[]::new); + String[] types = + Arrays.stream(table.lastVisibleState().getColumns()).map(Column::getType).toArray(String[]::new); + + Object[][] data = new Object[names.length][]; + for (int i = 0; i < names.length; i++) { + String name = names[i]; + Object[] columnArray = new Object[rows.length]; + for (int j = 0; j < rows.length; j++) { + columnArray[j] = rows[j].get(name); } - // table.getServer().addRowsToInputTable(table.getHeadHandle(), rowValues, c); - throw new UnsupportedOperationException("addRowsToInputTable"); - }).then(response -> Promise.resolve(this)); + data[i] = columnArray; + } + + return table.getConnection().newTable(names, types, data, userTimeZone, null) + .then(this::addTable); } public Promise addTable(JsTable tableToAdd) { @@ -98,11 +93,44 @@ public Promise addTable(JsTable tableToAdd) { } public Promise addTables(JsTable[] tablesToAdd) { - return Callbacks.promise(this.table, c -> { - // table.getServer().addTablesToInputTable(table.getHeadHandle(), Arrays.stream(tablesToAdd).map(t -> - // t.getHandle()).toArray(TableHandle[]::new), c); - throw new UnsupportedOperationException("addTablesToInputTable"); - }).then(response -> Promise.resolve(this)); + if (tablesToAdd.length == 0) { + // noinspection unchecked,rawtypes + return (Promise) Promise.reject("Must provide at least one table"); + } + final boolean closeIntermediateTable; + final Promise mergePromise; + if (tablesToAdd.length == 1) { + mergePromise = Promise.resolve(tablesToAdd[0]); + closeIntermediateTable = false; + } else { + mergePromise = table.getConnection().mergeTables(tablesToAdd, this.table); + closeIntermediateTable = true; + } + + return mergePromise + .then(merged -> { + // noinspection CodeBlock2Expr - easier readability for chained then() + return Callbacks.grpcUnaryPromise(c -> { + AddTableRequest addTableRequest = new AddTableRequest(); + addTableRequest.setInputTable(table.getHeadHandle().makeTicket()); + addTableRequest.setTableToAdd(merged.getHeadHandle().makeTicket()); + table.getConnection().inputTableServiceClient().addTableToInputTable(addTableRequest, + table.getConnection().metadata(), c::apply); + }).then(success -> { + if (closeIntermediateTable) { + // this is an intermediate table for the merge, close it + merged.close(); + } + return Promise.resolve(success); + }, failure -> { + if (closeIntermediateTable) { + // this is an intermediate table for the merge, close it + merged.close(); + } + return Promise.reject(failure); + }); + }) + .then(response -> Promise.resolve(this)); } public Promise deleteTable(JsTable tableToDelete) { @@ -110,49 +138,84 @@ public Promise deleteTable(JsTable tableToDelete) { } public Promise deleteTables(JsTable[] tablesToDelete) { - final List keysList = Arrays.asList(keys); - final List cleanups = new ArrayList<>(); - final BatchBuilder builder = new BatchBuilder(); - - // Limit the tables to delete to just the key columns - for (int i = 0; i < tablesToDelete.length; i++) { - final JsTable tableToDelete = tablesToDelete[i]; - final BatchBuilder.BatchOp op = builder.getOp(); - final WorkerConnection connection = tableToDelete.getConnection(); - final ClientTableState cts = connection.newState(tableToDelete.state(), op); - cleanups.add(cts.retain(this)); - - // final HandleMapping mapping = new HandleMapping(tableToDelete.getHandle(), cts.getHandle()); - // op.fromState(cts); - // op.setAppendTo(cts.getPrevious()); - // op.setHandles(mapping); - // builder.setViewColumns(keysList); - // builder.nextOp(connection, op); - throw new UnsupportedOperationException("Can't build batch"); + if (tablesToDelete.length == 0) { + return Promise.resolve(this); } - // TODO core#273 - BatchTableRequest req = new BatchTableRequest(); - // req.setOps(builder.serializable()); - - return Callbacks.promise(this.table, c -> { - // table.getServer().batch(req, c); - throw new UnsupportedOperationException("batch"); - }).then(response -> { - if (response.getFailureMessages().length > 0) { - return (Promise) Promise - .reject("Unable to delete tables: " + Arrays.toString(response.getFailureMessages())); + // for each table, make a view on that table of only key columns, then union the tables and drop together + final List 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); } - return Callbacks.promise(this.table, c -> { - // table.getServer().deleteTablesFromInputTable(table.getHeadHandle(), response.getSuccess(), c); - throw new UnsupportedOperationException("deleteTablesFromInputTable"); + + 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 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); - return (Promise) Promise.reject(err); + // first emit any earlier errors, then if there were not, emit whatever we got from the server for the final + // call + return (Promise) failureToReport.then(ignore -> Promise.reject(err)); }); } @@ -161,14 +224,4 @@ public JsTable getTable() { return table; } - @JsIgnore - private ColumnValue newValue(String key, Object value) { - final Column column = table.findColumn(key); - ColumnValue val = new ColumnValue(); - val.setColumnId(column.getIndex()); - final String serialized = ColumnValueDehydrater.serialize(column.getType(), value); - val.setValue(serialized); - return val; - } - } diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/parse/JsDataHandler.java b/web/client-api/src/main/java/io/deephaven/web/client/api/parse/JsDataHandler.java new file mode 100644 index 00000000000..5338f7ab009 --- /dev/null +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/parse/JsDataHandler.java @@ -0,0 +1,492 @@ +package io.deephaven.web.client.api.parse; + +import elemental2.core.ArrayBuffer; +import elemental2.core.Float32Array; +import elemental2.core.Float64Array; +import elemental2.core.Int16Array; +import elemental2.core.Int32Array; +import elemental2.core.Int8Array; +import elemental2.core.JsDate; +import elemental2.core.TypedArray; +import elemental2.core.Uint16Array; +import elemental2.core.Uint8Array; +import io.deephaven.javascript.proto.dhinternal.arrow.flight.flatbuf.schema_generated.org.apache.arrow.flatbuf.Binary; +import io.deephaven.javascript.proto.dhinternal.arrow.flight.flatbuf.schema_generated.org.apache.arrow.flatbuf.FixedSizeBinary; +import io.deephaven.javascript.proto.dhinternal.arrow.flight.flatbuf.schema_generated.org.apache.arrow.flatbuf.FloatingPoint; +import io.deephaven.javascript.proto.dhinternal.arrow.flight.flatbuf.schema_generated.org.apache.arrow.flatbuf.Int; +import io.deephaven.javascript.proto.dhinternal.arrow.flight.flatbuf.schema_generated.org.apache.arrow.flatbuf.Precision; +import io.deephaven.javascript.proto.dhinternal.arrow.flight.flatbuf.schema_generated.org.apache.arrow.flatbuf.Type; +import io.deephaven.javascript.proto.dhinternal.arrow.flight.flatbuf.schema_generated.org.apache.arrow.flatbuf.Utf8; +import io.deephaven.javascript.proto.dhinternal.flatbuffers.Builder; +import io.deephaven.web.client.api.LongWrapper; +import io.deephaven.web.client.api.i18n.JsDateTimeFormat; +import io.deephaven.web.client.api.i18n.JsTimeZone; +import io.deephaven.web.shared.fu.JsConsumer; +import io.deephaven.web.shared.fu.JsFunction; +import jsinterop.base.Js; +import jsinterop.base.JsArrayLike; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.BitSet; +import java.util.Objects; + +import static io.deephaven.web.client.api.subscription.QueryConstants.FALSE_BOOLEAN_AS_BYTE; +import static io.deephaven.web.client.api.subscription.QueryConstants.NULL_BOOLEAN_AS_BYTE; +import static io.deephaven.web.client.api.subscription.QueryConstants.NULL_BYTE; +import static io.deephaven.web.client.api.subscription.QueryConstants.NULL_CHAR; +import static io.deephaven.web.client.api.subscription.QueryConstants.NULL_DOUBLE; +import static io.deephaven.web.client.api.subscription.QueryConstants.NULL_FLOAT; +import static io.deephaven.web.client.api.subscription.QueryConstants.NULL_INT; +import static io.deephaven.web.client.api.subscription.QueryConstants.NULL_LONG; +import static io.deephaven.web.client.api.subscription.QueryConstants.NULL_SHORT; +import static io.deephaven.web.client.api.subscription.QueryConstants.TRUE_BOOLEAN_AS_BYTE; + +/** + * Given the expected type of a column, pick one of the enum entries and use that to read the data into arrow buffers. + */ +public enum JsDataHandler { + STRING(Type.Utf8, "java.lang.String") { + @Override + public double writeType(Builder builder) { + return Utf8.createUtf8(builder); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + int nullCount = 0; + BitSet validity = new BitSet(data.length); + Int32Array positions = makeBuffer(data.length + 1, 4, Int32Array::new); + // work out the total length we'll need for the payload, plus padding + int payloadLength = + Arrays.stream(data).filter(Objects::nonNull).map(Object::toString).mapToInt(String::length).sum(); + Uint8Array payload = makeBuffer(payloadLength); + + int lastOffset = 0; + for (int i = 0; i < data.length; i++) { + if (data[i] == null) { + nullCount++; + continue; + } + validity.set(i); + String str = data[i].toString(); + positions.setAt(i, (double) lastOffset); + byte[] bytes = str.getBytes(StandardCharsets.UTF_8); + payload.set(Js.uncheckedCast(bytes), lastOffset); + lastOffset += bytes.length; + } + positions.setAt(data.length, (double) lastOffset); + + // validity, positions, payload + addBuffer.apply(makeValidityBuffer(nullCount, validity)); + addBuffer.apply(new Uint8Array(positions.buffer)); + addBuffer.apply(payload); + + addNode.apply(new Node(data.length, nullCount)); + } + }, + DATE_TIME(Type.Int, "io.deephaven.db.tables.utils.DBDateTime") { + @Override + public double writeType(Builder builder) { + return Int.createInt(builder, 64, true); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + int nullCount = 0; + BitSet validity = new BitSet(data.length); + // using float because we can convert longs to + // doubles, though not cheaply + Float64Array payload = new Float64Array(data.length); + for (int i = 0; i < data.length; i++) { + + final long dateValue; + if (data[i] == null) { + dateValue = NULL_LONG; + } else if (data[i] instanceof LongWrapper) { + dateValue = ((LongWrapper) data[i]).getWrapped(); + } else if (data[i] instanceof JsDate) { + dateValue = 1_000_000L * ((JsDate) data[i]).getDate(); + } else { + // fall back to assuming it is a string, figure out what it formats as + String str = data[i].toString().trim(); + if (str.isEmpty()) { + dateValue = NULL_LONG; + } else { + // take the format string and the timezone, and solve for a date + dateValue = JsDateTimeFormat.parse(context.dateTimePattern, str, context.timeZone).getWrapped(); + } + } + + if (dateValue == NULL_LONG) { + nullCount++; + } else { + validity.set(i); + } + payload.setAt(i, Double.longBitsToDouble(dateValue)); + } + + // validity, then payload + addBuffer.apply(makeValidityBuffer(nullCount, validity)); + addBuffer.apply(new Uint8Array(payload.buffer)); + + addNode.apply(new Node(data.length, nullCount)); + } + }, + INTEGER(Type.Int, "int") { + @Override + public double writeType(Builder builder) { + return Int.createInt(builder, 32, true); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + writeSimpleNumbers(data, addNode, addBuffer, Int32Array.BYTES_PER_ELEMENT, NULL_INT, Int32Array::new); + } + }, + SHORT(Type.Int, "short") { + @Override + public double writeType(Builder builder) { + return Int.createInt(builder, 16, true); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + writeSimpleNumbers(data, addNode, addBuffer, Int16Array.BYTES_PER_ELEMENT, NULL_SHORT, Int16Array::new); + } + }, + LONG(Type.Int, "long") { + @Override + public double writeType(Builder builder) { + return Int.createInt(builder, 64, true); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + int nullCount = 0; + BitSet validity = new BitSet(data.length); + // using float because we can convert longs to + // doubles, though not cheaply + Float64Array payload = new Float64Array(data.length); + for (int i = 0; i < data.length; i++) { + final long value; + if (data[i] == null) { + value = NULL_LONG; + } else if (data[i] instanceof LongWrapper) { + value = ((LongWrapper) data[i]).getWrapped(); + } else if (Js.typeof(data[i]).equals("string")) { + String str = ((String) data[i]).trim().replaceAll(",", ""); + if (str.length() == 0) { + value = NULL_LONG; + } else { + value = Long.parseLong(str); + } + } else { + // fall back to whatever we can get - this is null safe, since we already tested for null above + value = (long) (double) JsDataHandler.doubleFromData(data[i]); + } + if (value == NULL_LONG) { + nullCount++; + } else { + validity.set(i); + } + payload.setAt(i, Double.longBitsToDouble(value)); + } + + // validity, then payload + addBuffer.apply(makeValidityBuffer(nullCount, validity)); + addBuffer.apply(new Uint8Array(payload.buffer)); + + addNode.apply(new Node(data.length, nullCount)); + } + }, + BYTE(Type.Int, "char") { + @Override + public double writeType(Builder builder) { + return Int.createInt(builder, 8, true); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + writeSimpleNumbers(data, addNode, addBuffer, Int8Array.BYTES_PER_ELEMENT, NULL_BYTE, Int8Array::new); + } + }, + CHAR(Type.Int, "char") { + @Override + public double writeType(Builder builder) { + return Int.createInt(builder, 16, false); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + writeSimpleNumbers(data, addNode, addBuffer, Uint16Array.BYTES_PER_ELEMENT, NULL_CHAR, Uint16Array::new); + } + }, + FLOAT(Type.FloatingPoint, "float") { + @Override + public double writeType(Builder builder) { + return FloatingPoint.createFloatingPoint(builder, Precision.SINGLE); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + writeSimpleNumbers(data, addNode, addBuffer, Float32Array.BYTES_PER_ELEMENT, NULL_FLOAT, Float32Array::new); + } + }, + DOUBLE(Type.FloatingPoint, "double") { + @Override + public double writeType(Builder builder) { + return FloatingPoint.createFloatingPoint(builder, Precision.DOUBLE); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + writeSimpleNumbers(data, addNode, addBuffer, Float64Array.BYTES_PER_ELEMENT, NULL_DOUBLE, + Float64Array::new); + } + }, + BOOLEAN(Type.Int, "boolean") { + @Override + public double writeType(Builder builder) { + return Int.createInt(builder, 8, true); + } + + @Override + public void write(Object[] data, ParseContext context, JsConsumer addNode, + JsConsumer addBuffer) { + int nullCount = 0; + BitSet validity = new BitSet(data.length); + Int8Array payload = makeBuffer(data.length, Int8Array.BYTES_PER_ELEMENT, Int8Array::new); + for (int i = 0; i < data.length; i++) { + Object val = data[i]; + byte boolValue; + if (val == null) { + boolValue = NULL_BOOLEAN_AS_BYTE; + } else { + String typeof = Js.typeof(val); + switch (typeof) { + case "boolean": + boolValue = Js.isTruthy(val) ? TRUE_BOOLEAN_AS_BYTE : FALSE_BOOLEAN_AS_BYTE; + break; + case "number": + boolValue = Js.asByte(val);// checks the values to ensure it is a byte + break; + case "string": + String str = Js.asString(val); + switch (str.toLowerCase()) { + case "true": + boolValue = TRUE_BOOLEAN_AS_BYTE; + break; + case "false": + boolValue = FALSE_BOOLEAN_AS_BYTE; + break; + case "null": + boolValue = NULL_BOOLEAN_AS_BYTE; + break; + default: + boolValue = Byte.parseByte(str); + break; + } + break; + default: + throw new IllegalArgumentException( + "Unsupported type to handle as a boolean value " + typeof); + } + } + + if (boolValue != FALSE_BOOLEAN_AS_BYTE && boolValue != TRUE_BOOLEAN_AS_BYTE + && boolValue != NULL_BOOLEAN_AS_BYTE) { + throw new IllegalArgumentException("Can't handle " + val + " as a boolean value"); + } + + // write the value, and mark non-null if necessary + if (boolValue != NULL_BOOLEAN_AS_BYTE) { + validity.set(i); + } else { + nullCount++; + } + payload.setAt(i, (double) boolValue); + } + + // validity, then payload + addBuffer.apply(makeValidityBuffer(nullCount, validity)); + addBuffer.apply(new Uint8Array(Js.uncheckedCast(payload).buffer)); + + addNode.apply(new Node(data.length, nullCount)); + } + }, + BIG_DECIMAL(Type.Binary, "java.util.BigDecimal") { + @Override + public double writeType(Builder builder) { + return Binary.createBinary(builder); + } + }, + BIG_INTEGER(Type.Binary, "java.util.BigInteger") { + @Override + public double writeType(Builder builder) { + return Binary.createBinary(builder); + } + }, + LOCAL_DATE(Type.FixedSizeBinary, "java.time.LocalDate") { + @Override + public double writeType(Builder builder) { + return FixedSizeBinary.createFixedSizeBinary(builder, 6); + } + }, + LOCAL_TIME(Type.FixedSizeBinary, "java.time.LocalTime") { + @Override + public double writeType(Builder builder) { + return FixedSizeBinary.createFixedSizeBinary(builder, 7); + } + }, + // LIST(), + ; + + public static JsDataHandler getHandler(String deephavenType) { + return Arrays + .stream(values()) + .filter(h -> h.deephavenType().equals(deephavenType)) + .findFirst() + .orElseThrow( + () -> new IllegalArgumentException("No support for handling data of type " + deephavenType)); + } + + /** + * Helper to write numeric types that JS can represent in a consistent way. + * + * @param data the data passed from the user + * @param addNode a callback to append a node to the arrow payload + * @param addBuffer a callback to append a buffer to the arrow payload + * @param bytesPerElement the width of the arrow/deephaven type being created + * @param nullValue the value to write in case of null data + * @param bufferConstructor a constructor to produce a typedarray for the data being created + */ + private static void writeSimpleNumbers(Object[] data, JsConsumer addNode, JsConsumer addBuffer, + double bytesPerElement, double nullValue, JsFunction bufferConstructor) { + int nullCount = 0; + BitSet validity = new BitSet(data.length); + JsArrayLike payload = makeBuffer(data.length, bytesPerElement, bufferConstructor); + for (int i = 0; i < data.length; i++) { + Double doubleFromData = doubleFromData(data[i]); + if (doubleFromData == null) { + payload.setAt(i, nullValue); + nullCount++; + } else { + payload.setAt(i, doubleFromData); + validity.set(i); + } + } + + // validity, then payload + addBuffer.apply(makeValidityBuffer(nullCount, validity)); + addBuffer.apply(new Uint8Array(Js.uncheckedCast(payload).buffer)); + + addNode.apply(new Node(data.length, nullCount)); + } + + /** + * Helper to read some js value as a double, so it can be handled as some type narrower than a js number. Do not use + * this to handle wider types, check each possible type and fallback to this. + * + * @param data the data to turn into a js number + * @return null or a java double + */ + private static Double doubleFromData(Object data) { + if (data == null) { + return null; + } + if (Js.typeof(data).equals("number")) { + return Js.asDouble(data); + } + if (data instanceof LongWrapper) { + // we aren't expecting a long here, so bring it down to double + return ((LongWrapper) data).asNumber(); + } + String asString = data.toString().trim().replaceAll(",", ""); + if (asString.isEmpty()) { + return null; + } + // last ditch, parse as double, let that throw if the data doesn't make sense + return Double.parseDouble(asString); + } + + private static final Uint8Array EMPTY = new Uint8Array(0); + + private final int arrowTypeType; + private final String deephavenType; + + JsDataHandler(int arrowTypeType, String deephavenType) { + this.arrowTypeType = arrowTypeType; + this.deephavenType = deephavenType; + } + + public int typeType() { + return arrowTypeType; + } + + public String deephavenType() { + return deephavenType; + } + + public abstract double writeType(Builder builder); + + public void write(Object[] data, ParseContext context, JsConsumer addNode, JsConsumer addBuffer) { + throw new UnsupportedOperationException("Can't parse " + name()); + } + + public static class ParseContext { + public JsTimeZone timeZone; + public String dateTimePattern = "yyyy-MM-dd'T'HH:mm:ss"; + } + + public static class Node { + private final int length; + private final int nullCount; + + public Node(int length, int nullCount) { + this.length = length; + this.nullCount = nullCount; + } + + public int nullCount() { + return nullCount; + } + + public int length() { + return length; + } + } + + private static Uint8Array makeValidityBuffer(int nullCount, BitSet nulls) { + if (nullCount != 0) { + byte[] nullsAsByteArray = nulls.toByteArray(); + Uint8Array nullsAsTypedArray = makeBuffer(nullsAsByteArray.length); + nullsAsTypedArray.set(Js.uncheckedCast(nullsAsByteArray)); + return nullsAsTypedArray; + } else { + return EMPTY; + } + } + + private static T makeBuffer(int elementCount, double bytesPerElement, + JsFunction constructor) { + return constructor.apply(makeBuffer(elementCount * (int) bytesPerElement).buffer); + } + + private static Uint8Array makeBuffer(int length) { + int bytesExtended = length & 0x7; + if (bytesExtended > 0) { + length += 8 - bytesExtended; + } + return new Uint8Array(length); + } +} diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/subscription/TableViewportSubscription.java b/web/client-api/src/main/java/io/deephaven/web/client/api/subscription/TableViewportSubscription.java index 31ca9846668..283d1eeeefb 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/subscription/TableViewportSubscription.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/subscription/TableViewportSubscription.java @@ -11,9 +11,9 @@ import io.deephaven.javascript.proto.dhinternal.arrow.flight.flatbuf.message_generated.org.apache.arrow.flatbuf.RecordBatch; import io.deephaven.javascript.proto.dhinternal.arrow.flight.protocol.flight_pb.FlightData; import io.deephaven.javascript.proto.dhinternal.flatbuffers.ByteBuffer; -import io.deephaven.javascript.proto.dhinternal.grpcweb.grpc.Code; import io.deephaven.web.client.api.*; import io.deephaven.web.client.api.barrage.BarrageUtils; +import io.deephaven.web.client.api.barrage.stream.ResponseStreamWrapper; import io.deephaven.web.client.fu.JsLog; import io.deephaven.web.client.state.ClientTableState; import io.deephaven.web.shared.data.TableSnapshot; diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/tree/JsTreeTable.java b/web/client-api/src/main/java/io/deephaven/web/client/api/tree/JsTreeTable.java index 8e437a6c6c4..98da66c7b15 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/tree/JsTreeTable.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/tree/JsTreeTable.java @@ -6,6 +6,7 @@ import elemental2.dom.DomGlobal; import elemental2.promise.Promise; import io.deephaven.web.client.api.*; +import io.deephaven.web.client.api.barrage.def.ColumnDefinition; import io.deephaven.web.client.api.filter.FilterCondition; import io.deephaven.web.client.api.lifecycle.HasLifecycle; import io.deephaven.web.client.api.subscription.ViewportData; diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java index 6def07736e0..2e2c5c7e393 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java @@ -3,23 +3,18 @@ import elemental2.core.JsArray; import elemental2.core.JsObject; import elemental2.dom.CustomEventInit; -import elemental2.promise.IThenable; import elemental2.promise.Promise; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FetchFigureResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor.AxisDescriptor; -import io.deephaven.web.client.api.Callback; import io.deephaven.web.client.api.Callbacks; import io.deephaven.web.client.api.HasEventHandling; import io.deephaven.web.client.api.JsTable; import io.deephaven.web.client.api.TableMap; import io.deephaven.web.client.api.WorkerConnection; import io.deephaven.web.client.fu.JsLog; -import io.deephaven.web.client.fu.JsPromise; import io.deephaven.web.client.fu.LazyPromise; import io.deephaven.web.client.state.ClientTableState; -import io.deephaven.web.shared.data.InitialTableDefinition; -import io.deephaven.web.shared.data.TableHandle; import io.deephaven.web.shared.fu.JsBiConsumer; import jsinterop.annotations.JsIgnore; import jsinterop.annotations.JsOptional; diff --git a/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java b/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java index 6331e9bc9ab..c0f4cfc727c 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java @@ -13,6 +13,9 @@ import io.deephaven.javascript.proto.dhinternal.flatbuffers.ByteBuffer; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ExportedTableCreationResponse; import io.deephaven.web.client.api.*; +import io.deephaven.web.client.api.barrage.def.ColumnDefinition; +import io.deephaven.web.client.api.barrage.def.InitialTableDefinition; +import io.deephaven.web.client.api.barrage.def.TableAttributesDefinition; import io.deephaven.web.client.api.batch.TableConfig; import io.deephaven.web.client.api.filter.FilterCondition; import io.deephaven.web.client.api.lifecycle.HasLifecycle; @@ -26,6 +29,7 @@ import java.util.*; import java.util.function.BinaryOperator; +import java.util.function.DoubleFunction; import java.util.function.Function; import java.util.stream.Collector; import java.util.stream.Collectors; @@ -378,7 +382,43 @@ private void setTableDef(InitialTableDefinition tableDef) { boolean create = this.tableDef != tableDef; this.tableDef = tableDef; if (create) { - createColumns(); + ColumnDefinition[] columnDefinitions = tableDef.getColumns(); + + // iterate through the columns, combine format columns into the normal model + Map byNameMap = Arrays.stream(columnDefinitions) + .collect(columnCollector(false)); + Column[] columns1 = new Column[0]; + allColumns = new Column[0]; + for (ColumnDefinition definition : columnDefinitions) { + if (definition.isForRow()) { + // special case for the row format column + setRowFormatColumn(makeColumn(-1, definition, null, null, false, null, null, false)); + continue; + } + String name = definition.getName(); + + ColumnDefinition format = byNameMap.get(definition.getFormatColumnName()); + ColumnDefinition style = byNameMap.get(definition.getStyleColumnName()); + + boolean isPartitionColumn = definition.isPartitionColumn(); + + // note the use of columns.length as jsIndex is accurate for visible columns + allColumns[allColumns.length] = makeColumn(columns1.length, + definition, + format == null || !format.isNumberFormatColumn() ? null : format.getColumnIndex(), + style == null ? null : style.getColumnIndex(), + isPartitionColumn, + format == null || format.isNumberFormatColumn() ? null : format.getColumnIndex(), + definition.getDescription(), + definition.isInputTableKeyColumn()); + + if (definition.isVisible()) { + columns1[columns1.length] = allColumns[allColumns.length - 1]; + } + } + + this.columns = JsObject.freeze(columns1); + this.columnLookup = resetLookup(); } } @@ -402,57 +442,11 @@ private void createTotalsTableConfig() { } } - private void createColumns() { - ColumnDefinition[] columnDefinitions = tableDef.getColumns(); - - // iterate through the columns, combine format columns into the normal model - Map byNameMap = Arrays.stream(columnDefinitions) - .collect(columnCollector(false)); - Column[] columns = new Column[0]; - allColumns = new Column[0]; - Map columnDescriptions = new HashMap<>(); - String[][] descriptionsArrays = tableDef.getAttributes().getColumnDescriptions(); - if (descriptionsArrays != null) { - for (int i = 0; i < descriptionsArrays.length; i++) { - String[] pair = descriptionsArrays[i]; - columnDescriptions.put(pair[0], pair[1]); - } - } - for (ColumnDefinition definition : columnDefinitions) { - if (definition.isForRow()) { - // special case for the row format column - setRowFormatColumn(makeColumn(-1, definition, null, null, false, null, null)); - continue; - } - String name = definition.getName(); - - ColumnDefinition format = byNameMap.get(definition.getFormatColumnName()); - ColumnDefinition style = byNameMap.get(definition.getStyleColumnName()); - - boolean isPartitionColumn = definition.isPartitionColumn(); - - // note the use of columns.length as jsIndex is accurate for visible columns - allColumns[allColumns.length] = makeColumn(columns.length, - definition, - format == null || !format.isNumberFormatColumn() ? null : format.getColumnIndex(), - style == null ? null : style.getColumnIndex(), - isPartitionColumn, - format == null || format.isNumberFormatColumn() ? null : format.getColumnIndex(), - columnDescriptions.get(name)); - - if (definition.isVisible()) { - columns[columns.length] = allColumns[allColumns.length - 1]; - } - } - - this.columns = JsObject.freeze(columns); - this.columnLookup = resetLookup(); - } - private static Column makeColumn(int jsIndex, ColumnDefinition definition, Integer numberFormatIndex, - Integer styleIndex, boolean isPartitionColumn, Integer formatStringIndex, String description) { + Integer styleIndex, boolean isPartitionColumn, Integer formatStringIndex, String description, + boolean inputTableKeyColumn) { return new Column(jsIndex, definition.getColumnIndex(), numberFormatIndex, styleIndex, definition.getType(), - definition.getName(), isPartitionColumn, formatStringIndex, description); + definition.getName(), isPartitionColumn, formatStringIndex, description, inputTableKeyColumn); } private static Collector> columnCollector( @@ -1049,43 +1043,58 @@ public void applyTableCreationResponse(ExportedTableCreationResponse def) { for (int i = 0; i < schema.fieldsLength(); i++) { cols[i] = new ColumnDefinition(); Field f = schema.fields(i); - Map fieldMetadata = new HashMap<>(); - for (int j = 0; j < f.customMetadataLength(); j++) { - KeyValue keyValue = f.customMetadata(j); - fieldMetadata.put(keyValue.key().asString(), keyValue.value().asString()); - } + Map fieldMetadata = + keyValuePairs("deephaven:", f.customMetadataLength(), f::customMetadata); cols[i].setName(f.name().asString()); cols[i].setColumnIndex(i); - cols[i].setType(fieldMetadata.get("deephaven:type")); - cols[i].setStyleColumn("true".equals(fieldMetadata.get("deephaven:isStyle"))); - cols[i].setFormatColumn("true".equals(fieldMetadata.get("deephaven:isDateFormat")) - || "true".equals(fieldMetadata.get("deephaven:isNumberFormat"))); - cols[i].setForRow("true".equals(fieldMetadata.get("deephaven:isRowStyle"))); + cols[i].setType(fieldMetadata.get("type")); + cols[i].setStyleColumn("true".equals(fieldMetadata.get("isStyle"))); + cols[i].setFormatColumn("true".equals(fieldMetadata.get("isDateFormat")) + || "true".equals(fieldMetadata.get("isNumberFormat"))); + cols[i].setForRow("true".equals(fieldMetadata.get("isRowStyle"))); - String formatColumnName = fieldMetadata.get("deephaven:dateFormatColumn"); + String formatColumnName = fieldMetadata.get("dateFormatColumn"); if (formatColumnName == null) { - formatColumnName = fieldMetadata.get("deephaven:numberFormatColumn"); + formatColumnName = fieldMetadata.get("numberFormatColumn"); } cols[i].setFormatColumnName(formatColumnName); - cols[i].setStyleColumnName(fieldMetadata.get("deephaven:styleColumn")); + cols[i].setStyleColumnName(fieldMetadata.get("styleColumn")); + + if (fieldMetadata.containsKey("inputtable.isKey")) { + cols[i].setInputTableKeyColumn(Boolean.parseBoolean(fieldMetadata.get("inputtable.isKey"))); + } + + cols[i].setDescription(fieldMetadata.get("description")); } - TableAttributesDefinition attributes = new TableAttributesDefinition(); - attributes.setValues(new String[0]); - attributes.setKeys(new String[0]); - attributes.setRemainingKeys(new String[0]); + TableAttributesDefinition attributes = new TableAttributesDefinition( + keyValuePairs("deephaven:attribute.", schema.customMetadataLength(), schema::customMetadata), + keyValuePairs("deephaven:unsent.attribute.", schema.customMetadataLength(), schema::customMetadata) + .keySet()); setTableDef(new InitialTableDefinition() .setAttributes(attributes) - .setColumns(cols) - .setFlat(false) - .setId(null) - .setSize(Long.parseLong(def.getSize()))); + .setColumns(cols)); setResolution(ResolutionState.RUNNING); setSize(Long.parseLong(def.getSize())); } + private static Map keyValuePairs(String filterPrefix, double count, + DoubleFunction accessor) { + Map map = new HashMap<>(); + for (int i = 0; i < count; i++) { + KeyValue pair = accessor.apply(i); + String key = pair.key().asString(); + if (key.startsWith(filterPrefix)) { + key = key.substring(filterPrefix.length()); + String oldValue = map.put(key, pair.value().asString()); + assert oldValue == null : key + " had " + oldValue + ", replaced with " + pair.value(); + } + } + return map; + } + public boolean isAncestor(ClientTableState was) { for (ClientTableState state : new LinkedIterable<>(this, ClientTableState::getPrevious)) { if (state == was) { diff --git a/web/client-api/src/main/java/io/deephaven/web/client/state/TableReviver.java b/web/client-api/src/main/java/io/deephaven/web/client/state/TableReviver.java index b3c701a1eb7..e1e48a4dd78 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/state/TableReviver.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/state/TableReviver.java @@ -10,6 +10,7 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.TableReference; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.batchtablerequest.Operation; import io.deephaven.web.client.api.*; +import io.deephaven.web.client.api.barrage.stream.ResponseStreamWrapper; import io.deephaven.web.client.api.batch.BatchBuilder; import io.deephaven.web.client.api.batch.BatchBuilder.BatchOp; import io.deephaven.web.client.api.batch.RequestBatcher; diff --git a/web/client-api/src/main/java/io/deephaven/web/public/index.html b/web/client-api/src/main/java/io/deephaven/web/public/index.html index 3409bbaea3b..ac74f8ed12f 100644 --- a/web/client-api/src/main/java/io/deephaven/web/public/index.html +++ b/web/client-api/src/main/java/io/deephaven/web/public/index.html @@ -19,6 +19,7 @@

Feature Demos

  • Create a table and display a viewport of it, with a filter context menu
  • Create a table and display a viewport of it, with clickable headers to sort
  • Samples demonstrating Deephaven JS DateTime and Number formatting
  • +
  • Create and manipulate an input table
  • diff --git a/web/client-api/src/main/java/io/deephaven/web/public/init.js b/web/client-api/src/main/java/io/deephaven/web/public/init.js deleted file mode 100644 index f6b11aad0e9..00000000000 --- a/web/client-api/src/main/java/io/deephaven/web/public/init.js +++ /dev/null @@ -1,87 +0,0 @@ -var url = new URL('/socket', window.location); -if (url.protocol === 'http:') { - url.protocol = 'ws:'; -} else { - url.protocol = 'wss:'; -} - -window.c = new dh.Client(url.href); -c.addEventListener(dh.Client.EVENT_CONNECT, () => { - window.connected && window.connected(); - c.login({username:'dh',token:'dh',type:'password'}).then(result => { - console.log("login successful"); - window.started && window.started(); - }); -}); - -function el(id) { - return document.getElementById(id); -} -function newEl(tagName) { - return document.createElement(tagName); -} - -function ensureLog() { - var log = el('log'); - if (log) return log; - log = newEl('div'); - log.innerHTML =` -

    Log

    - -
      -`; - document.body.appendChild(log); - return log.querySelector('#log'); -//
      -} -function log(message) { - const logMessage = newEl('li'); - logMessage.innerText = message; - if (arguments.length > 1) { - logMessage.classList.add( - Array.prototype.slice.call(arguments, 1) - ); - } - ensureLog().appendChild(logMessage) -} -function clearLog() { - ensureLog().innerHTML = ''; -} - -function monitor(name, sock) { - if (monitor.socks.has(sock)) { - return; - } - if (!monitor.statusEl) { - monitor.statusEl = newEl('div'); - monitor.statusEl.innerHTML = '

      Socket Status

      '; - document.body.appendChild(monitor.statusEl); - } - var el = newEl('div'); - el.innerHTML = ` - ${name}: - - `; - monitor.statusEl.appendChild(el); - - monitor.socks.set(sock, {name: name, el: el.querySelector('.state'), state: 'Unknown'}); - monitor.setState(sock, 'Open'); - sock.addEventListener('open', function() { - monitor.setState(sock, 'Open'); - }); - sock.addEventListener('close', function() { - monitor.setState(sock, 'Close'); - }); - sock.addEventListener('error', function() { - monitor.setState(sock, 'Error'); - }); - sock.addEventListener('message', function() { - log(`${name}: ` + event.data, 'rpc'); - }); -} -monitor.socks = new Map(); -monitor.setState = (sock, state) => { - const data = monitor.socks.get(sock); - data.el.innerHTML = `${state} (${sock.readyState})`; - data.el.state = state; -}; diff --git a/web/client-api/src/main/java/io/deephaven/web/public/input_table.html b/web/client-api/src/main/java/io/deephaven/web/public/input_table.html index 515f0ebb128..0d5bcc15739 100644 --- a/web/client-api/src/main/java/io/deephaven/web/public/input_table.html +++ b/web/client-api/src/main/java/io/deephaven/web/public/input_table.html @@ -5,7 +5,6 @@ Deephaven Web API table viewport and updates - -

      Persistent Query Configurations

      -
        - -
      +

      + This sample creates a KeyedArrayBackedMutableTable with two columns, an integer "id" column and a String + "data" column. If a new row is added with the same ID that a previous row had, it will replace that row. +

      Table Inputs

      @@ -36,139 +35,87 @@

      Table data (bold headers are keys)

      diff --git a/web/client-api/src/main/java/io/deephaven/web/public/input_tables.js b/web/client-api/src/main/java/io/deephaven/web/public/input_tables.js index 10482070f4c..b2178325566 100644 --- a/web/client-api/src/main/java/io/deephaven/web/public/input_tables.js +++ b/web/client-api/src/main/java/io/deephaven/web/public/input_tables.js @@ -3,9 +3,9 @@ let button, cleanup; function initInputTables() { - let e = el('inputs'); + let e = document.getElementById('inputs'); if (!e) { - e = newEl('ul'); + e = document.createElement('ul'); e.id = 'inputs'; document.body.appendChild(e); } @@ -13,14 +13,14 @@ function initInputTables() { e.innerHTML = '
    • No input table selected
    • '; button = e.querySelector('button'); if (!button) { - button = newEl('button'); + button = document.createElement('button'); button.innerText = 'Add row'; e.appendChild(button); } } function rebuildInputTables(it, table) { - const e = el('inputs'); + const e = document.getElementById('inputs'); e.innerHTML = ''; for (const key of it.keys) { // add required editor field @@ -52,7 +52,7 @@ function getInputValues(e) { } function addInputField(key, col, e, required) { - const li = newEl('li'); + const li = document.createElement('li'); li.classList.add('input'); li.title = required ? 'Required' : 'Optional'; li.innerHTML = ``; diff --git a/web/client-api/src/test/java/io/deephaven/web/client/api/filter/FilterConditionTestGwt.java b/web/client-api/src/test/java/io/deephaven/web/client/api/filter/FilterConditionTestGwt.java index d128dd10aef..5f78ac5dc04 100644 --- a/web/client-api/src/test/java/io/deephaven/web/client/api/filter/FilterConditionTestGwt.java +++ b/web/client-api/src/test/java/io/deephaven/web/client/api/filter/FilterConditionTestGwt.java @@ -15,7 +15,7 @@ public String getModuleName() { } private Column getColumn() { - return new Column(0, 0, -1, -1, "int", "ColumnName", false, -1, null); + return new Column(0, 0, -1, -1, "int", "ColumnName", false, -1, null, false); } private FilterValue[] arr(FilterValue filterValue) { diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/AddTableRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/AddTableRequest.java new file mode 100644 index 00000000000..0f5d45a173f --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/AddTableRequest.java @@ -0,0 +1,208 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb; + +import elemental2.core.Uint8Array; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb.AddTableRequest", + namespace = JsPackage.GLOBAL) +public class AddTableRequest { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InputTableFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static AddTableRequest.ToObjectReturnType.InputTableFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static AddTableRequest.ToObjectReturnType.InputTableFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + AddTableRequest.ToObjectReturnType.InputTableFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + AddTableRequest.ToObjectReturnType.InputTableFieldType.GetTicketUnionType ticket); + + @JsOverlay + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsOverlay + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + } + + @JsOverlay + static AddTableRequest.ToObjectReturnType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + AddTableRequest.ToObjectReturnType.InputTableFieldType getInputTable(); + + @JsProperty + Object getTableToAdd(); + + @JsProperty + void setInputTable(AddTableRequest.ToObjectReturnType.InputTableFieldType inputTable); + + @JsProperty + void setTableToAdd(Object tableToAdd); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType0 { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InputTableFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static AddTableRequest.ToObjectReturnType0.InputTableFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static AddTableRequest.ToObjectReturnType0.InputTableFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + AddTableRequest.ToObjectReturnType0.InputTableFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + AddTableRequest.ToObjectReturnType0.InputTableFieldType.GetTicketUnionType ticket); + + @JsOverlay + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsOverlay + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + } + + @JsOverlay + static AddTableRequest.ToObjectReturnType0 create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + AddTableRequest.ToObjectReturnType0.InputTableFieldType getInputTable(); + + @JsProperty + Object getTableToAdd(); + + @JsProperty + void setInputTable(AddTableRequest.ToObjectReturnType0.InputTableFieldType inputTable); + + @JsProperty + void setTableToAdd(Object tableToAdd); + } + + public static native AddTableRequest deserializeBinary(Uint8Array bytes); + + public static native AddTableRequest deserializeBinaryFromReader( + AddTableRequest message, Object reader); + + public static native void serializeBinaryToWriter(AddTableRequest message, Object writer); + + public static native AddTableRequest.ToObjectReturnType toObject( + boolean includeInstance, AddTableRequest msg); + + public native void clearInputTable(); + + public native void clearTableToAdd(); + + public native Ticket getInputTable(); + + public native Ticket getTableToAdd(); + + public native boolean hasInputTable(); + + public native boolean hasTableToAdd(); + + public native Uint8Array serializeBinary(); + + public native void setInputTable(); + + public native void setInputTable(Ticket value); + + public native void setTableToAdd(); + + public native void setTableToAdd(Ticket value); + + public native AddTableRequest.ToObjectReturnType0 toObject(); + + public native AddTableRequest.ToObjectReturnType0 toObject(boolean includeInstance); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/AddTableResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/AddTableResponse.java new file mode 100644 index 00000000000..ca7c340feae --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/AddTableResponse.java @@ -0,0 +1,26 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb; + +import elemental2.core.Uint8Array; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb.AddTableResponse", + namespace = JsPackage.GLOBAL) +public class AddTableResponse { + public static native AddTableResponse deserializeBinary(Uint8Array bytes); + + public static native AddTableResponse deserializeBinaryFromReader( + AddTableResponse message, Object reader); + + public static native void serializeBinaryToWriter(AddTableResponse message, Object writer); + + public static native Object toObject(boolean includeInstance, AddTableResponse msg); + + public native Uint8Array serializeBinary(); + + public native Object toObject(); + + public native Object toObject(boolean includeInstance); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/DeleteTableRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/DeleteTableRequest.java new file mode 100644 index 00000000000..7a3a7416c35 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/DeleteTableRequest.java @@ -0,0 +1,208 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb; + +import elemental2.core.Uint8Array; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb.DeleteTableRequest", + namespace = JsPackage.GLOBAL) +public class DeleteTableRequest { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InputTableFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static DeleteTableRequest.ToObjectReturnType.InputTableFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static DeleteTableRequest.ToObjectReturnType.InputTableFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + DeleteTableRequest.ToObjectReturnType.InputTableFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + DeleteTableRequest.ToObjectReturnType.InputTableFieldType.GetTicketUnionType ticket); + + @JsOverlay + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsOverlay + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + } + + @JsOverlay + static DeleteTableRequest.ToObjectReturnType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + DeleteTableRequest.ToObjectReturnType.InputTableFieldType getInputTable(); + + @JsProperty + Object getTableToRemove(); + + @JsProperty + void setInputTable(DeleteTableRequest.ToObjectReturnType.InputTableFieldType inputTable); + + @JsProperty + void setTableToRemove(Object tableToRemove); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType0 { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InputTableFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static DeleteTableRequest.ToObjectReturnType0.InputTableFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static DeleteTableRequest.ToObjectReturnType0.InputTableFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + DeleteTableRequest.ToObjectReturnType0.InputTableFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + DeleteTableRequest.ToObjectReturnType0.InputTableFieldType.GetTicketUnionType ticket); + + @JsOverlay + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsOverlay + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + } + + @JsOverlay + static DeleteTableRequest.ToObjectReturnType0 create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + DeleteTableRequest.ToObjectReturnType0.InputTableFieldType getInputTable(); + + @JsProperty + Object getTableToRemove(); + + @JsProperty + void setInputTable(DeleteTableRequest.ToObjectReturnType0.InputTableFieldType inputTable); + + @JsProperty + void setTableToRemove(Object tableToRemove); + } + + public static native DeleteTableRequest deserializeBinary(Uint8Array bytes); + + public static native DeleteTableRequest deserializeBinaryFromReader( + DeleteTableRequest message, Object reader); + + public static native void serializeBinaryToWriter(DeleteTableRequest message, Object writer); + + public static native DeleteTableRequest.ToObjectReturnType toObject( + boolean includeInstance, DeleteTableRequest msg); + + public native void clearInputTable(); + + public native void clearTableToRemove(); + + public native Ticket getInputTable(); + + public native Ticket getTableToRemove(); + + public native boolean hasInputTable(); + + public native boolean hasTableToRemove(); + + public native Uint8Array serializeBinary(); + + public native void setInputTable(); + + public native void setInputTable(Ticket value); + + public native void setTableToRemove(); + + public native void setTableToRemove(Ticket value); + + public native DeleteTableRequest.ToObjectReturnType0 toObject(); + + public native DeleteTableRequest.ToObjectReturnType0 toObject(boolean includeInstance); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/DeleteTableResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/DeleteTableResponse.java new file mode 100644 index 00000000000..39f7d0dc818 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb/DeleteTableResponse.java @@ -0,0 +1,26 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb; + +import elemental2.core.Uint8Array; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb.DeleteTableResponse", + namespace = JsPackage.GLOBAL) +public class DeleteTableResponse { + public static native DeleteTableResponse deserializeBinary(Uint8Array bytes); + + public static native DeleteTableResponse deserializeBinaryFromReader( + DeleteTableResponse message, Object reader); + + public static native void serializeBinaryToWriter(DeleteTableResponse message, Object writer); + + public static native Object toObject(boolean includeInstance, DeleteTableResponse msg); + + public native Uint8Array serializeBinary(); + + public native Object toObject(); + + public native Object toObject(boolean includeInstance); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/BidirectionalStream.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/BidirectionalStream.java new file mode 100644 index 00000000000..da41be6873f --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/BidirectionalStream.java @@ -0,0 +1,19 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb_service; + +import elemental2.core.Function; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb_service.BidirectionalStream", + namespace = JsPackage.GLOBAL) +public interface BidirectionalStream { + void cancel(); + + void end(); + + BidirectionalStream on(String type, Function handler); + + BidirectionalStream write(ReqT message); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/InputTableService.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/InputTableService.java new file mode 100644 index 00000000000..8a6eb3713d4 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/InputTableService.java @@ -0,0 +1,106 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb_service; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb_service.InputTableService", + namespace = JsPackage.GLOBAL) +public class InputTableService { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface AddTableToInputTableType { + @JsOverlay + static InputTableService.AddTableToInputTableType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + String getMethodName(); + + @JsProperty + Object getRequestType(); + + @JsProperty + Object getResponseType(); + + @JsProperty + Object getService(); + + @JsProperty + boolean isRequestStream(); + + @JsProperty + boolean isResponseStream(); + + @JsProperty + void setMethodName(String methodName); + + @JsProperty + void setRequestStream(boolean requestStream); + + @JsProperty + void setRequestType(Object requestType); + + @JsProperty + void setResponseStream(boolean responseStream); + + @JsProperty + void setResponseType(Object responseType); + + @JsProperty + void setService(Object service); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface DeleteTableFromInputTableType { + @JsOverlay + static InputTableService.DeleteTableFromInputTableType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + String getMethodName(); + + @JsProperty + Object getRequestType(); + + @JsProperty + Object getResponseType(); + + @JsProperty + Object getService(); + + @JsProperty + boolean isRequestStream(); + + @JsProperty + boolean isResponseStream(); + + @JsProperty + void setMethodName(String methodName); + + @JsProperty + void setRequestStream(boolean requestStream); + + @JsProperty + void setRequestType(Object requestType); + + @JsProperty + void setResponseStream(boolean responseStream); + + @JsProperty + void setResponseType(Object responseType); + + @JsProperty + void setService(Object service); + } + + public static InputTableService.AddTableToInputTableType AddTableToInputTable; + public static InputTableService.DeleteTableFromInputTableType DeleteTableFromInputTable; + public static String serviceName; +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/InputTableServiceClient.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/InputTableServiceClient.java new file mode 100644 index 00000000000..73d5bdd853a --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/InputTableServiceClient.java @@ -0,0 +1,318 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb_service; + +import io.deephaven.javascript.proto.dhinternal.browserheaders.BrowserHeaders; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.AddTableRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.AddTableResponse; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.DeleteTableRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb.DeleteTableResponse; +import jsinterop.annotations.JsFunction; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb_service.InputTableServiceClient", + namespace = JsPackage.GLOBAL) +public class InputTableServiceClient { + @JsFunction + public interface AddTableToInputTableCallbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static InputTableServiceClient.AddTableToInputTableCallbackFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getMessage(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setMessage(String message); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke( + InputTableServiceClient.AddTableToInputTableCallbackFn.P0Type p0, AddTableResponse p1); + } + + @JsFunction + public interface AddTableToInputTableMetadata_or_callbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static InputTableServiceClient.AddTableToInputTableMetadata_or_callbackFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getMessage(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setMessage(String message); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke( + InputTableServiceClient.AddTableToInputTableMetadata_or_callbackFn.P0Type p0, + AddTableResponse p1); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface AddTableToInputTableMetadata_or_callbackUnionType { + @JsOverlay + static InputTableServiceClient.AddTableToInputTableMetadata_or_callbackUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default InputTableServiceClient.AddTableToInputTableMetadata_or_callbackFn asAddTableToInputTableMetadata_or_callbackFn() { + return Js.cast(this); + } + + @JsOverlay + default BrowserHeaders asBrowserHeaders() { + return Js.cast(this); + } + + @JsOverlay + default boolean isAddTableToInputTableMetadata_or_callbackFn() { + return (Object) this instanceof InputTableServiceClient.AddTableToInputTableMetadata_or_callbackFn; + } + + @JsOverlay + default boolean isBrowserHeaders() { + return (Object) this instanceof BrowserHeaders; + } + } + + @JsFunction + public interface DeleteTableFromInputTableCallbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static InputTableServiceClient.DeleteTableFromInputTableCallbackFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getMessage(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setMessage(String message); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke( + InputTableServiceClient.DeleteTableFromInputTableCallbackFn.P0Type p0, + DeleteTableResponse p1); + } + + @JsFunction + public interface DeleteTableFromInputTableMetadata_or_callbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static InputTableServiceClient.DeleteTableFromInputTableMetadata_or_callbackFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getMessage(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setMessage(String message); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke( + InputTableServiceClient.DeleteTableFromInputTableMetadata_or_callbackFn.P0Type p0, + DeleteTableResponse p1); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface DeleteTableFromInputTableMetadata_or_callbackUnionType { + @JsOverlay + static InputTableServiceClient.DeleteTableFromInputTableMetadata_or_callbackUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default BrowserHeaders asBrowserHeaders() { + return Js.cast(this); + } + + @JsOverlay + default InputTableServiceClient.DeleteTableFromInputTableMetadata_or_callbackFn asDeleteTableFromInputTableMetadata_or_callbackFn() { + return Js.cast(this); + } + + @JsOverlay + default boolean isBrowserHeaders() { + return (Object) this instanceof BrowserHeaders; + } + + @JsOverlay + default boolean isDeleteTableFromInputTableMetadata_or_callbackFn() { + return (Object) this instanceof InputTableServiceClient.DeleteTableFromInputTableMetadata_or_callbackFn; + } + } + + public String serviceHost; + + public InputTableServiceClient(String serviceHost, Object options) {} + + public InputTableServiceClient(String serviceHost) {} + + @JsOverlay + public final UnaryResponse addTableToInputTable( + AddTableRequest requestMessage, + InputTableServiceClient.AddTableToInputTableMetadata_or_callbackFn metadata_or_callback, + InputTableServiceClient.AddTableToInputTableCallbackFn callback) { + return addTableToInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse addTableToInputTable( + AddTableRequest requestMessage, + InputTableServiceClient.AddTableToInputTableMetadata_or_callbackFn metadata_or_callback) { + return addTableToInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + public native UnaryResponse addTableToInputTable( + AddTableRequest requestMessage, + InputTableServiceClient.AddTableToInputTableMetadata_or_callbackUnionType metadata_or_callback, + InputTableServiceClient.AddTableToInputTableCallbackFn callback); + + public native UnaryResponse addTableToInputTable( + AddTableRequest requestMessage, + InputTableServiceClient.AddTableToInputTableMetadata_or_callbackUnionType metadata_or_callback); + + @JsOverlay + public final UnaryResponse addTableToInputTable( + AddTableRequest requestMessage, + BrowserHeaders metadata_or_callback, + InputTableServiceClient.AddTableToInputTableCallbackFn callback) { + return addTableToInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse addTableToInputTable( + AddTableRequest requestMessage, BrowserHeaders metadata_or_callback) { + return addTableToInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + @JsOverlay + public final UnaryResponse deleteTableFromInputTable( + DeleteTableRequest requestMessage, + BrowserHeaders metadata_or_callback, + InputTableServiceClient.DeleteTableFromInputTableCallbackFn callback) { + return deleteTableFromInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse deleteTableFromInputTable( + DeleteTableRequest requestMessage, BrowserHeaders metadata_or_callback) { + return deleteTableFromInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + @JsOverlay + public final UnaryResponse deleteTableFromInputTable( + DeleteTableRequest requestMessage, + InputTableServiceClient.DeleteTableFromInputTableMetadata_or_callbackFn metadata_or_callback, + InputTableServiceClient.DeleteTableFromInputTableCallbackFn callback) { + return deleteTableFromInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse deleteTableFromInputTable( + DeleteTableRequest requestMessage, + InputTableServiceClient.DeleteTableFromInputTableMetadata_or_callbackFn metadata_or_callback) { + return deleteTableFromInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + public native UnaryResponse deleteTableFromInputTable( + DeleteTableRequest requestMessage, + InputTableServiceClient.DeleteTableFromInputTableMetadata_or_callbackUnionType metadata_or_callback, + InputTableServiceClient.DeleteTableFromInputTableCallbackFn callback); + + public native UnaryResponse deleteTableFromInputTable( + DeleteTableRequest requestMessage, + InputTableServiceClient.DeleteTableFromInputTableMetadata_or_callbackUnionType metadata_or_callback); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/RequestStream.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/RequestStream.java new file mode 100644 index 00000000000..0a6fbeafd18 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/RequestStream.java @@ -0,0 +1,55 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb_service; + +import io.deephaven.javascript.proto.dhinternal.browserheaders.BrowserHeaders; +import jsinterop.annotations.JsFunction; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb_service.RequestStream", + namespace = JsPackage.GLOBAL) +public interface RequestStream { + @JsFunction + public interface OnHandlerFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static RequestStream.OnHandlerFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getDetails(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setDetails(String details); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke(RequestStream.OnHandlerFn.P0Type p0); + } + + void cancel(); + + void end(); + + RequestStream on(String type, RequestStream.OnHandlerFn handler); + + RequestStream write(T message); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/ResponseStream.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/ResponseStream.java new file mode 100644 index 00000000000..c161c722a5f --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/ResponseStream.java @@ -0,0 +1,15 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb_service; + +import elemental2.core.Function; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb_service.ResponseStream", + namespace = JsPackage.GLOBAL) +public interface ResponseStream { + void cancel(); + + ResponseStream on(String type, Function handler); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/UnaryResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/UnaryResponse.java new file mode 100644 index 00000000000..741a22255e0 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/inputtable_pb_service/UnaryResponse.java @@ -0,0 +1,12 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb_service; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.inputtable_pb_service.UnaryResponse", + namespace = JsPackage.GLOBAL) +public interface UnaryResponse { + void cancel(); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/AsOfJoinTablesRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/AsOfJoinTablesRequest.java index 246a455aaaf..b596fa9a70b 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/AsOfJoinTablesRequest.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/AsOfJoinTablesRequest.java @@ -2,8 +2,8 @@ import elemental2.core.JsArray; import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.asofjointablesrequest.MatchRuleMap; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/BatchTableRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/BatchTableRequest.java index d300e9b72da..9cf1bdecf7e 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/BatchTableRequest.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/BatchTableRequest.java @@ -188,6 +188,123 @@ default void setGroupByColumnsList(String[] groupByColumnsList) { void setSourceId(Object sourceId); } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface CreateInputTableFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetSchemaUnionType { + @JsOverlay + static BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType.GetSchemaUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface KindFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InMemoryKeyBackedFieldType { + @JsOverlay + static BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + @JsOverlay + static BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType.KindFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Object getInMemoryAppendOnly(); + + @JsProperty + BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType getInMemoryKeyBacked(); + + @JsProperty + void setInMemoryAppendOnly(Object inMemoryAppendOnly); + + @JsProperty + void setInMemoryKeyBacked( + BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType inMemoryKeyBacked); + } + + @JsOverlay + static BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType.KindFieldType getKind(); + + @JsProperty + Object getResultId(); + + @JsProperty + BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType.GetSchemaUnionType getSchema(); + + @JsProperty + Object getSourceTableId(); + + @JsProperty + void setKind( + BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType.KindFieldType kind); + + @JsProperty + void setResultId(Object resultId); + + @JsProperty + void setSchema( + BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType.GetSchemaUnionType schema); + + @JsOverlay + default void setSchema(String schema) { + setSchema( + Js.uncheckedCast( + schema)); + } + + @JsOverlay + default void setSchema(Uint8Array schema) { + setSchema( + Js.uncheckedCast( + schema)); + } + + @JsProperty + void setSourceTableId(Object sourceTableId); + } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CrossJoinFieldType { @JsOverlay @@ -1458,6 +1575,9 @@ static BatchTableRequest.ToObjectReturnType.OpsListFieldType create() { @JsProperty BatchTableRequest.ToObjectReturnType.OpsListFieldType.ComboAggregateFieldType getComboAggregate(); + @JsProperty + BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType getCreateInputTable(); + @JsProperty BatchTableRequest.ToObjectReturnType.OpsListFieldType.CrossJoinFieldType getCrossJoin(); @@ -1551,6 +1671,10 @@ void setAsOfJoin( void setComboAggregate( BatchTableRequest.ToObjectReturnType.OpsListFieldType.ComboAggregateFieldType comboAggregate); + @JsProperty + void setCreateInputTable( + BatchTableRequest.ToObjectReturnType.OpsListFieldType.CreateInputTableFieldType createInputTable); + @JsProperty void setCrossJoin( BatchTableRequest.ToObjectReturnType.OpsListFieldType.CrossJoinFieldType crossJoin); @@ -1840,6 +1964,123 @@ default void setGroupByColumnsList(String[] groupByColumnsList) { void setSourceId(Object sourceId); } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface CreateInputTableFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetSchemaUnionType { + @JsOverlay + static BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType.GetSchemaUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface KindFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InMemoryKeyBackedFieldType { + @JsOverlay + static BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + @JsOverlay + static BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType.KindFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Object getInMemoryAppendOnly(); + + @JsProperty + BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType getInMemoryKeyBacked(); + + @JsProperty + void setInMemoryAppendOnly(Object inMemoryAppendOnly); + + @JsProperty + void setInMemoryKeyBacked( + BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType inMemoryKeyBacked); + } + + @JsOverlay + static BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType.KindFieldType getKind(); + + @JsProperty + Object getResultId(); + + @JsProperty + BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType.GetSchemaUnionType getSchema(); + + @JsProperty + Object getSourceTableId(); + + @JsProperty + void setKind( + BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType.KindFieldType kind); + + @JsProperty + void setResultId(Object resultId); + + @JsProperty + void setSchema( + BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType.GetSchemaUnionType schema); + + @JsOverlay + default void setSchema(String schema) { + setSchema( + Js.uncheckedCast( + schema)); + } + + @JsOverlay + default void setSchema(Uint8Array schema) { + setSchema( + Js.uncheckedCast( + schema)); + } + + @JsProperty + void setSourceTableId(Object sourceTableId); + } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CrossJoinFieldType { @JsOverlay @@ -3110,6 +3351,9 @@ static BatchTableRequest.ToObjectReturnType0.OpsListFieldType create() { @JsProperty BatchTableRequest.ToObjectReturnType0.OpsListFieldType.ComboAggregateFieldType getComboAggregate(); + @JsProperty + BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType getCreateInputTable(); + @JsProperty BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CrossJoinFieldType getCrossJoin(); @@ -3203,6 +3447,10 @@ void setAsOfJoin( void setComboAggregate( BatchTableRequest.ToObjectReturnType0.OpsListFieldType.ComboAggregateFieldType comboAggregate); + @JsProperty + void setCreateInputTable( + BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CreateInputTableFieldType createInputTable); + @JsProperty void setCrossJoin( BatchTableRequest.ToObjectReturnType0.OpsListFieldType.CrossJoinFieldType crossJoin); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/ComboAggregateRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/ComboAggregateRequest.java index db0405c1a2b..24a3dcd2bd2 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/ComboAggregateRequest.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/ComboAggregateRequest.java @@ -2,9 +2,9 @@ import elemental2.core.JsArray; import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.comboaggregaterequest.AggTypeMap; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.comboaggregaterequest.Aggregate; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/Condition.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/Condition.java index d9326f518f9..8b760b9c4c0 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/Condition.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/Condition.java @@ -2,7 +2,6 @@ import elemental2.core.JsArray; import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.condition.DataCase; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; @@ -844,7 +843,7 @@ public static native Condition.ToObjectReturnType toObject( public native ContainsCondition getContains(); - public native DataCase getDataCase(); + public native int getDataCase(); public native InCondition getIn(); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/CreateInputTableRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/CreateInputTableRequest.java new file mode 100644 index 00000000000..e99ff7ab2d9 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/CreateInputTableRequest.java @@ -0,0 +1,527 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb; + +import elemental2.core.JsArray; +import elemental2.core.Uint8Array; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest.DefinitionCase; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest.InputTableKind; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.table_pb.CreateInputTableRequest", + namespace = JsPackage.GLOBAL) +public class CreateInputTableRequest { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetSchemaUnionType { + @JsOverlay + static CreateInputTableRequest.GetSchemaUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface SetSchemaValueUnionType { + @JsOverlay + static CreateInputTableRequest.SetSchemaValueUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetSchemaUnionType { + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType.GetSchemaUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface KindFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InMemoryKeyBackedFieldType { + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType.KindFieldType.InMemoryKeyBackedFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType.KindFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Object getInMemoryAppendOnly(); + + @JsProperty + CreateInputTableRequest.ToObjectReturnType.KindFieldType.InMemoryKeyBackedFieldType getInMemoryKeyBacked(); + + @JsProperty + void setInMemoryAppendOnly(Object inMemoryAppendOnly); + + @JsProperty + void setInMemoryKeyBacked( + CreateInputTableRequest.ToObjectReturnType.KindFieldType.InMemoryKeyBackedFieldType inMemoryKeyBacked); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ResultIdFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType.ResultIdFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType.ResultIdFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + CreateInputTableRequest.ToObjectReturnType.ResultIdFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + CreateInputTableRequest.ToObjectReturnType.ResultIdFieldType.GetTicketUnionType ticket); + + @JsOverlay + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsOverlay + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface SourceTableIdFieldType { + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType.SourceTableIdFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getBatchOffset(); + + @JsProperty + Object getTicket(); + + @JsProperty + void setBatchOffset(double batchOffset); + + @JsProperty + void setTicket(Object ticket); + } + + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + CreateInputTableRequest.ToObjectReturnType.KindFieldType getKind(); + + @JsProperty + CreateInputTableRequest.ToObjectReturnType.ResultIdFieldType getResultId(); + + @JsProperty + CreateInputTableRequest.ToObjectReturnType.GetSchemaUnionType getSchema(); + + @JsProperty + CreateInputTableRequest.ToObjectReturnType.SourceTableIdFieldType getSourceTableId(); + + @JsProperty + void setKind(CreateInputTableRequest.ToObjectReturnType.KindFieldType kind); + + @JsProperty + void setResultId(CreateInputTableRequest.ToObjectReturnType.ResultIdFieldType resultId); + + @JsProperty + void setSchema(CreateInputTableRequest.ToObjectReturnType.GetSchemaUnionType schema); + + @JsOverlay + default void setSchema(String schema) { + setSchema( + Js.uncheckedCast(schema)); + } + + @JsOverlay + default void setSchema(Uint8Array schema) { + setSchema( + Js.uncheckedCast(schema)); + } + + @JsProperty + void setSourceTableId( + CreateInputTableRequest.ToObjectReturnType.SourceTableIdFieldType sourceTableId); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType0 { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetSchemaUnionType { + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType0.GetSchemaUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface KindFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InMemoryKeyBackedFieldType { + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType0.KindFieldType.InMemoryKeyBackedFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType0.KindFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Object getInMemoryAppendOnly(); + + @JsProperty + CreateInputTableRequest.ToObjectReturnType0.KindFieldType.InMemoryKeyBackedFieldType getInMemoryKeyBacked(); + + @JsProperty + void setInMemoryAppendOnly(Object inMemoryAppendOnly); + + @JsProperty + void setInMemoryKeyBacked( + CreateInputTableRequest.ToObjectReturnType0.KindFieldType.InMemoryKeyBackedFieldType inMemoryKeyBacked); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ResultIdFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType0.ResultIdFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType0.ResultIdFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + CreateInputTableRequest.ToObjectReturnType0.ResultIdFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + CreateInputTableRequest.ToObjectReturnType0.ResultIdFieldType.GetTicketUnionType ticket); + + @JsOverlay + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsOverlay + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface SourceTableIdFieldType { + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType0.SourceTableIdFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getBatchOffset(); + + @JsProperty + Object getTicket(); + + @JsProperty + void setBatchOffset(double batchOffset); + + @JsProperty + void setTicket(Object ticket); + } + + @JsOverlay + static CreateInputTableRequest.ToObjectReturnType0 create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + CreateInputTableRequest.ToObjectReturnType0.KindFieldType getKind(); + + @JsProperty + CreateInputTableRequest.ToObjectReturnType0.ResultIdFieldType getResultId(); + + @JsProperty + CreateInputTableRequest.ToObjectReturnType0.GetSchemaUnionType getSchema(); + + @JsProperty + CreateInputTableRequest.ToObjectReturnType0.SourceTableIdFieldType getSourceTableId(); + + @JsProperty + void setKind(CreateInputTableRequest.ToObjectReturnType0.KindFieldType kind); + + @JsProperty + void setResultId(CreateInputTableRequest.ToObjectReturnType0.ResultIdFieldType resultId); + + @JsProperty + void setSchema(CreateInputTableRequest.ToObjectReturnType0.GetSchemaUnionType schema); + + @JsOverlay + default void setSchema(String schema) { + setSchema( + Js.uncheckedCast(schema)); + } + + @JsOverlay + default void setSchema(Uint8Array schema) { + setSchema( + Js.uncheckedCast(schema)); + } + + @JsProperty + void setSourceTableId( + CreateInputTableRequest.ToObjectReturnType0.SourceTableIdFieldType sourceTableId); + } + + public static native CreateInputTableRequest deserializeBinary(Uint8Array bytes); + + public static native CreateInputTableRequest deserializeBinaryFromReader( + CreateInputTableRequest message, Object reader); + + public static native void serializeBinaryToWriter(CreateInputTableRequest message, Object writer); + + public static native CreateInputTableRequest.ToObjectReturnType toObject( + boolean includeInstance, CreateInputTableRequest msg); + + public native void clearKind(); + + public native void clearResultId(); + + public native void clearSchema(); + + public native void clearSourceTableId(); + + public native DefinitionCase getDefinitionCase(); + + public native InputTableKind getKind(); + + public native Ticket getResultId(); + + public native CreateInputTableRequest.GetSchemaUnionType getSchema(); + + public native String getSchema_asB64(); + + public native Uint8Array getSchema_asU8(); + + public native TableReference getSourceTableId(); + + public native boolean hasKind(); + + public native boolean hasResultId(); + + public native boolean hasSchema(); + + public native boolean hasSourceTableId(); + + public native Uint8Array serializeBinary(); + + public native void setKind(); + + public native void setKind(InputTableKind value); + + public native void setResultId(); + + public native void setResultId(Ticket value); + + public native void setSchema(CreateInputTableRequest.SetSchemaValueUnionType value); + + @JsOverlay + public final void setSchema(String value) { + setSchema(Js.uncheckedCast(value)); + } + + @JsOverlay + public final void setSchema(Uint8Array value) { + setSchema(Js.uncheckedCast(value)); + } + + public native void setSourceTableId(); + + public native void setSourceTableId(TableReference value); + + public native CreateInputTableRequest.ToObjectReturnType0 toObject(); + + public native CreateInputTableRequest.ToObjectReturnType0 toObject(boolean includeInstance); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/Literal.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/Literal.java index 3f2be608c7c..571140580cf 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/Literal.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/Literal.java @@ -1,7 +1,6 @@ package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb; import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.literal.ValueCase; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; @@ -118,7 +117,7 @@ static Literal.ToObjectReturnType0 create() { public native String getStringValue(); - public native ValueCase getValueCase(); + public native int getValueCase(); public native boolean hasBoolValue(); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/RunChartDownsampleRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/RunChartDownsampleRequest.java index 891eef16c48..f3ad8839ba7 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/RunChartDownsampleRequest.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/RunChartDownsampleRequest.java @@ -2,8 +2,8 @@ import elemental2.core.JsArray; import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.runchartdownsamplerequest.ZoomRange; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/batchtablerequest/Operation.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/batchtablerequest/Operation.java index fe4b35ab579..ac538da55bd 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/batchtablerequest/Operation.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/batchtablerequest/Operation.java @@ -5,6 +5,7 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ApplyPreviewColumnsRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.AsOfJoinTablesRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ComboAggregateRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.CreateInputTableRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.CrossJoinTablesRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.DropColumnsRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.EmptyTableRequest; @@ -209,6 +210,122 @@ default void setGroupByColumnsList(String[] groupByColumnsList) { void setSourceId(Object sourceId); } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface CreateInputTableFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetSchemaUnionType { + @JsOverlay + static Operation.ToObjectReturnType.CreateInputTableFieldType.GetSchemaUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface KindFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InMemoryKeyBackedFieldType { + @JsOverlay + static Operation.ToObjectReturnType.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + @JsOverlay + static Operation.ToObjectReturnType.CreateInputTableFieldType.KindFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Object getInMemoryAppendOnly(); + + @JsProperty + Operation.ToObjectReturnType.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType getInMemoryKeyBacked(); + + @JsProperty + void setInMemoryAppendOnly(Object inMemoryAppendOnly); + + @JsProperty + void setInMemoryKeyBacked( + Operation.ToObjectReturnType.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType inMemoryKeyBacked); + } + + @JsOverlay + static Operation.ToObjectReturnType.CreateInputTableFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Operation.ToObjectReturnType.CreateInputTableFieldType.KindFieldType getKind(); + + @JsProperty + Object getResultId(); + + @JsProperty + Operation.ToObjectReturnType.CreateInputTableFieldType.GetSchemaUnionType getSchema(); + + @JsProperty + Object getSourceTableId(); + + @JsProperty + void setKind(Operation.ToObjectReturnType.CreateInputTableFieldType.KindFieldType kind); + + @JsProperty + void setResultId(Object resultId); + + @JsProperty + void setSchema( + Operation.ToObjectReturnType.CreateInputTableFieldType.GetSchemaUnionType schema); + + @JsOverlay + default void setSchema(String schema) { + setSchema( + Js.uncheckedCast( + schema)); + } + + @JsOverlay + default void setSchema(Uint8Array schema) { + setSchema( + Js.uncheckedCast( + schema)); + } + + @JsProperty + void setSourceTableId(Object sourceTableId); + } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CrossJoinFieldType { @JsOverlay @@ -1478,6 +1595,9 @@ static Operation.ToObjectReturnType create() { @JsProperty Operation.ToObjectReturnType.ComboAggregateFieldType getComboAggregate(); + @JsProperty + Operation.ToObjectReturnType.CreateInputTableFieldType getCreateInputTable(); + @JsProperty Operation.ToObjectReturnType.CrossJoinFieldType getCrossJoin(); @@ -1569,6 +1689,10 @@ void setApplyPreviewColumns( @JsProperty void setComboAggregate(Operation.ToObjectReturnType.ComboAggregateFieldType comboAggregate); + @JsProperty + void setCreateInputTable( + Operation.ToObjectReturnType.CreateInputTableFieldType createInputTable); + @JsProperty void setCrossJoin(Operation.ToObjectReturnType.CrossJoinFieldType crossJoin); @@ -1825,6 +1949,122 @@ default void setGroupByColumnsList(String[] groupByColumnsList) { void setSourceId(Object sourceId); } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface CreateInputTableFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetSchemaUnionType { + @JsOverlay + static Operation.ToObjectReturnType0.CreateInputTableFieldType.GetSchemaUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface KindFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InMemoryKeyBackedFieldType { + @JsOverlay + static Operation.ToObjectReturnType0.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + @JsOverlay + static Operation.ToObjectReturnType0.CreateInputTableFieldType.KindFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Object getInMemoryAppendOnly(); + + @JsProperty + Operation.ToObjectReturnType0.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType getInMemoryKeyBacked(); + + @JsProperty + void setInMemoryAppendOnly(Object inMemoryAppendOnly); + + @JsProperty + void setInMemoryKeyBacked( + Operation.ToObjectReturnType0.CreateInputTableFieldType.KindFieldType.InMemoryKeyBackedFieldType inMemoryKeyBacked); + } + + @JsOverlay + static Operation.ToObjectReturnType0.CreateInputTableFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Operation.ToObjectReturnType0.CreateInputTableFieldType.KindFieldType getKind(); + + @JsProperty + Object getResultId(); + + @JsProperty + Operation.ToObjectReturnType0.CreateInputTableFieldType.GetSchemaUnionType getSchema(); + + @JsProperty + Object getSourceTableId(); + + @JsProperty + void setKind(Operation.ToObjectReturnType0.CreateInputTableFieldType.KindFieldType kind); + + @JsProperty + void setResultId(Object resultId); + + @JsProperty + void setSchema( + Operation.ToObjectReturnType0.CreateInputTableFieldType.GetSchemaUnionType schema); + + @JsOverlay + default void setSchema(String schema) { + setSchema( + Js.uncheckedCast( + schema)); + } + + @JsOverlay + default void setSchema(Uint8Array schema) { + setSchema( + Js.uncheckedCast( + schema)); + } + + @JsProperty + void setSourceTableId(Object sourceTableId); + } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CrossJoinFieldType { @JsOverlay @@ -3095,6 +3335,9 @@ static Operation.ToObjectReturnType0 create() { @JsProperty Operation.ToObjectReturnType0.ComboAggregateFieldType getComboAggregate(); + @JsProperty + Operation.ToObjectReturnType0.CreateInputTableFieldType getCreateInputTable(); + @JsProperty Operation.ToObjectReturnType0.CrossJoinFieldType getCrossJoin(); @@ -3186,6 +3429,10 @@ void setApplyPreviewColumns( @JsProperty void setComboAggregate(Operation.ToObjectReturnType0.ComboAggregateFieldType comboAggregate); + @JsProperty + void setCreateInputTable( + Operation.ToObjectReturnType0.CreateInputTableFieldType createInputTable); + @JsProperty void setCrossJoin(Operation.ToObjectReturnType0.CrossJoinFieldType crossJoin); @@ -3286,6 +3533,8 @@ public static native Operation.ToObjectReturnType toObject( public native void clearComboAggregate(); + public native void clearCreateInputTable(); + public native void clearCrossJoin(); public native void clearDropColumns(); @@ -3346,6 +3595,8 @@ public static native Operation.ToObjectReturnType toObject( public native ComboAggregateRequest getComboAggregate(); + public native CreateInputTableRequest getCreateInputTable(); + public native CrossJoinTablesRequest getCrossJoin(); public native DropColumnsRequest getDropColumns(); @@ -3408,6 +3659,8 @@ public static native Operation.ToObjectReturnType toObject( public native boolean hasComboAggregate(); + public native boolean hasCreateInputTable(); + public native boolean hasCrossJoin(); public native boolean hasDropColumns(); @@ -3476,6 +3729,10 @@ public static native Operation.ToObjectReturnType toObject( public native void setComboAggregate(ComboAggregateRequest value); + public native void setCreateInputTable(); + + public native void setCreateInputTable(CreateInputTableRequest value); + public native void setCrossJoin(); public native void setCrossJoin(CrossJoinTablesRequest value); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/batchtablerequest/operation/OpCase.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/batchtablerequest/operation/OpCase.java index 843a3b7d7c7..4878327f372 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/batchtablerequest/operation/OpCase.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/batchtablerequest/operation/OpCase.java @@ -11,6 +11,7 @@ public class OpCase { public static int AS_OF_JOIN, APPLY_PREVIEW_COLUMNS, COMBO_AGGREGATE, + CREATE_INPUT_TABLE, CROSS_JOIN, DROP_COLUMNS, EMPTY_TABLE, diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/DefinitionCase.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/DefinitionCase.java new file mode 100644 index 00000000000..105fe0249ab --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/DefinitionCase.java @@ -0,0 +1,14 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.table_pb.CreateInputTableRequest.DefinitionCase", + namespace = JsPackage.GLOBAL) +public class DefinitionCase { + public static int DEFINITION_NOT_SET, + SCHEMA, + SOURCE_TABLE_ID; +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/InputTableKind.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/InputTableKind.java new file mode 100644 index 00000000000..112d87be82f --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/InputTableKind.java @@ -0,0 +1,137 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest; + +import elemental2.core.JsArray; +import elemental2.core.Uint8Array; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest.inputtablekind.InMemoryAppendOnly; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest.inputtablekind.InMemoryKeyBacked; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest.inputtablekind.KindCase; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.table_pb.CreateInputTableRequest.InputTableKind", + namespace = JsPackage.GLOBAL) +public class InputTableKind { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InMemoryKeyBackedFieldType { + @JsOverlay + static InputTableKind.ToObjectReturnType.InMemoryKeyBackedFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + @JsOverlay + static InputTableKind.ToObjectReturnType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Object getInMemoryAppendOnly(); + + @JsProperty + InputTableKind.ToObjectReturnType.InMemoryKeyBackedFieldType getInMemoryKeyBacked(); + + @JsProperty + void setInMemoryAppendOnly(Object inMemoryAppendOnly); + + @JsProperty + void setInMemoryKeyBacked( + InputTableKind.ToObjectReturnType.InMemoryKeyBackedFieldType inMemoryKeyBacked); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType0 { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface InMemoryKeyBackedFieldType { + @JsOverlay + static InputTableKind.ToObjectReturnType0.InMemoryKeyBackedFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + @JsOverlay + static InputTableKind.ToObjectReturnType0 create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + Object getInMemoryAppendOnly(); + + @JsProperty + InputTableKind.ToObjectReturnType0.InMemoryKeyBackedFieldType getInMemoryKeyBacked(); + + @JsProperty + void setInMemoryAppendOnly(Object inMemoryAppendOnly); + + @JsProperty + void setInMemoryKeyBacked( + InputTableKind.ToObjectReturnType0.InMemoryKeyBackedFieldType inMemoryKeyBacked); + } + + public static native InputTableKind deserializeBinary(Uint8Array bytes); + + public static native InputTableKind deserializeBinaryFromReader( + InputTableKind message, Object reader); + + public static native void serializeBinaryToWriter(InputTableKind message, Object writer); + + public static native InputTableKind.ToObjectReturnType toObject( + boolean includeInstance, InputTableKind msg); + + public native void clearInMemoryAppendOnly(); + + public native void clearInMemoryKeyBacked(); + + public native InMemoryAppendOnly getInMemoryAppendOnly(); + + public native InMemoryKeyBacked getInMemoryKeyBacked(); + + public native KindCase getKindCase(); + + public native boolean hasInMemoryAppendOnly(); + + public native boolean hasInMemoryKeyBacked(); + + public native Uint8Array serializeBinary(); + + public native void setInMemoryAppendOnly(); + + public native void setInMemoryAppendOnly(InMemoryAppendOnly value); + + public native void setInMemoryKeyBacked(); + + public native void setInMemoryKeyBacked(InMemoryKeyBacked value); + + public native InputTableKind.ToObjectReturnType0 toObject(); + + public native InputTableKind.ToObjectReturnType0 toObject(boolean includeInstance); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/inputtablekind/InMemoryAppendOnly.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/inputtablekind/InMemoryAppendOnly.java new file mode 100644 index 00000000000..e9e5f050d35 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/inputtablekind/InMemoryAppendOnly.java @@ -0,0 +1,26 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest.inputtablekind; + +import elemental2.core.Uint8Array; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.table_pb.CreateInputTableRequest.InputTableKind.InMemoryAppendOnly", + namespace = JsPackage.GLOBAL) +public class InMemoryAppendOnly { + public static native InMemoryAppendOnly deserializeBinary(Uint8Array bytes); + + public static native InMemoryAppendOnly deserializeBinaryFromReader( + InMemoryAppendOnly message, Object reader); + + public static native void serializeBinaryToWriter(InMemoryAppendOnly message, Object writer); + + public static native Object toObject(boolean includeInstance, InMemoryAppendOnly msg); + + public native Uint8Array serializeBinary(); + + public native Object toObject(); + + public native Object toObject(boolean includeInstance); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/inputtablekind/InMemoryKeyBacked.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/inputtablekind/InMemoryKeyBacked.java new file mode 100644 index 00000000000..3f02c98089b --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/inputtablekind/InMemoryKeyBacked.java @@ -0,0 +1,85 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest.inputtablekind; + +import elemental2.core.JsArray; +import elemental2.core.Uint8Array; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.table_pb.CreateInputTableRequest.InputTableKind.InMemoryKeyBacked", + namespace = JsPackage.GLOBAL) +public class InMemoryKeyBacked { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType { + @JsOverlay + static InMemoryKeyBacked.ToObjectReturnType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType0 { + @JsOverlay + static InMemoryKeyBacked.ToObjectReturnType0 create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + JsArray getKeyColumnsList(); + + @JsProperty + void setKeyColumnsList(JsArray keyColumnsList); + + @JsOverlay + default void setKeyColumnsList(String[] keyColumnsList) { + setKeyColumnsList(Js.>uncheckedCast(keyColumnsList)); + } + } + + public static native InMemoryKeyBacked deserializeBinary(Uint8Array bytes); + + public static native InMemoryKeyBacked deserializeBinaryFromReader( + InMemoryKeyBacked message, Object reader); + + public static native void serializeBinaryToWriter(InMemoryKeyBacked message, Object writer); + + public static native InMemoryKeyBacked.ToObjectReturnType toObject( + boolean includeInstance, InMemoryKeyBacked msg); + + public native String addKeyColumns(String value, double index); + + public native String addKeyColumns(String value); + + public native void clearKeyColumnsList(); + + public native JsArray getKeyColumnsList(); + + public native Uint8Array serializeBinary(); + + public native void setKeyColumnsList(JsArray value); + + @JsOverlay + public final void setKeyColumnsList(String[] value) { + setKeyColumnsList(Js.>uncheckedCast(value)); + } + + public native InMemoryKeyBacked.ToObjectReturnType0 toObject(); + + public native InMemoryKeyBacked.ToObjectReturnType0 toObject(boolean includeInstance); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/inputtablekind/KindCase.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/inputtablekind/KindCase.java new file mode 100644 index 00000000000..610e3a82e84 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/createinputtablerequest/inputtablekind/KindCase.java @@ -0,0 +1,14 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.createinputtablerequest.inputtablekind; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.table_pb.CreateInputTableRequest.InputTableKind.KindCase", + namespace = JsPackage.GLOBAL) +public class KindCase { + public static int IN_MEMORY_APPEND_ONLY, + IN_MEMORY_KEY_BACKED, + KIND_NOT_SET; +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb_service/TableService.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb_service/TableService.java index 482e793a123..493db57958b 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb_service/TableService.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb_service/TableService.java @@ -188,6 +188,50 @@ static TableService.ComboAggregateType create() { void setService(Object service); } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface CreateInputTableType { + @JsOverlay + static TableService.CreateInputTableType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + String getMethodName(); + + @JsProperty + Object getRequestType(); + + @JsProperty + Object getResponseType(); + + @JsProperty + Object getService(); + + @JsProperty + boolean isRequestStream(); + + @JsProperty + boolean isResponseStream(); + + @JsProperty + void setMethodName(String methodName); + + @JsProperty + void setRequestStream(boolean requestStream); + + @JsProperty + void setRequestType(Object requestType); + + @JsProperty + void setResponseStream(boolean responseStream); + + @JsProperty + void setResponseType(Object responseType); + + @JsProperty + void setService(Object service); + } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CrossJoinTablesType { @JsOverlay @@ -1512,6 +1556,7 @@ static TableService.ViewType create() { public static TableService.AsOfJoinTablesType AsOfJoinTables; public static TableService.BatchType Batch; public static TableService.ComboAggregateType ComboAggregate; + public static TableService.CreateInputTableType CreateInputTable; public static TableService.CrossJoinTablesType CrossJoinTables; public static TableService.DropColumnsType DropColumns; public static TableService.EmptyTableType EmptyTable; diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb_service/TableServiceClient.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb_service/TableServiceClient.java index 97c5b7bee46..a0673eb24f6 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb_service/TableServiceClient.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb_service/TableServiceClient.java @@ -5,6 +5,7 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.AsOfJoinTablesRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.BatchTableRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ComboAggregateRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.CreateInputTableRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.CrossJoinTablesRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.DropColumnsRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.EmptyTableRequest; @@ -325,6 +326,99 @@ default boolean isComboAggregateMetadata_or_callbackFn() { } } + @JsFunction + public interface CreateInputTableCallbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static TableServiceClient.CreateInputTableCallbackFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getMessage(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setMessage(String message); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke( + TableServiceClient.CreateInputTableCallbackFn.P0Type p0, ExportedTableCreationResponse p1); + } + + @JsFunction + public interface CreateInputTableMetadata_or_callbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static TableServiceClient.CreateInputTableMetadata_or_callbackFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getMessage(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setMessage(String message); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke( + TableServiceClient.CreateInputTableMetadata_or_callbackFn.P0Type p0, + ExportedTableCreationResponse p1); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface CreateInputTableMetadata_or_callbackUnionType { + @JsOverlay + static TableServiceClient.CreateInputTableMetadata_or_callbackUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default BrowserHeaders asBrowserHeaders() { + return Js.cast(this); + } + + @JsOverlay + default TableServiceClient.CreateInputTableMetadata_or_callbackFn asCreateInputTableMetadata_or_callbackFn() { + return Js.cast(this); + } + + @JsOverlay + default boolean isBrowserHeaders() { + return (Object) this instanceof BrowserHeaders; + } + + @JsOverlay + default boolean isCreateInputTableMetadata_or_callbackFn() { + return (Object) this instanceof TableServiceClient.CreateInputTableMetadata_or_callbackFn; + } + } + @JsFunction public interface CrossJoinTablesCallbackFn { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) @@ -3177,6 +3271,58 @@ public native UnaryResponse comboAggregate( ComboAggregateRequest requestMessage, TableServiceClient.ComboAggregateMetadata_or_callbackUnionType metadata_or_callback); + @JsOverlay + public final UnaryResponse createInputTable( + CreateInputTableRequest requestMessage, + BrowserHeaders metadata_or_callback, + TableServiceClient.CreateInputTableCallbackFn callback) { + return createInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse createInputTable( + CreateInputTableRequest requestMessage, BrowserHeaders metadata_or_callback) { + return createInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + @JsOverlay + public final UnaryResponse createInputTable( + CreateInputTableRequest requestMessage, + TableServiceClient.CreateInputTableMetadata_or_callbackFn metadata_or_callback, + TableServiceClient.CreateInputTableCallbackFn callback) { + return createInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse createInputTable( + CreateInputTableRequest requestMessage, + TableServiceClient.CreateInputTableMetadata_or_callbackFn metadata_or_callback) { + return createInputTable( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + public native UnaryResponse createInputTable( + CreateInputTableRequest requestMessage, + TableServiceClient.CreateInputTableMetadata_or_callbackUnionType metadata_or_callback, + TableServiceClient.CreateInputTableCallbackFn callback); + + public native UnaryResponse createInputTable( + CreateInputTableRequest requestMessage, + TableServiceClient.CreateInputTableMetadata_or_callbackUnionType metadata_or_callback); + @JsOverlay public final UnaryResponse crossJoinTables( CrossJoinTablesRequest requestMessage, diff --git a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/ColumnValue.java b/web/shared-beans/src/main/java/io/deephaven/web/shared/data/ColumnValue.java deleted file mode 100644 index 4abfd547e4c..00000000000 --- a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/ColumnValue.java +++ /dev/null @@ -1,67 +0,0 @@ -package io.deephaven.web.shared.data; - -import java.io.Serializable; - -/** - * An opaque representation of a column's value to be used by clients. - * - * This allows us to send a column id and a string value, and then translate those into correctly typed objects after - * serialization. - * - * These will be useless without association with a valid table identifier, so the appropriate definition and types can - * be loaded on the receiving end. - * - */ -public class ColumnValue implements Serializable { - - public static final char ARRAY_DELIMITER = ','; - /** - * Tech debt: we replace all | with \1 in array values when escaping them. actual \1's in values should also be - * escaped, but will currently fail. - * - * Anything transporting arrays of binary data (or weird strings with control characters in them) will need to fixup - * the ColumnValueRe(/De)hydrater classes which reference this field. - */ - public static final char ESCAPER = '\1'; - public static final char ESCAPER_ESCAPED = '\2'; - public static final char NULL_SENTINEL = '\0'; - - public static String nullSentinel() { - return Character.toString(NULL_SENTINEL); - } - - public static String escaper() { - return Character.toString(ESCAPER); - } - - public static String arrayDelimiter() { - return Character.toString(ARRAY_DELIMITER); - } - - private int columnId; - private String value; - - public int getColumnId() { - return columnId; - } - - public void setColumnId(int columnId) { - this.columnId = columnId; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - @Override - public String toString() { - return "ColumnValue{" + - "columnId=" + columnId + - ", value='" + value + '\'' + - '}'; - } -} diff --git a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/RowValues.java b/web/shared-beans/src/main/java/io/deephaven/web/shared/data/RowValues.java deleted file mode 100644 index 20393c1dd58..00000000000 --- a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/RowValues.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.deephaven.web.shared.data; - -import java.io.Serializable; -import java.util.Arrays; - -/** - * A container for an array of columns to add to an input table. - * - */ -public class RowValues implements Serializable { - - private ColumnValue[] columns; - - public RowValues() {} - - public RowValues(ColumnValue... values) { - columns = values; - } - - public ColumnValue[] getColumns() { - return columns; - } - - public void setColumns(ColumnValue[] columns) { - this.columns = columns; - } - - @Override - public String toString() { - return "RowValues{" + - "columns=" + Arrays.toString(columns) + '}'; - } - - public boolean isEmpty() { - return columns.length == 0; - } -} diff --git a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/TableAttributesDefinition.java b/web/shared-beans/src/main/java/io/deephaven/web/shared/data/TableAttributesDefinition.java deleted file mode 100644 index 54f531a9e10..00000000000 --- a/web/shared-beans/src/main/java/io/deephaven/web/shared/data/TableAttributesDefinition.java +++ /dev/null @@ -1,112 +0,0 @@ -package io.deephaven.web.shared.data; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -public class TableAttributesDefinition implements Serializable { - public static final String INPUT_TABLE_ATTRIBUTE = "InputTable", - TOTALS_TABLE_ATTRIBUTE = "TotalsTable", - TABLE_DESCRIPTION_ATTRIBUTE = "TableDescription", - COLUMN_DESCRIPTIONS_ATTRIBUTE = "ColumnDescriptions", - HIERARCHICAL_SOURCE_TABLE_ATTRIBUTE = "HierarchicalSourceTable", - HIERARCHICAL_SOURCE_INFO_ATTRIBUTE = "HierarchicalSourceTableInfo", - LAYOUT_HINTS_ATTRIBUTE = "LayoutHints", - PLUGIN_NAME = "PluginName"; - - // special cased attributes that have a complex type yet are always sent - private RollupDefinition rollupDefinition;// rollup subtype of "HierarchicalSourceTableInfo" - private String treeHierarchicalColumnName;// technically a part of "HierarchicalSourceTableInfo", won't be copied - // separately - private String[][] columnDescriptions;// "ColumnDescriptions" - - // enumerate the plain keys/values - // this includes description, plugin name, totals table config - private String[] keys; - private String[] values; - - // list the unhandled keys - private String[] remainingKeys; - - private transient Map map; - - public boolean isInputTable() { - return Arrays.stream(remainingKeys).anyMatch(key -> key.equals(INPUT_TABLE_ATTRIBUTE)); - } - - public RollupDefinition getRollupDefinition() { - return rollupDefinition; - } - - public void setRollupDefinition(final RollupDefinition rollupDefinition) { - this.rollupDefinition = rollupDefinition; - } - - public String getTreeHierarchicalColumnName() { - return treeHierarchicalColumnName; - } - - public void setTreeHierarchicalColumnName(final String treeHierarchicalColumnName) { - this.treeHierarchicalColumnName = treeHierarchicalColumnName; - } - - public String[][] getColumnDescriptions() { - return columnDescriptions; - } - - public void setColumnDescriptions(final String[][] columnDescriptions) { - this.columnDescriptions = columnDescriptions; - } - - public String[] getKeys() { - return keys; - } - - public void setKeys(final String[] keys) { - this.keys = keys; - } - - public String[] getValues() { - return values; - } - - public void setValues(final String[] values) { - this.values = values; - } - - public String[] getRemainingKeys() { - return remainingKeys; - } - - public void setRemainingKeys(final String[] remainingKeys) { - this.remainingKeys = remainingKeys; - } - - // helpers for attributes that used to be on the table def - public Map getAsMap() { - if (map == null) { - map = new HashMap<>(); - for (int i = 0; i < keys.length; i++) { - map.put(keys[i], values[i]); - } - } - return map; - } - - public String getTotalsTableConfig() { - return getAsMap().get(TOTALS_TABLE_ATTRIBUTE); - } - - public String getDescription() { - return getAsMap().get(TABLE_DESCRIPTION_ATTRIBUTE); - } - - public String getPluginName() { - return getAsMap().get(PLUGIN_NAME); - } - - public String getLayoutHints() { - return getAsMap().get(LAYOUT_HINTS_ATTRIBUTE); - } -}