diff --git a/authorization/src/main/java/io/deephaven/auth/codegen/impl/ObjectServiceAuthWiring.java b/authorization/src/main/java/io/deephaven/auth/codegen/impl/ObjectServiceAuthWiring.java index 1feba9e8ed2..fbb446dc35f 100644 --- a/authorization/src/main/java/io/deephaven/auth/codegen/impl/ObjectServiceAuthWiring.java +++ b/authorization/src/main/java/io/deephaven/auth/codegen/impl/ObjectServiceAuthWiring.java @@ -92,11 +92,9 @@ public void onCallStartedMessageStream(AuthContext authContext) {} public void onMessageReceivedMessageStream(AuthContext authContext, StreamRequest request) {} - public void onMessageReceivedOpenMessageStream(AuthContext authContext, - StreamRequest request) {} + public void onMessageReceivedOpenMessageStream(AuthContext authContext, StreamRequest request) {} - public void onMessageReceivedNextMessageStream(AuthContext authContext, - StreamRequest request) {} + public void onMessageReceivedNextMessageStream(AuthContext authContext, StreamRequest request) {} } class DenyAll implements ObjectServiceAuthWiring { @@ -112,13 +110,11 @@ public void onMessageReceivedMessageStream(AuthContext authContext, StreamReques ServiceAuthWiring.operationNotAllowed(); } - public void onMessageReceivedOpenMessageStream(AuthContext authContext, - StreamRequest request) { + public void onMessageReceivedOpenMessageStream(AuthContext authContext, StreamRequest request) { ServiceAuthWiring.operationNotAllowed(); } - public void onMessageReceivedNextMessageStream(AuthContext authContext, - StreamRequest request) { + public void onMessageReceivedNextMessageStream(AuthContext authContext, StreamRequest request) { ServiceAuthWiring.operationNotAllowed(); } } @@ -144,15 +140,13 @@ public void onMessageReceivedMessageStream(AuthContext authContext, StreamReques } } - public void onMessageReceivedOpenMessageStream(AuthContext authContext, - StreamRequest request) { + public void onMessageReceivedOpenMessageStream(AuthContext authContext, StreamRequest request) { if (delegate != null) { delegate.onMessageReceivedOpenMessageStream(authContext, request); } } - public void onMessageReceivedNextMessageStream(AuthContext authContext, - StreamRequest request) { + public void onMessageReceivedNextMessageStream(AuthContext authContext, StreamRequest request) { if (delegate != null) { delegate.onMessageReceivedNextMessageStream(authContext, request); } diff --git a/authorization/src/main/java/io/deephaven/auth/codegen/impl/TableServiceContextualAuthWiring.java b/authorization/src/main/java/io/deephaven/auth/codegen/impl/TableServiceContextualAuthWiring.java index 02b8d058151..22131be70fb 100644 --- a/authorization/src/main/java/io/deephaven/auth/codegen/impl/TableServiceContextualAuthWiring.java +++ b/authorization/src/main/java/io/deephaven/auth/codegen/impl/TableServiceContextualAuthWiring.java @@ -15,6 +15,7 @@ import io.deephaven.proto.backplane.grpc.AjRajTablesRequest; import io.deephaven.proto.backplane.grpc.ApplyPreviewColumnsRequest; import io.deephaven.proto.backplane.grpc.AsOfJoinTablesRequest; +import io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest; import io.deephaven.proto.backplane.grpc.ComboAggregateRequest; import io.deephaven.proto.backplane.grpc.CreateInputTableRequest; import io.deephaven.proto.backplane.grpc.CrossJoinTablesRequest; @@ -514,6 +515,17 @@ void checkPermissionSeekRow(AuthContext authContext, SeekRowRequest request, void checkPermissionMetaTable(AuthContext authContext, MetaTableRequest request, List sourceTables); + /** + * Authorize a request to ComputeColumnStatistics. + * + * @param authContext the authentication context of the request + * @param request the request to authorize + * @param sourceTables the operation's source tables + * @throws io.grpc.StatusRuntimeException if the user is not authorized to invoke ComputeColumnStatistics + */ + void checkPermissionComputeColumnStatistics(AuthContext authContext, + ColumnStatisticsRequest request, List
sourceTables); + /** * A default implementation that funnels all requests to invoke {@code checkPermission}. */ @@ -729,6 +741,11 @@ public void checkPermissionMetaTable(AuthContext authContext, MetaTableRequest r List
sourceTables) { checkPermission(authContext, sourceTables); } + + public void checkPermissionComputeColumnStatistics(AuthContext authContext, + ColumnStatisticsRequest request, List
sourceTables) { + checkPermission(authContext, sourceTables); + } } /** @@ -1045,5 +1062,12 @@ public void checkPermissionMetaTable(AuthContext authContext, MetaTableRequest r delegate.checkPermissionMetaTable(authContext, request, sourceTables); } } + + public void checkPermissionComputeColumnStatistics(AuthContext authContext, + ColumnStatisticsRequest request, List
sourceTables) { + if (delegate != null) { + delegate.checkPermissionComputeColumnStatistics(authContext, request, sourceTables); + } + } } } diff --git a/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.grpc.pb.cc b/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.grpc.pb.cc index 38f188b66f5..57aebcf5a3a 100644 --- a/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.grpc.pb.cc +++ b/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.grpc.pb.cc @@ -69,6 +69,7 @@ static const char* TableService_method_names[] = { "/io.deephaven.proto.backplane.grpc.TableService/ExportedTableUpdates", "/io.deephaven.proto.backplane.grpc.TableService/SeekRow", "/io.deephaven.proto.backplane.grpc.TableService/MetaTable", + "/io.deephaven.proto.backplane.grpc.TableService/ComputeColumnStatistics", }; std::unique_ptr< TableService::Stub> TableService::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) { @@ -121,6 +122,7 @@ TableService::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& chann , rpcmethod_ExportedTableUpdates_(TableService_method_names[40], options.suffix_for_stats(),::grpc::internal::RpcMethod::SERVER_STREAMING, channel) , rpcmethod_SeekRow_(TableService_method_names[41], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_MetaTable_(TableService_method_names[42], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) + , rpcmethod_ComputeColumnStatistics_(TableService_method_names[43], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) {} ::grpc::Status TableService::Stub::GetExportedTableCreationResponse(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::Ticket& request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response) { @@ -1098,6 +1100,29 @@ ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::Expo return result; } +::grpc::Status TableService::Stub::ComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response) { + return ::grpc::internal::BlockingUnaryCall< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_ComputeColumnStatistics_, context, request, response); +} + +void TableService::Stub::async::ComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, std::function f) { + ::grpc::internal::CallbackUnaryCall< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ComputeColumnStatistics_, context, request, response, std::move(f)); +} + +void TableService::Stub::async::ComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, ::grpc::ClientUnaryReactor* reactor) { + ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ComputeColumnStatistics_, context, request, response, reactor); +} + +::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* TableService::Stub::PrepareAsyncComputeColumnStatisticsRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) { + return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse, ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_ComputeColumnStatistics_, context, request); +} + +::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* TableService::Stub::AsyncComputeColumnStatisticsRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) { + auto* result = + this->PrepareAsyncComputeColumnStatisticsRaw(context, request, cq); + result->StartCall(); + return result; +} + TableService::Service::Service() { AddMethod(new ::grpc::internal::RpcServiceMethod( TableService_method_names[0], @@ -1529,6 +1554,16 @@ TableService::Service::Service() { ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* resp) { return service->MetaTable(ctx, req, resp); }, this))); + AddMethod(new ::grpc::internal::RpcServiceMethod( + TableService_method_names[43], + ::grpc::internal::RpcMethod::NORMAL_RPC, + new ::grpc::internal::RpcMethodHandler< TableService::Service, ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( + [](TableService::Service* service, + ::grpc::ServerContext* ctx, + const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* req, + ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* resp) { + return service->ComputeColumnStatistics(ctx, req, resp); + }, this))); } TableService::Service::~Service() { @@ -1835,6 +1870,13 @@ ::grpc::Status TableService::Service::MetaTable(::grpc::ServerContext* context, return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } +::grpc::Status TableService::Service::ComputeColumnStatistics(::grpc::ServerContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response) { + (void) context; + (void) request; + (void) response; + return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); +} + } // namespace io } // namespace deephaven diff --git a/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.grpc.pb.h b/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.grpc.pb.h index b3c1721a96c..5fb1172ab14 100644 --- a/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.grpc.pb.h +++ b/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.grpc.pb.h @@ -456,6 +456,17 @@ class TableService final { std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>> PrepareAsyncMetaTable(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest& request, ::grpc::CompletionQueue* cq) { return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>>(PrepareAsyncMetaTableRaw(context, request, cq)); } + // * + // Returns a new table representing statistics about a single column of the provided table. This + // result table will be static - use Aggregation() instead for updating results. Presently, the + // primary use case for this is the Deephaven Web UI. + virtual ::grpc::Status ComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response) = 0; + std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>> AsyncComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) { + return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>>(AsyncComputeColumnStatisticsRaw(context, request, cq)); + } + std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>> PrepareAsyncComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) { + return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>>(PrepareAsyncComputeColumnStatisticsRaw(context, request, cq)); + } class async_interface { public: virtual ~async_interface() {} @@ -652,6 +663,12 @@ class TableService final { // Returns the meta table of a table. virtual void MetaTable(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, std::function) = 0; virtual void MetaTable(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0; + // * + // Returns a new table representing statistics about a single column of the provided table. This + // result table will be static - use Aggregation() instead for updating results. Presently, the + // primary use case for this is the Deephaven Web UI. + virtual void ComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, std::function) = 0; + virtual void ComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0; }; typedef class async_interface experimental_async_interface; virtual class async_interface* async() { return nullptr; } @@ -745,6 +762,8 @@ class TableService final { virtual ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::SeekRowResponse>* PrepareAsyncSeekRowRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::SeekRowRequest& request, ::grpc::CompletionQueue* cq) = 0; virtual ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* AsyncMetaTableRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest& request, ::grpc::CompletionQueue* cq) = 0; virtual ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* PrepareAsyncMetaTableRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest& request, ::grpc::CompletionQueue* cq) = 0; + virtual ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* AsyncComputeColumnStatisticsRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) = 0; + virtual ::grpc::ClientAsyncResponseReaderInterface< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* PrepareAsyncComputeColumnStatisticsRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) = 0; }; class Stub final : public StubInterface { public: @@ -1054,6 +1073,13 @@ class TableService final { std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>> PrepareAsyncMetaTable(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest& request, ::grpc::CompletionQueue* cq) { return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>>(PrepareAsyncMetaTableRaw(context, request, cq)); } + ::grpc::Status ComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response) override; + std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>> AsyncComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) { + return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>>(AsyncComputeColumnStatisticsRaw(context, request, cq)); + } + std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>> PrepareAsyncComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) { + return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>>(PrepareAsyncComputeColumnStatisticsRaw(context, request, cq)); + } class async final : public StubInterface::async_interface { public: @@ -1141,6 +1167,8 @@ class TableService final { void SeekRow(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::SeekRowRequest* request, ::io::deephaven::proto::backplane::grpc::SeekRowResponse* response, ::grpc::ClientUnaryReactor* reactor) override; void MetaTable(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, std::function) override; void MetaTable(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, ::grpc::ClientUnaryReactor* reactor) override; + void ComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, std::function) override; + void ComputeColumnStatistics(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response, ::grpc::ClientUnaryReactor* reactor) override; private: friend class Stub; explicit async(Stub* stub): stub_(stub) { } @@ -1240,6 +1268,8 @@ class TableService final { ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::SeekRowResponse>* PrepareAsyncSeekRowRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::SeekRowRequest& request, ::grpc::CompletionQueue* cq) override; ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* AsyncMetaTableRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest& request, ::grpc::CompletionQueue* cq) override; ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* PrepareAsyncMetaTableRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest& request, ::grpc::CompletionQueue* cq) override; + ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* AsyncComputeColumnStatisticsRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) override; + ::grpc::ClientAsyncResponseReader< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* PrepareAsyncComputeColumnStatisticsRaw(::grpc::ClientContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& request, ::grpc::CompletionQueue* cq) override; const ::grpc::internal::RpcMethod rpcmethod_GetExportedTableCreationResponse_; const ::grpc::internal::RpcMethod rpcmethod_FetchTable_; const ::grpc::internal::RpcMethod rpcmethod_ApplyPreviewColumns_; @@ -1283,6 +1313,7 @@ class TableService final { const ::grpc::internal::RpcMethod rpcmethod_ExportedTableUpdates_; const ::grpc::internal::RpcMethod rpcmethod_SeekRow_; const ::grpc::internal::RpcMethod rpcmethod_MetaTable_; + const ::grpc::internal::RpcMethod rpcmethod_ComputeColumnStatistics_; }; static std::unique_ptr NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions()); @@ -1442,6 +1473,11 @@ class TableService final { // // Returns the meta table of a table. virtual ::grpc::Status MetaTable(::grpc::ServerContext* context, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response); + // * + // Returns a new table representing statistics about a single column of the provided table. This + // result table will be static - use Aggregation() instead for updating results. Presently, the + // primary use case for this is the Deephaven Web UI. + virtual ::grpc::Status ComputeColumnStatistics(::grpc::ServerContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response); }; template class WithAsyncMethod_GetExportedTableCreationResponse : public BaseClass { @@ -2303,7 +2339,27 @@ class TableService final { ::grpc::Service::RequestAsyncUnary(42, context, request, response, new_call_cq, notification_cq, tag); } }; - typedef WithAsyncMethod_GetExportedTableCreationResponse > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > AsyncService; + template + class WithAsyncMethod_ComputeColumnStatistics : public BaseClass { + private: + void BaseClassMustBeDerivedFromService(const Service* /*service*/) {} + public: + WithAsyncMethod_ComputeColumnStatistics() { + ::grpc::Service::MarkMethodAsync(43); + } + ~WithAsyncMethod_ComputeColumnStatistics() override { + BaseClassMustBeDerivedFromService(this); + } + // disable synchronous version of this method + ::grpc::Status ComputeColumnStatistics(::grpc::ServerContext* /*context*/, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* /*request*/, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* /*response*/) override { + abort(); + return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); + } + void RequestComputeColumnStatistics(::grpc::ServerContext* context, ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::grpc::ServerAsyncResponseWriter< ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) { + ::grpc::Service::RequestAsyncUnary(43, context, request, response, new_call_cq, notification_cq, tag); + } + }; + typedef WithAsyncMethod_GetExportedTableCreationResponse > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > AsyncService; template class WithCallbackMethod_GetExportedTableCreationResponse : public BaseClass { private: @@ -3455,7 +3511,34 @@ class TableService final { virtual ::grpc::ServerUnaryReactor* MetaTable( ::grpc::CallbackServerContext* /*context*/, const ::io::deephaven::proto::backplane::grpc::MetaTableRequest* /*request*/, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* /*response*/) { return nullptr; } }; - typedef WithCallbackMethod_GetExportedTableCreationResponse > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > CallbackService; + template + class WithCallbackMethod_ComputeColumnStatistics : public BaseClass { + private: + void BaseClassMustBeDerivedFromService(const Service* /*service*/) {} + public: + WithCallbackMethod_ComputeColumnStatistics() { + ::grpc::Service::MarkMethodCallback(43, + new ::grpc::internal::CallbackUnaryHandler< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>( + [this]( + ::grpc::CallbackServerContext* context, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* request, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* response) { return this->ComputeColumnStatistics(context, request, response); }));} + void SetMessageAllocatorFor_ComputeColumnStatistics( + ::grpc::MessageAllocator< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* allocator) { + ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(43); + static_cast<::grpc::internal::CallbackUnaryHandler< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>*>(handler) + ->SetMessageAllocator(allocator); + } + ~WithCallbackMethod_ComputeColumnStatistics() override { + BaseClassMustBeDerivedFromService(this); + } + // disable synchronous version of this method + ::grpc::Status ComputeColumnStatistics(::grpc::ServerContext* /*context*/, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* /*request*/, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* /*response*/) override { + abort(); + return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); + } + virtual ::grpc::ServerUnaryReactor* ComputeColumnStatistics( + ::grpc::CallbackServerContext* /*context*/, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* /*request*/, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* /*response*/) { return nullptr; } + }; + typedef WithCallbackMethod_GetExportedTableCreationResponse > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > CallbackService; typedef CallbackService ExperimentalCallbackService; template class WithGenericMethod_GetExportedTableCreationResponse : public BaseClass { @@ -4189,6 +4272,23 @@ class TableService final { } }; template + class WithGenericMethod_ComputeColumnStatistics : public BaseClass { + private: + void BaseClassMustBeDerivedFromService(const Service* /*service*/) {} + public: + WithGenericMethod_ComputeColumnStatistics() { + ::grpc::Service::MarkMethodGeneric(43); + } + ~WithGenericMethod_ComputeColumnStatistics() override { + BaseClassMustBeDerivedFromService(this); + } + // disable synchronous version of this method + ::grpc::Status ComputeColumnStatistics(::grpc::ServerContext* /*context*/, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* /*request*/, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* /*response*/) override { + abort(); + return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); + } + }; + template class WithRawMethod_GetExportedTableCreationResponse : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service* /*service*/) {} @@ -5049,6 +5149,26 @@ class TableService final { } }; template + class WithRawMethod_ComputeColumnStatistics : public BaseClass { + private: + void BaseClassMustBeDerivedFromService(const Service* /*service*/) {} + public: + WithRawMethod_ComputeColumnStatistics() { + ::grpc::Service::MarkMethodRaw(43); + } + ~WithRawMethod_ComputeColumnStatistics() override { + BaseClassMustBeDerivedFromService(this); + } + // disable synchronous version of this method + ::grpc::Status ComputeColumnStatistics(::grpc::ServerContext* /*context*/, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* /*request*/, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* /*response*/) override { + abort(); + return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); + } + void RequestComputeColumnStatistics(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) { + ::grpc::Service::RequestAsyncUnary(43, context, request, response, new_call_cq, notification_cq, tag); + } + }; + template class WithRawCallbackMethod_GetExportedTableCreationResponse : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service* /*service*/) {} @@ -5995,6 +6115,28 @@ class TableService final { ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/) { return nullptr; } }; template + class WithRawCallbackMethod_ComputeColumnStatistics : public BaseClass { + private: + void BaseClassMustBeDerivedFromService(const Service* /*service*/) {} + public: + WithRawCallbackMethod_ComputeColumnStatistics() { + ::grpc::Service::MarkMethodRawCallback(43, + new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>( + [this]( + ::grpc::CallbackServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->ComputeColumnStatistics(context, request, response); })); + } + ~WithRawCallbackMethod_ComputeColumnStatistics() override { + BaseClassMustBeDerivedFromService(this); + } + // disable synchronous version of this method + ::grpc::Status ComputeColumnStatistics(::grpc::ServerContext* /*context*/, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* /*request*/, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* /*response*/) override { + abort(); + return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); + } + virtual ::grpc::ServerUnaryReactor* ComputeColumnStatistics( + ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/) { return nullptr; } + }; + template class WithStreamedUnaryMethod_GetExportedTableCreationResponse : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service* /*service*/) {} @@ -7101,7 +7243,34 @@ class TableService final { // replace default version of method with streamed unary virtual ::grpc::Status StreamedMetaTable(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::io::deephaven::proto::backplane::grpc::MetaTableRequest,::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* server_unary_streamer) = 0; }; - typedef WithStreamedUnaryMethod_GetExportedTableCreationResponse > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > StreamedUnaryService; + template + class WithStreamedUnaryMethod_ComputeColumnStatistics : public BaseClass { + private: + void BaseClassMustBeDerivedFromService(const Service* /*service*/) {} + public: + WithStreamedUnaryMethod_ComputeColumnStatistics() { + ::grpc::Service::MarkMethodStreamed(43, + new ::grpc::internal::StreamedUnaryHandler< + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>( + [this](::grpc::ServerContext* context, + ::grpc::ServerUnaryStreamer< + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* streamer) { + return this->StreamedComputeColumnStatistics(context, + streamer); + })); + } + ~WithStreamedUnaryMethod_ComputeColumnStatistics() override { + BaseClassMustBeDerivedFromService(this); + } + // disable regular version of this method + ::grpc::Status ComputeColumnStatistics(::grpc::ServerContext* /*context*/, const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* /*request*/, ::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse* /*response*/) override { + abort(); + return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); + } + // replace default version of method with streamed unary + virtual ::grpc::Status StreamedComputeColumnStatistics(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest,::io::deephaven::proto::backplane::grpc::ExportedTableCreationResponse>* server_unary_streamer) = 0; + }; + typedef WithStreamedUnaryMethod_GetExportedTableCreationResponse > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > StreamedUnaryService; template class WithSplitStreamingMethod_Batch : public BaseClass { private: @@ -7157,7 +7326,7 @@ class TableService final { virtual ::grpc::Status StreamedExportedTableUpdates(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::io::deephaven::proto::backplane::grpc::ExportedTableUpdatesRequest,::io::deephaven::proto::backplane::grpc::ExportedTableUpdateMessage>* server_split_streamer) = 0; }; typedef WithSplitStreamingMethod_Batch > SplitStreamedService; - typedef WithStreamedUnaryMethod_GetExportedTableCreationResponse > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > StreamedService; + typedef WithStreamedUnaryMethod_GetExportedTableCreationResponse > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > StreamedService; }; } // namespace grpc diff --git a/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.pb.cc b/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.pb.cc index 70a6447a067..ef808bcfcb0 100644 --- a/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.pb.cc +++ b/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.pb.cc @@ -1600,6 +1600,21 @@ struct WhereInRequestDefaultTypeInternal { }; }; PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 WhereInRequestDefaultTypeInternal _WhereInRequest_default_instance_; +PROTOBUF_CONSTEXPR ColumnStatisticsRequest::ColumnStatisticsRequest( + ::_pbi::ConstantInitialized) + : column_name_(&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}) + , result_id_(nullptr) + , source_id_(nullptr) + , unique_value_limit_(0){} +struct ColumnStatisticsRequestDefaultTypeInternal { + PROTOBUF_CONSTEXPR ColumnStatisticsRequestDefaultTypeInternal() + : _instance(::_pbi::ConstantInitialized{}) {} + ~ColumnStatisticsRequestDefaultTypeInternal() {} + union { + ColumnStatisticsRequest _instance; + }; +}; +PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ColumnStatisticsRequestDefaultTypeInternal _ColumnStatisticsRequest_default_instance_; PROTOBUF_CONSTEXPR BatchTableRequest_Operation::BatchTableRequest_Operation( ::_pbi::ConstantInitialized) : _oneof_case_{}{} @@ -1629,7 +1644,7 @@ PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORIT } // namespace proto } // namespace deephaven } // namespace io -static ::_pb::Metadata file_level_metadata_deephaven_2fproto_2ftable_2eproto[119]; +static ::_pb::Metadata file_level_metadata_deephaven_2fproto_2ftable_2eproto[120]; static const ::_pb::EnumDescriptor* file_level_enum_descriptors_deephaven_2fproto_2ftable_2eproto[12]; static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_deephaven_2fproto_2ftable_2eproto = nullptr; @@ -2707,6 +2722,20 @@ const uint32_t TableStruct_deephaven_2fproto_2ftable_2eproto::offsets[] PROTOBUF PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::WhereInRequest, right_id_), PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::WhereInRequest, inverted_), PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::WhereInRequest, columns_to_match_), + PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, _has_bits_), + PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _inlined_string_donated_ + PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, result_id_), + PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, source_id_), + PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, column_name_), + PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest, unique_value_limit_), + ~0u, + ~0u, + ~0u, + 0, ~0u, // no _has_bits_ PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::BatchTableRequest_Operation, _internal_metadata_), ~0u, // no _extensions_ @@ -2752,6 +2781,7 @@ const uint32_t TableStruct_deephaven_2fproto_2ftable_2eproto::offsets[] PROTOBUF ::_pbi::kInvalidFieldOffsetTag, ::_pbi::kInvalidFieldOffsetTag, ::_pbi::kInvalidFieldOffsetTag, + ::_pbi::kInvalidFieldOffsetTag, PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::BatchTableRequest_Operation, op_), ~0u, // no _has_bits_ PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::BatchTableRequest, _internal_metadata_), @@ -2879,8 +2909,9 @@ static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protode { 1042, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::CreateInputTableRequest_InputTableKind)}, { 1051, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::CreateInputTableRequest)}, { 1062, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::WhereInRequest)}, - { 1073, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::BatchTableRequest_Operation)}, - { 1119, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::BatchTableRequest)}, + { 1073, 1083, -1, sizeof(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest)}, + { 1087, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::BatchTableRequest_Operation)}, + { 1134, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::BatchTableRequest)}, }; static const ::_pb::Message* const file_default_instances[] = { @@ -3001,6 +3032,7 @@ static const ::_pb::Message* const file_default_instances[] = { &::io::deephaven::proto::backplane::grpc::_CreateInputTableRequest_InputTableKind_default_instance_._instance, &::io::deephaven::proto::backplane::grpc::_CreateInputTableRequest_default_instance_._instance, &::io::deephaven::proto::backplane::grpc::_WhereInRequest_default_instance_._instance, + &::io::deephaven::proto::backplane::grpc::_ColumnStatisticsRequest_default_instance_._instance, &::io::deephaven::proto::backplane::grpc::_BatchTableRequest_Operation_default_instance_._instance, &::io::deephaven::proto::backplane::grpc::_BatchTableRequest_default_instance_._instance, }; @@ -3611,257 +3643,269 @@ const char descriptor_table_protodef_deephaven_2fproto_2ftable_2eproto[] PROTOBU "deephaven.proto.backplane.grpc.TableRefe" "rence\022C\n\010right_id\030\003 \001(\01321.io.deephaven.p" "roto.backplane.grpc.TableReference\022\020\n\010in" - "verted\030\004 \001(\010\022\030\n\020columns_to_match\030\005 \003(\t\"\357" - "\030\n\021BatchTableRequest\022K\n\003ops\030\001 \003(\0132>.io.d" - "eephaven.proto.backplane.grpc.BatchTable" - "Request.Operation\032\214\030\n\tOperation\022K\n\013empty" - "_table\030\001 \001(\01324.io.deephaven.proto.backpl" - "ane.grpc.EmptyTableRequestH\000\022I\n\ntime_tab" - "le\030\002 \001(\01323.io.deephaven.proto.backplane." - "grpc.TimeTableRequestH\000\022M\n\014drop_columns\030" - "\003 \001(\01325.io.deephaven.proto.backplane.grp" - "c.DropColumnsRequestH\000\022J\n\006update\030\004 \001(\01328" - ".io.deephaven.proto.backplane.grpc.Selec" - "tOrUpdateRequestH\000\022O\n\013lazy_update\030\005 \001(\0132" - "8.io.deephaven.proto.backplane.grpc.Sele" - "ctOrUpdateRequestH\000\022H\n\004view\030\006 \001(\01328.io.d" - "eephaven.proto.backplane.grpc.SelectOrUp" - "dateRequestH\000\022O\n\013update_view\030\007 \001(\01328.io." - "deephaven.proto.backplane.grpc.SelectOrU" - "pdateRequestH\000\022J\n\006select\030\010 \001(\01328.io.deep" - "haven.proto.backplane.grpc.SelectOrUpdat" - "eRequestH\000\022S\n\017select_distinct\030\t \001(\01328.io" - ".deephaven.proto.backplane.grpc.SelectDi" - "stinctRequestH\000\022G\n\006filter\030\n \001(\01325.io.dee" - "phaven.proto.backplane.grpc.FilterTableR" - "equestH\000\022`\n\023unstructured_filter\030\013 \001(\0132A." - "io.deephaven.proto.backplane.grpc.Unstru" - "cturedFilterTableRequestH\000\022C\n\004sort\030\014 \001(\013" - "23.io.deephaven.proto.backplane.grpc.Sor" - "tTableRequestH\000\022D\n\004head\030\r \001(\01324.io.deeph" - "aven.proto.backplane.grpc.HeadOrTailRequ" - "estH\000\022D\n\004tail\030\016 \001(\01324.io.deephaven.proto" - ".backplane.grpc.HeadOrTailRequestH\000\022I\n\007h" - "ead_by\030\017 \001(\01326.io.deephaven.proto.backpl" - "ane.grpc.HeadOrTailByRequestH\000\022I\n\007tail_b" - "y\030\020 \001(\01326.io.deephaven.proto.backplane.g" - "rpc.HeadOrTailByRequestH\000\022D\n\007ungroup\030\021 \001" - "(\01321.io.deephaven.proto.backplane.grpc.U" - "ngroupRequestH\000\022F\n\005merge\030\022 \001(\01325.io.deep" - "haven.proto.backplane.grpc.MergeTablesRe" - "questH\000\022S\n\017combo_aggregate\030\023 \001(\01328.io.de" - "ephaven.proto.backplane.grpc.ComboAggreg" - "ateRequestH\000\022D\n\007flatten\030\025 \001(\01321.io.deeph" - "aven.proto.backplane.grpc.FlattenRequest" - "H\000\022\\\n\024run_chart_downsample\030\026 \001(\0132<.io.de" - "ephaven.proto.backplane.grpc.RunChartDow" - "nsampleRequestH\000\022O\n\ncross_join\030\027 \001(\01329.i" - "o.deephaven.proto.backplane.grpc.CrossJo" - "inTablesRequestH\000\022S\n\014natural_join\030\030 \001(\0132" - ";.io.deephaven.proto.backplane.grpc.Natu" - "ralJoinTablesRequestH\000\022O\n\nexact_join\030\031 \001" - "(\01329.io.deephaven.proto.backplane.grpc.E" - "xactJoinTablesRequestH\000\022M\n\tleft_join\030\032 \001" - "(\01328.io.deephaven.proto.backplane.grpc.L" - "eftJoinTablesRequestH\000\022R\n\nas_of_join\030\033 \001" - "(\01328.io.deephaven.proto.backplane.grpc.A" - "sOfJoinTablesRequestB\002\030\001H\000\022K\n\013fetch_tabl" - "e\030\034 \001(\01324.io.deephaven.proto.backplane.g" - "rpc.FetchTableRequestH\000\022^\n\025apply_preview" - "_columns\030\036 \001(\0132=.io.deephaven.proto.back" - "plane.grpc.ApplyPreviewColumnsRequestH\000\022" - "X\n\022create_input_table\030\037 \001(\0132:.io.deephav" - "en.proto.backplane.grpc.CreateInputTable" - "RequestH\000\022G\n\tupdate_by\030 \001(\01322.io.deepha" - "ven.proto.backplane.grpc.UpdateByRequest" - "H\000\022E\n\010where_in\030! \001(\01321.io.deephaven.prot" - "o.backplane.grpc.WhereInRequestH\000\022O\n\ragg" - "regate_all\030\" \001(\01326.io.deephaven.proto.ba" - "ckplane.grpc.AggregateAllRequestH\000\022H\n\tag" - "gregate\030# \001(\01323.io.deephaven.proto.backp" - "lane.grpc.AggregateRequestH\000\022K\n\010snapshot" - "\030$ \001(\01327.io.deephaven.proto.backplane.gr" - "pc.SnapshotTableRequestH\000\022T\n\rsnapshot_wh" - "en\030% \001(\0132;.io.deephaven.proto.backplane." - "grpc.SnapshotWhenTableRequestH\000\022I\n\nmeta_" - "table\030& \001(\01323.io.deephaven.proto.backpla" - "ne.grpc.MetaTableRequestH\000\022O\n\nrange_join" - "\030\' \001(\01329.io.deephaven.proto.backplane.gr" - "pc.RangeJoinTablesRequestH\000\022C\n\002aj\030( \001(\0132" - "5.io.deephaven.proto.backplane.grpc.AjRa" - "jTablesRequestH\000\022D\n\003raj\030) \001(\01325.io.deeph" - "aven.proto.backplane.grpc.AjRajTablesReq" - "uestH\000B\004\n\002opJ\004\010\024\020\025J\004\010\035\020\036*b\n\017BadDataBehav" - "ior\022#\n\037BAD_DATA_BEHAVIOR_NOT_SPECIFIED\020\000" - "\022\t\n\005THROW\020\001\022\t\n\005RESET\020\002\022\010\n\004SKIP\020\003\022\n\n\006POIS" - "ON\020\004*t\n\024UpdateByNullBehavior\022\037\n\033NULL_BEH" - "AVIOR_NOT_SPECIFIED\020\000\022\022\n\016NULL_DOMINATES\020" - "\001\022\023\n\017VALUE_DOMINATES\020\002\022\022\n\016ZERO_DOMINATES" - "\020\003*\033\n\tNullValue\022\016\n\nNULL_VALUE\020\000*2\n\017CaseS" - "ensitivity\022\016\n\nMATCH_CASE\020\000\022\017\n\013IGNORE_CAS" - "E\020\001*&\n\tMatchType\022\013\n\007REGULAR\020\000\022\014\n\010INVERTE" - "D\020\0012\214/\n\014TableService\022\221\001\n GetExportedTabl" - "eCreationResponse\022).io.deephaven.proto.b" - "ackplane.grpc.Ticket\032@.io.deephaven.prot" - "o.backplane.grpc.ExportedTableCreationRe" - "sponse\"\000\022\206\001\n\nFetchTable\0224.io.deephaven.p" - "roto.backplane.grpc.FetchTableRequest\032@." - "io.deephaven.proto.backplane.grpc.Export" - "edTableCreationResponse\"\000\022\230\001\n\023ApplyPrevi" - "ewColumns\022=.io.deephaven.proto.backplane" - ".grpc.ApplyPreviewColumnsRequest\032@.io.de" - "ephaven.proto.backplane.grpc.ExportedTab" - "leCreationResponse\"\000\022\206\001\n\nEmptyTable\0224.io" - ".deephaven.proto.backplane.grpc.EmptyTab" - "leRequest\032@.io.deephaven.proto.backplane" - ".grpc.ExportedTableCreationResponse\"\000\022\204\001" - "\n\tTimeTable\0223.io.deephaven.proto.backpla" - "ne.grpc.TimeTableRequest\032@.io.deephaven." - "proto.backplane.grpc.ExportedTableCreati" - "onResponse\"\000\022\210\001\n\013DropColumns\0225.io.deepha" - "ven.proto.backplane.grpc.DropColumnsRequ" - "est\032@.io.deephaven.proto.backplane.grpc." - "ExportedTableCreationResponse\"\000\022\206\001\n\006Upda" - "te\0228.io.deephaven.proto.backplane.grpc.S" - "electOrUpdateRequest\032@.io.deephaven.prot" - "o.backplane.grpc.ExportedTableCreationRe" - "sponse\"\000\022\212\001\n\nLazyUpdate\0228.io.deephaven.p" - "roto.backplane.grpc.SelectOrUpdateReques" - "t\032@.io.deephaven.proto.backplane.grpc.Ex" - "portedTableCreationResponse\"\000\022\204\001\n\004View\0228" - ".io.deephaven.proto.backplane.grpc.Selec" - "tOrUpdateRequest\032@.io.deephaven.proto.ba" - "ckplane.grpc.ExportedTableCreationRespon" - "se\"\000\022\212\001\n\nUpdateView\0228.io.deephaven.proto" - ".backplane.grpc.SelectOrUpdateRequest\032@." - "io.deephaven.proto.backplane.grpc.Export" - "edTableCreationResponse\"\000\022\206\001\n\006Select\0228.i" + "verted\030\004 \001(\010\022\030\n\020columns_to_match\030\005 \003(\t\"\352" + "\001\n\027ColumnStatisticsRequest\022<\n\tresult_id\030" + "\001 \001(\0132).io.deephaven.proto.backplane.grp" + "c.Ticket\022D\n\tsource_id\030\002 \001(\01321.io.deephav" + "en.proto.backplane.grpc.TableReference\022\023" + "\n\013column_name\030\003 \001(\t\022\037\n\022unique_value_limi" + "t\030\004 \001(\005H\000\210\001\001B\025\n\023_unique_value_limit\"\310\031\n\021" + "BatchTableRequest\022K\n\003ops\030\001 \003(\0132>.io.deep" + "haven.proto.backplane.grpc.BatchTableReq" + "uest.Operation\032\345\030\n\tOperation\022K\n\013empty_ta" + "ble\030\001 \001(\01324.io.deephaven.proto.backplane" + ".grpc.EmptyTableRequestH\000\022I\n\ntime_table\030" + "\002 \001(\01323.io.deephaven.proto.backplane.grp" + "c.TimeTableRequestH\000\022M\n\014drop_columns\030\003 \001" + "(\01325.io.deephaven.proto.backplane.grpc.D" + "ropColumnsRequestH\000\022J\n\006update\030\004 \001(\01328.io" + ".deephaven.proto.backplane.grpc.SelectOr" + "UpdateRequestH\000\022O\n\013lazy_update\030\005 \001(\01328.i" "o.deephaven.proto.backplane.grpc.SelectO" - "rUpdateRequest\032@.io.deephaven.proto.back" - "plane.grpc.ExportedTableCreationResponse" - "\"\000\022\202\001\n\010UpdateBy\0222.io.deephaven.proto.bac" - "kplane.grpc.UpdateByRequest\032@.io.deephav" - "en.proto.backplane.grpc.ExportedTableCre" - "ationResponse\"\000\022\216\001\n\016SelectDistinct\0228.io." - "deephaven.proto.backplane.grpc.SelectDis" - "tinctRequest\032@.io.deephaven.proto.backpl" - "ane.grpc.ExportedTableCreationResponse\"\000" - "\022\203\001\n\006Filter\0225.io.deephaven.proto.backpla" - "ne.grpc.FilterTableRequest\032@.io.deephave" + "rUpdateRequestH\000\022H\n\004view\030\006 \001(\01328.io.deep" + "haven.proto.backplane.grpc.SelectOrUpdat" + "eRequestH\000\022O\n\013update_view\030\007 \001(\01328.io.dee" + "phaven.proto.backplane.grpc.SelectOrUpda" + "teRequestH\000\022J\n\006select\030\010 \001(\01328.io.deephav" + "en.proto.backplane.grpc.SelectOrUpdateRe" + "questH\000\022S\n\017select_distinct\030\t \001(\01328.io.de" + "ephaven.proto.backplane.grpc.SelectDisti" + "nctRequestH\000\022G\n\006filter\030\n \001(\01325.io.deepha" + "ven.proto.backplane.grpc.FilterTableRequ" + "estH\000\022`\n\023unstructured_filter\030\013 \001(\0132A.io." + "deephaven.proto.backplane.grpc.Unstructu" + "redFilterTableRequestH\000\022C\n\004sort\030\014 \001(\01323." + "io.deephaven.proto.backplane.grpc.SortTa" + "bleRequestH\000\022D\n\004head\030\r \001(\01324.io.deephave" + "n.proto.backplane.grpc.HeadOrTailRequest" + "H\000\022D\n\004tail\030\016 \001(\01324.io.deephaven.proto.ba" + "ckplane.grpc.HeadOrTailRequestH\000\022I\n\007head" + "_by\030\017 \001(\01326.io.deephaven.proto.backplane" + ".grpc.HeadOrTailByRequestH\000\022I\n\007tail_by\030\020" + " \001(\01326.io.deephaven.proto.backplane.grpc" + ".HeadOrTailByRequestH\000\022D\n\007ungroup\030\021 \001(\0132" + "1.io.deephaven.proto.backplane.grpc.Ungr" + "oupRequestH\000\022F\n\005merge\030\022 \001(\01325.io.deephav" + "en.proto.backplane.grpc.MergeTablesReque" + "stH\000\022S\n\017combo_aggregate\030\023 \001(\01328.io.deeph" + "aven.proto.backplane.grpc.ComboAggregate" + "RequestH\000\022D\n\007flatten\030\025 \001(\01321.io.deephave" + "n.proto.backplane.grpc.FlattenRequestH\000\022" + "\\\n\024run_chart_downsample\030\026 \001(\0132<.io.deeph" + "aven.proto.backplane.grpc.RunChartDownsa" + "mpleRequestH\000\022O\n\ncross_join\030\027 \001(\01329.io.d" + "eephaven.proto.backplane.grpc.CrossJoinT" + "ablesRequestH\000\022S\n\014natural_join\030\030 \001(\0132;.i" + "o.deephaven.proto.backplane.grpc.Natural" + "JoinTablesRequestH\000\022O\n\nexact_join\030\031 \001(\0132" + "9.io.deephaven.proto.backplane.grpc.Exac" + "tJoinTablesRequestH\000\022M\n\tleft_join\030\032 \001(\0132" + "8.io.deephaven.proto.backplane.grpc.Left" + "JoinTablesRequestH\000\022R\n\nas_of_join\030\033 \001(\0132" + "8.io.deephaven.proto.backplane.grpc.AsOf" + "JoinTablesRequestB\002\030\001H\000\022K\n\013fetch_table\030\034" + " \001(\01324.io.deephaven.proto.backplane.grpc" + ".FetchTableRequestH\000\022^\n\025apply_preview_co" + "lumns\030\036 \001(\0132=.io.deephaven.proto.backpla" + "ne.grpc.ApplyPreviewColumnsRequestH\000\022X\n\022" + "create_input_table\030\037 \001(\0132:.io.deephaven." + "proto.backplane.grpc.CreateInputTableReq" + "uestH\000\022G\n\tupdate_by\030 \001(\01322.io.deephaven" + ".proto.backplane.grpc.UpdateByRequestH\000\022" + "E\n\010where_in\030! \001(\01321.io.deephaven.proto.b" + "ackplane.grpc.WhereInRequestH\000\022O\n\raggreg" + "ate_all\030\" \001(\01326.io.deephaven.proto.backp" + "lane.grpc.AggregateAllRequestH\000\022H\n\taggre" + "gate\030# \001(\01323.io.deephaven.proto.backplan" + "e.grpc.AggregateRequestH\000\022K\n\010snapshot\030$ " + "\001(\01327.io.deephaven.proto.backplane.grpc." + "SnapshotTableRequestH\000\022T\n\rsnapshot_when\030" + "% \001(\0132;.io.deephaven.proto.backplane.grp" + "c.SnapshotWhenTableRequestH\000\022I\n\nmeta_tab" + "le\030& \001(\01323.io.deephaven.proto.backplane." + "grpc.MetaTableRequestH\000\022O\n\nrange_join\030\' " + "\001(\01329.io.deephaven.proto.backplane.grpc." + "RangeJoinTablesRequestH\000\022C\n\002aj\030( \001(\01325.i" + "o.deephaven.proto.backplane.grpc.AjRajTa" + "blesRequestH\000\022D\n\003raj\030) \001(\01325.io.deephave" + "n.proto.backplane.grpc.AjRajTablesReques" + "tH\000\022W\n\021column_statistics\030* \001(\0132:.io.deep" + "haven.proto.backplane.grpc.ColumnStatist" + "icsRequestH\000B\004\n\002opJ\004\010\024\020\025J\004\010\035\020\036*b\n\017BadDat" + "aBehavior\022#\n\037BAD_DATA_BEHAVIOR_NOT_SPECI" + "FIED\020\000\022\t\n\005THROW\020\001\022\t\n\005RESET\020\002\022\010\n\004SKIP\020\003\022\n" + "\n\006POISON\020\004*t\n\024UpdateByNullBehavior\022\037\n\033NU" + "LL_BEHAVIOR_NOT_SPECIFIED\020\000\022\022\n\016NULL_DOMI" + "NATES\020\001\022\023\n\017VALUE_DOMINATES\020\002\022\022\n\016ZERO_DOM" + "INATES\020\003*\033\n\tNullValue\022\016\n\nNULL_VALUE\020\000*2\n" + "\017CaseSensitivity\022\016\n\nMATCH_CASE\020\000\022\017\n\013IGNO" + "RE_CASE\020\001*&\n\tMatchType\022\013\n\007REGULAR\020\000\022\014\n\010I" + "NVERTED\020\0012\2500\n\014TableService\022\221\001\n GetExport" + "edTableCreationResponse\022).io.deephaven.p" + "roto.backplane.grpc.Ticket\032@.io.deephave" "n.proto.backplane.grpc.ExportedTableCrea" - "tionResponse\"\000\022\233\001\n\022UnstructuredFilter\022A." - "io.deephaven.proto.backplane.grpc.Unstru" - "cturedFilterTableRequest\032@.io.deephaven." - "proto.backplane.grpc.ExportedTableCreati" - "onResponse\"\000\022\177\n\004Sort\0223.io.deephaven.prot" - "o.backplane.grpc.SortTableRequest\032@.io.d" - "eephaven.proto.backplane.grpc.ExportedTa" - "bleCreationResponse\"\000\022\200\001\n\004Head\0224.io.deep" - "haven.proto.backplane.grpc.HeadOrTailReq" - "uest\032@.io.deephaven.proto.backplane.grpc" - ".ExportedTableCreationResponse\"\000\022\200\001\n\004Tai" - "l\0224.io.deephaven.proto.backplane.grpc.He" - "adOrTailRequest\032@.io.deephaven.proto.bac" + "tionResponse\"\000\022\206\001\n\nFetchTable\0224.io.deeph" + "aven.proto.backplane.grpc.FetchTableRequ" + "est\032@.io.deephaven.proto.backplane.grpc." + "ExportedTableCreationResponse\"\000\022\230\001\n\023Appl" + "yPreviewColumns\022=.io.deephaven.proto.bac" + "kplane.grpc.ApplyPreviewColumnsRequest\032@" + ".io.deephaven.proto.backplane.grpc.Expor" + "tedTableCreationResponse\"\000\022\206\001\n\nEmptyTabl" + "e\0224.io.deephaven.proto.backplane.grpc.Em" + "ptyTableRequest\032@.io.deephaven.proto.bac" "kplane.grpc.ExportedTableCreationRespons" - "e\"\000\022\204\001\n\006HeadBy\0226.io.deephaven.proto.back" - "plane.grpc.HeadOrTailByRequest\032@.io.deep" + "e\"\000\022\204\001\n\tTimeTable\0223.io.deephaven.proto.b" + "ackplane.grpc.TimeTableRequest\032@.io.deep" "haven.proto.backplane.grpc.ExportedTable" - "CreationResponse\"\000\022\204\001\n\006TailBy\0226.io.deeph" - "aven.proto.backplane.grpc.HeadOrTailByRe" - "quest\032@.io.deephaven.proto.backplane.grp" - "c.ExportedTableCreationResponse\"\000\022\200\001\n\007Un" - "group\0221.io.deephaven.proto.backplane.grp" - "c.UngroupRequest\032@.io.deephaven.proto.ba" - "ckplane.grpc.ExportedTableCreationRespon" - "se\"\000\022\210\001\n\013MergeTables\0225.io.deephaven.prot" - "o.backplane.grpc.MergeTablesRequest\032@.io" - ".deephaven.proto.backplane.grpc.Exported" - "TableCreationResponse\"\000\022\220\001\n\017CrossJoinTab" - "les\0229.io.deephaven.proto.backplane.grpc." - "CrossJoinTablesRequest\032@.io.deephaven.pr" + "CreationResponse\"\000\022\210\001\n\013DropColumns\0225.io." + "deephaven.proto.backplane.grpc.DropColum" + "nsRequest\032@.io.deephaven.proto.backplane" + ".grpc.ExportedTableCreationResponse\"\000\022\206\001" + "\n\006Update\0228.io.deephaven.proto.backplane." + "grpc.SelectOrUpdateRequest\032@.io.deephave" + "n.proto.backplane.grpc.ExportedTableCrea" + "tionResponse\"\000\022\212\001\n\nLazyUpdate\0228.io.deeph" + "aven.proto.backplane.grpc.SelectOrUpdate" + "Request\032@.io.deephaven.proto.backplane.g" + "rpc.ExportedTableCreationResponse\"\000\022\204\001\n\004" + "View\0228.io.deephaven.proto.backplane.grpc" + ".SelectOrUpdateRequest\032@.io.deephaven.pr" "oto.backplane.grpc.ExportedTableCreation" - "Response\"\000\022\224\001\n\021NaturalJoinTables\022;.io.de" - "ephaven.proto.backplane.grpc.NaturalJoin" - "TablesRequest\032@.io.deephaven.proto.backp" - "lane.grpc.ExportedTableCreationResponse\"" - "\000\022\220\001\n\017ExactJoinTables\0229.io.deephaven.pro" - "to.backplane.grpc.ExactJoinTablesRequest" - "\032@.io.deephaven.proto.backplane.grpc.Exp" - "ortedTableCreationResponse\"\000\022\216\001\n\016LeftJoi" - "nTables\0228.io.deephaven.proto.backplane.g" - "rpc.LeftJoinTablesRequest\032@.io.deephaven" - ".proto.backplane.grpc.ExportedTableCreat" - "ionResponse\"\000\022\221\001\n\016AsOfJoinTables\0228.io.de" - "ephaven.proto.backplane.grpc.AsOfJoinTab" - "lesRequest\032@.io.deephaven.proto.backplan" - "e.grpc.ExportedTableCreationResponse\"\003\210\002" - "\001\022\205\001\n\010AjTables\0225.io.deephaven.proto.back" - "plane.grpc.AjRajTablesRequest\032@.io.deeph" - "aven.proto.backplane.grpc.ExportedTableC" - "reationResponse\"\000\022\206\001\n\tRajTables\0225.io.dee" - "phaven.proto.backplane.grpc.AjRajTablesR" - "equest\032@.io.deephaven.proto.backplane.gr" - "pc.ExportedTableCreationResponse\"\000\022\220\001\n\017R" - "angeJoinTables\0229.io.deephaven.proto.back" - "plane.grpc.RangeJoinTablesRequest\032@.io.d" + "Response\"\000\022\212\001\n\nUpdateView\0228.io.deephaven" + ".proto.backplane.grpc.SelectOrUpdateRequ" + "est\032@.io.deephaven.proto.backplane.grpc." + "ExportedTableCreationResponse\"\000\022\206\001\n\006Sele" + "ct\0228.io.deephaven.proto.backplane.grpc.S" + "electOrUpdateRequest\032@.io.deephaven.prot" + "o.backplane.grpc.ExportedTableCreationRe" + "sponse\"\000\022\202\001\n\010UpdateBy\0222.io.deephaven.pro" + "to.backplane.grpc.UpdateByRequest\032@.io.d" "eephaven.proto.backplane.grpc.ExportedTa" - "bleCreationResponse\"\000\022\221\001\n\016ComboAggregate" - "\0228.io.deephaven.proto.backplane.grpc.Com" - "boAggregateRequest\032@.io.deephaven.proto." + "bleCreationResponse\"\000\022\216\001\n\016SelectDistinct" + "\0228.io.deephaven.proto.backplane.grpc.Sel" + "ectDistinctRequest\032@.io.deephaven.proto." "backplane.grpc.ExportedTableCreationResp" - "onse\"\003\210\002\001\022\212\001\n\014AggregateAll\0226.io.deephave" - "n.proto.backplane.grpc.AggregateAllReque" - "st\032@.io.deephaven.proto.backplane.grpc.E" - "xportedTableCreationResponse\"\000\022\204\001\n\tAggre" - "gate\0223.io.deephaven.proto.backplane.grpc" - ".AggregateRequest\032@.io.deephaven.proto.b" - "ackplane.grpc.ExportedTableCreationRespo" - "nse\"\000\022\207\001\n\010Snapshot\0227.io.deephaven.proto." - "backplane.grpc.SnapshotTableRequest\032@.io" - ".deephaven.proto.backplane.grpc.Exported" - "TableCreationResponse\"\000\022\217\001\n\014SnapshotWhen" - "\022;.io.deephaven.proto.backplane.grpc.Sna" - "pshotWhenTableRequest\032@.io.deephaven.pro" - "to.backplane.grpc.ExportedTableCreationR" - "esponse\"\000\022\200\001\n\007Flatten\0221.io.deephaven.pro" - "to.backplane.grpc.FlattenRequest\032@.io.de" + "onse\"\000\022\203\001\n\006Filter\0225.io.deephaven.proto.b" + "ackplane.grpc.FilterTableRequest\032@.io.de" "ephaven.proto.backplane.grpc.ExportedTab" - "leCreationResponse\"\000\022\226\001\n\022RunChartDownsam" - "ple\022<.io.deephaven.proto.backplane.grpc." - "RunChartDownsampleRequest\032@.io.deephaven" - ".proto.backplane.grpc.ExportedTableCreat" - "ionResponse\"\000\022\222\001\n\020CreateInputTable\022:.io." - "deephaven.proto.backplane.grpc.CreateInp" - "utTableRequest\032@.io.deephaven.proto.back" - "plane.grpc.ExportedTableCreationResponse" - "\"\000\022\200\001\n\007WhereIn\0221.io.deephaven.proto.back" - "plane.grpc.WhereInRequest\032@.io.deephaven" - ".proto.backplane.grpc.ExportedTableCreat" - "ionResponse\"\000\022\203\001\n\005Batch\0224.io.deephaven.p" - "roto.backplane.grpc.BatchTableRequest\032@." - "io.deephaven.proto.backplane.grpc.Export" - "edTableCreationResponse\"\0000\001\022\231\001\n\024Exported" - "TableUpdates\022>.io.deephaven.proto.backpl" - "ane.grpc.ExportedTableUpdatesRequest\032=.i" + "leCreationResponse\"\000\022\233\001\n\022UnstructuredFil" + "ter\022A.io.deephaven.proto.backplane.grpc." + "UnstructuredFilterTableRequest\032@.io.deep" + "haven.proto.backplane.grpc.ExportedTable" + "CreationResponse\"\000\022\177\n\004Sort\0223.io.deephave" + "n.proto.backplane.grpc.SortTableRequest\032" + "@.io.deephaven.proto.backplane.grpc.Expo" + "rtedTableCreationResponse\"\000\022\200\001\n\004Head\0224.i" + "o.deephaven.proto.backplane.grpc.HeadOrT" + "ailRequest\032@.io.deephaven.proto.backplan" + "e.grpc.ExportedTableCreationResponse\"\000\022\200" + "\001\n\004Tail\0224.io.deephaven.proto.backplane.g" + "rpc.HeadOrTailRequest\032@.io.deephaven.pro" + "to.backplane.grpc.ExportedTableCreationR" + "esponse\"\000\022\204\001\n\006HeadBy\0226.io.deephaven.prot" + "o.backplane.grpc.HeadOrTailByRequest\032@.i" "o.deephaven.proto.backplane.grpc.Exporte" - "dTableUpdateMessage\"\0000\001\022r\n\007SeekRow\0221.io." - "deephaven.proto.backplane.grpc.SeekRowRe" - "quest\0322.io.deephaven.proto.backplane.grp" - "c.SeekRowResponse\"\000\022\204\001\n\tMetaTable\0223.io.d" - "eephaven.proto.backplane.grpc.MetaTableR" + "dTableCreationResponse\"\000\022\204\001\n\006TailBy\0226.io" + ".deephaven.proto.backplane.grpc.HeadOrTa" + "ilByRequest\032@.io.deephaven.proto.backpla" + "ne.grpc.ExportedTableCreationResponse\"\000\022" + "\200\001\n\007Ungroup\0221.io.deephaven.proto.backpla" + "ne.grpc.UngroupRequest\032@.io.deephaven.pr" + "oto.backplane.grpc.ExportedTableCreation" + "Response\"\000\022\210\001\n\013MergeTables\0225.io.deephave" + "n.proto.backplane.grpc.MergeTablesReques" + "t\032@.io.deephaven.proto.backplane.grpc.Ex" + "portedTableCreationResponse\"\000\022\220\001\n\017CrossJ" + "oinTables\0229.io.deephaven.proto.backplane" + ".grpc.CrossJoinTablesRequest\032@.io.deepha" + "ven.proto.backplane.grpc.ExportedTableCr" + "eationResponse\"\000\022\224\001\n\021NaturalJoinTables\022;" + ".io.deephaven.proto.backplane.grpc.Natur" + "alJoinTablesRequest\032@.io.deephaven.proto" + ".backplane.grpc.ExportedTableCreationRes" + "ponse\"\000\022\220\001\n\017ExactJoinTables\0229.io.deephav" + "en.proto.backplane.grpc.ExactJoinTablesR" "equest\032@.io.deephaven.proto.backplane.gr" - "pc.ExportedTableCreationResponse\"\000BAH\001P\001" - "Z;github.com/deephaven/deephaven-core/go" - "/internal/proto/tableb\006proto3" + "pc.ExportedTableCreationResponse\"\000\022\216\001\n\016L" + "eftJoinTables\0228.io.deephaven.proto.backp" + "lane.grpc.LeftJoinTablesRequest\032@.io.dee" + "phaven.proto.backplane.grpc.ExportedTabl" + "eCreationResponse\"\000\022\221\001\n\016AsOfJoinTables\0228" + ".io.deephaven.proto.backplane.grpc.AsOfJ" + "oinTablesRequest\032@.io.deephaven.proto.ba" + "ckplane.grpc.ExportedTableCreationRespon" + "se\"\003\210\002\001\022\205\001\n\010AjTables\0225.io.deephaven.prot" + "o.backplane.grpc.AjRajTablesRequest\032@.io" + ".deephaven.proto.backplane.grpc.Exported" + "TableCreationResponse\"\000\022\206\001\n\tRajTables\0225." + "io.deephaven.proto.backplane.grpc.AjRajT" + "ablesRequest\032@.io.deephaven.proto.backpl" + "ane.grpc.ExportedTableCreationResponse\"\000" + "\022\220\001\n\017RangeJoinTables\0229.io.deephaven.prot" + "o.backplane.grpc.RangeJoinTablesRequest\032" + "@.io.deephaven.proto.backplane.grpc.Expo" + "rtedTableCreationResponse\"\000\022\221\001\n\016ComboAgg" + "regate\0228.io.deephaven.proto.backplane.gr" + "pc.ComboAggregateRequest\032@.io.deephaven." + "proto.backplane.grpc.ExportedTableCreati" + "onResponse\"\003\210\002\001\022\212\001\n\014AggregateAll\0226.io.de" + "ephaven.proto.backplane.grpc.AggregateAl" + "lRequest\032@.io.deephaven.proto.backplane." + "grpc.ExportedTableCreationResponse\"\000\022\204\001\n" + "\tAggregate\0223.io.deephaven.proto.backplan" + "e.grpc.AggregateRequest\032@.io.deephaven.p" + "roto.backplane.grpc.ExportedTableCreatio" + "nResponse\"\000\022\207\001\n\010Snapshot\0227.io.deephaven." + "proto.backplane.grpc.SnapshotTableReques" + "t\032@.io.deephaven.proto.backplane.grpc.Ex" + "portedTableCreationResponse\"\000\022\217\001\n\014Snapsh" + "otWhen\022;.io.deephaven.proto.backplane.gr" + "pc.SnapshotWhenTableRequest\032@.io.deephav" + "en.proto.backplane.grpc.ExportedTableCre" + "ationResponse\"\000\022\200\001\n\007Flatten\0221.io.deephav" + "en.proto.backplane.grpc.FlattenRequest\032@" + ".io.deephaven.proto.backplane.grpc.Expor" + "tedTableCreationResponse\"\000\022\226\001\n\022RunChartD" + "ownsample\022<.io.deephaven.proto.backplane" + ".grpc.RunChartDownsampleRequest\032@.io.dee" + "phaven.proto.backplane.grpc.ExportedTabl" + "eCreationResponse\"\000\022\222\001\n\020CreateInputTable" + "\022:.io.deephaven.proto.backplane.grpc.Cre" + "ateInputTableRequest\032@.io.deephaven.prot" + "o.backplane.grpc.ExportedTableCreationRe" + "sponse\"\000\022\200\001\n\007WhereIn\0221.io.deephaven.prot" + "o.backplane.grpc.WhereInRequest\032@.io.dee" + "phaven.proto.backplane.grpc.ExportedTabl" + "eCreationResponse\"\000\022\203\001\n\005Batch\0224.io.deeph" + "aven.proto.backplane.grpc.BatchTableRequ" + "est\032@.io.deephaven.proto.backplane.grpc." + "ExportedTableCreationResponse\"\0000\001\022\231\001\n\024Ex" + "portedTableUpdates\022>.io.deephaven.proto." + "backplane.grpc.ExportedTableUpdatesReque" + "st\032=.io.deephaven.proto.backplane.grpc.E" + "xportedTableUpdateMessage\"\0000\001\022r\n\007SeekRow" + "\0221.io.deephaven.proto.backplane.grpc.See" + "kRowRequest\0322.io.deephaven.proto.backpla" + "ne.grpc.SeekRowResponse\"\000\022\204\001\n\tMetaTable\022" + "3.io.deephaven.proto.backplane.grpc.Meta" + "TableRequest\032@.io.deephaven.proto.backpl" + "ane.grpc.ExportedTableCreationResponse\"\000" + "\022\231\001\n\027ComputeColumnStatistics\022:.io.deepha" + "ven.proto.backplane.grpc.ColumnStatistic" + "sRequest\032@.io.deephaven.proto.backplane." + "grpc.ExportedTableCreationResponse\"\000BAH\001" + "P\001Z;github.com/deephaven/deephaven-core/" + "go/internal/proto/tableb\006proto3" ; static const ::_pbi::DescriptorTable* const descriptor_table_deephaven_2fproto_2ftable_2eproto_deps[1] = { &::descriptor_table_deephaven_2fproto_2fticket_2eproto, }; static ::_pbi::once_flag descriptor_table_deephaven_2fproto_2ftable_2eproto_once; const ::_pbi::DescriptorTable descriptor_table_deephaven_2fproto_2ftable_2eproto = { - false, false, 33869, descriptor_table_protodef_deephaven_2fproto_2ftable_2eproto, + false, false, 34351, descriptor_table_protodef_deephaven_2fproto_2ftable_2eproto, "deephaven/proto/table.proto", - &descriptor_table_deephaven_2fproto_2ftable_2eproto_once, descriptor_table_deephaven_2fproto_2ftable_2eproto_deps, 1, 119, + &descriptor_table_deephaven_2fproto_2ftable_2eproto_once, descriptor_table_deephaven_2fproto_2ftable_2eproto_deps, 1, 120, schemas, file_default_instances, TableStruct_deephaven_2fproto_2ftable_2eproto::offsets, file_level_metadata_deephaven_2fproto_2ftable_2eproto, file_level_enum_descriptors_deephaven_2fproto_2ftable_2eproto, file_level_service_descriptors_deephaven_2fproto_2ftable_2eproto, @@ -34510,6 +34554,332 @@ ::PROTOBUF_NAMESPACE_ID::Metadata WhereInRequest::GetMetadata() const { // =================================================================== +class ColumnStatisticsRequest::_Internal { + public: + using HasBits = decltype(std::declval()._has_bits_); + static const ::io::deephaven::proto::backplane::grpc::Ticket& result_id(const ColumnStatisticsRequest* msg); + static const ::io::deephaven::proto::backplane::grpc::TableReference& source_id(const ColumnStatisticsRequest* msg); + static void set_has_unique_value_limit(HasBits* has_bits) { + (*has_bits)[0] |= 1u; + } +}; + +const ::io::deephaven::proto::backplane::grpc::Ticket& +ColumnStatisticsRequest::_Internal::result_id(const ColumnStatisticsRequest* msg) { + return *msg->result_id_; +} +const ::io::deephaven::proto::backplane::grpc::TableReference& +ColumnStatisticsRequest::_Internal::source_id(const ColumnStatisticsRequest* msg) { + return *msg->source_id_; +} +void ColumnStatisticsRequest::clear_result_id() { + if (GetArenaForAllocation() == nullptr && result_id_ != nullptr) { + delete result_id_; + } + result_id_ = nullptr; +} +ColumnStatisticsRequest::ColumnStatisticsRequest(::PROTOBUF_NAMESPACE_ID::Arena* arena, + bool is_message_owned) + : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { + SharedCtor(); + // @@protoc_insertion_point(arena_constructor:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) +} +ColumnStatisticsRequest::ColumnStatisticsRequest(const ColumnStatisticsRequest& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _has_bits_(from._has_bits_) { + _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); + column_name_.InitDefault(); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + column_name_.Set("", GetArenaForAllocation()); + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (!from._internal_column_name().empty()) { + column_name_.Set(from._internal_column_name(), + GetArenaForAllocation()); + } + if (from._internal_has_result_id()) { + result_id_ = new ::io::deephaven::proto::backplane::grpc::Ticket(*from.result_id_); + } else { + result_id_ = nullptr; + } + if (from._internal_has_source_id()) { + source_id_ = new ::io::deephaven::proto::backplane::grpc::TableReference(*from.source_id_); + } else { + source_id_ = nullptr; + } + unique_value_limit_ = from.unique_value_limit_; + // @@protoc_insertion_point(copy_constructor:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) +} + +inline void ColumnStatisticsRequest::SharedCtor() { +column_name_.InitDefault(); +#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + column_name_.Set("", GetArenaForAllocation()); +#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING +::memset(reinterpret_cast(this) + static_cast( + reinterpret_cast(&result_id_) - reinterpret_cast(this)), + 0, static_cast(reinterpret_cast(&unique_value_limit_) - + reinterpret_cast(&result_id_)) + sizeof(unique_value_limit_)); +} + +ColumnStatisticsRequest::~ColumnStatisticsRequest() { + // @@protoc_insertion_point(destructor:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) + if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { + (void)arena; + return; + } + SharedDtor(); +} + +inline void ColumnStatisticsRequest::SharedDtor() { + GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); + column_name_.Destroy(); + if (this != internal_default_instance()) delete result_id_; + if (this != internal_default_instance()) delete source_id_; +} + +void ColumnStatisticsRequest::SetCachedSize(int size) const { + _cached_size_.Set(size); +} + +void ColumnStatisticsRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) + uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + column_name_.ClearToEmpty(); + if (GetArenaForAllocation() == nullptr && result_id_ != nullptr) { + delete result_id_; + } + result_id_ = nullptr; + if (GetArenaForAllocation() == nullptr && source_id_ != nullptr) { + delete source_id_; + } + source_id_ = nullptr; + unique_value_limit_ = 0; + _has_bits_.Clear(); + _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); +} + +const char* ColumnStatisticsRequest::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + _Internal::HasBits has_bits{}; + while (!ctx->Done(&ptr)) { + uint32_t tag; + ptr = ::_pbi::ReadTag(ptr, &tag); + switch (tag >> 3) { + // .io.deephaven.proto.backplane.grpc.Ticket result_id = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 10)) { + ptr = ctx->ParseMessage(_internal_mutable_result_id(), ptr); + CHK_(ptr); + } else + goto handle_unusual; + continue; + // .io.deephaven.proto.backplane.grpc.TableReference source_id = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 18)) { + ptr = ctx->ParseMessage(_internal_mutable_source_id(), ptr); + CHK_(ptr); + } else + goto handle_unusual; + continue; + // string column_name = 3; + case 3: + if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 26)) { + auto str = _internal_mutable_column_name(); + ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx); + CHK_(ptr); + CHK_(::_pbi::VerifyUTF8(str, "io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.column_name")); + } else + goto handle_unusual; + continue; + // optional int32 unique_value_limit = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 32)) { + _Internal::set_has_unique_value_limit(&has_bits); + unique_value_limit_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); + CHK_(ptr); + } else + goto handle_unusual; + continue; + default: + goto handle_unusual; + } // switch + handle_unusual: + if ((tag == 0) || ((tag & 7) == 4)) { + CHK_(ptr); + ctx->SetLastTag(tag); + goto message_done; + } + ptr = UnknownFieldParse( + tag, + _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), + ptr, ctx); + CHK_(ptr != nullptr); + } // while +message_done: + _has_bits_.Or(has_bits); + return ptr; +failure: + ptr = nullptr; + goto message_done; +#undef CHK_ +} + +uint8_t* ColumnStatisticsRequest::_InternalSerialize( + uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) + uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + // .io.deephaven.proto.backplane.grpc.Ticket result_id = 1; + if (this->_internal_has_result_id()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage(1, _Internal::result_id(this), + _Internal::result_id(this).GetCachedSize(), target, stream); + } + + // .io.deephaven.proto.backplane.grpc.TableReference source_id = 2; + if (this->_internal_has_source_id()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage(2, _Internal::source_id(this), + _Internal::source_id(this).GetCachedSize(), target, stream); + } + + // string column_name = 3; + if (!this->_internal_column_name().empty()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_column_name().data(), static_cast(this->_internal_column_name().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.column_name"); + target = stream->WriteStringMaybeAliased( + 3, this->_internal_column_name(), target); + } + + // optional int32 unique_value_limit = 4; + if (_internal_has_unique_value_limit()) { + target = stream->EnsureSpace(target); + target = ::_pbi::WireFormatLite::WriteInt32ToArray(4, this->_internal_unique_value_limit(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) + return target; +} + +size_t ColumnStatisticsRequest::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) + size_t total_size = 0; + + uint32_t cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string column_name = 3; + if (!this->_internal_column_name().empty()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_column_name()); + } + + // .io.deephaven.proto.backplane.grpc.Ticket result_id = 1; + if (this->_internal_has_result_id()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *result_id_); + } + + // .io.deephaven.proto.backplane.grpc.TableReference source_id = 2; + if (this->_internal_has_source_id()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *source_id_); + } + + // optional int32 unique_value_limit = 4; + cached_has_bits = _has_bits_[0]; + if (cached_has_bits & 0x00000001u) { + total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(this->_internal_unique_value_limit()); + } + + return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_); +} + +const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ColumnStatisticsRequest::_class_data_ = { + ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck, + ColumnStatisticsRequest::MergeImpl +}; +const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ColumnStatisticsRequest::GetClassData() const { return &_class_data_; } + +void ColumnStatisticsRequest::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, + const ::PROTOBUF_NAMESPACE_ID::Message& from) { + static_cast(to)->MergeFrom( + static_cast(from)); +} + + +void ColumnStatisticsRequest::MergeFrom(const ColumnStatisticsRequest& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) + GOOGLE_DCHECK_NE(&from, this); + uint32_t cached_has_bits = 0; + (void) cached_has_bits; + + if (!from._internal_column_name().empty()) { + _internal_set_column_name(from._internal_column_name()); + } + if (from._internal_has_result_id()) { + _internal_mutable_result_id()->::io::deephaven::proto::backplane::grpc::Ticket::MergeFrom(from._internal_result_id()); + } + if (from._internal_has_source_id()) { + _internal_mutable_source_id()->::io::deephaven::proto::backplane::grpc::TableReference::MergeFrom(from._internal_source_id()); + } + if (from._internal_has_unique_value_limit()) { + _internal_set_unique_value_limit(from._internal_unique_value_limit()); + } + _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); +} + +void ColumnStatisticsRequest::CopyFrom(const ColumnStatisticsRequest& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ColumnStatisticsRequest::IsInitialized() const { + return true; +} + +void ColumnStatisticsRequest::InternalSwap(ColumnStatisticsRequest* other) { + using std::swap; + auto* lhs_arena = GetArenaForAllocation(); + auto* rhs_arena = other->GetArenaForAllocation(); + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(_has_bits_[0], other->_has_bits_[0]); + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::InternalSwap( + &column_name_, lhs_arena, + &other->column_name_, rhs_arena + ); + ::PROTOBUF_NAMESPACE_ID::internal::memswap< + PROTOBUF_FIELD_OFFSET(ColumnStatisticsRequest, unique_value_limit_) + + sizeof(ColumnStatisticsRequest::unique_value_limit_) + - PROTOBUF_FIELD_OFFSET(ColumnStatisticsRequest, result_id_)>( + reinterpret_cast(&result_id_), + reinterpret_cast(&other->result_id_)); +} + +::PROTOBUF_NAMESPACE_ID::Metadata ColumnStatisticsRequest::GetMetadata() const { + return ::_pbi::AssignDescriptors( + &descriptor_table_deephaven_2fproto_2ftable_2eproto_getter, &descriptor_table_deephaven_2fproto_2ftable_2eproto_once, + file_level_metadata_deephaven_2fproto_2ftable_2eproto[117]); +} + +// =================================================================== + class BatchTableRequest_Operation::_Internal { public: static const ::io::deephaven::proto::backplane::grpc::EmptyTableRequest& empty_table(const BatchTableRequest_Operation* msg); @@ -34551,6 +34921,7 @@ class BatchTableRequest_Operation::_Internal { static const ::io::deephaven::proto::backplane::grpc::RangeJoinTablesRequest& range_join(const BatchTableRequest_Operation* msg); static const ::io::deephaven::proto::backplane::grpc::AjRajTablesRequest& aj(const BatchTableRequest_Operation* msg); static const ::io::deephaven::proto::backplane::grpc::AjRajTablesRequest& raj(const BatchTableRequest_Operation* msg); + static const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& column_statistics(const BatchTableRequest_Operation* msg); }; const ::io::deephaven::proto::backplane::grpc::EmptyTableRequest& @@ -34709,6 +35080,10 @@ const ::io::deephaven::proto::backplane::grpc::AjRajTablesRequest& BatchTableRequest_Operation::_Internal::raj(const BatchTableRequest_Operation* msg) { return *msg->op_.raj_; } +const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& +BatchTableRequest_Operation::_Internal::column_statistics(const BatchTableRequest_Operation* msg) { + return *msg->op_.column_statistics_; +} void BatchTableRequest_Operation::set_allocated_empty_table(::io::deephaven::proto::backplane::grpc::EmptyTableRequest* empty_table) { ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); clear_op(); @@ -35294,6 +35669,21 @@ void BatchTableRequest_Operation::set_allocated_raj(::io::deephaven::proto::back } // @@protoc_insertion_point(field_set_allocated:io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation.raj) } +void BatchTableRequest_Operation::set_allocated_column_statistics(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* column_statistics) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); + clear_op(); + if (column_statistics) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = + ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(column_statistics); + if (message_arena != submessage_arena) { + column_statistics = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, column_statistics, submessage_arena); + } + set_has_column_statistics(); + op_.column_statistics_ = column_statistics; + } + // @@protoc_insertion_point(field_set_allocated:io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation.column_statistics) +} BatchTableRequest_Operation::BatchTableRequest_Operation(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned) : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { @@ -35461,6 +35851,10 @@ BatchTableRequest_Operation::BatchTableRequest_Operation(const BatchTableRequest _internal_mutable_raj()->::io::deephaven::proto::backplane::grpc::AjRajTablesRequest::MergeFrom(from._internal_raj()); break; } + case kColumnStatistics: { + _internal_mutable_column_statistics()->::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest::MergeFrom(from._internal_column_statistics()); + break; + } case OP_NOT_SET: { break; } @@ -35729,6 +36123,12 @@ void BatchTableRequest_Operation::clear_op() { } break; } + case kColumnStatistics: { + if (GetArenaForAllocation() == nullptr) { + delete op_.column_statistics_; + } + break; + } case OP_NOT_SET: { break; } @@ -36065,6 +36465,14 @@ const char* BatchTableRequest_Operation::_InternalParse(const char* ptr, ::_pbi: } else goto handle_unusual; continue; + // .io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest column_statistics = 42; + case 42: + if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 82)) { + ptr = ctx->ParseMessage(_internal_mutable_column_statistics(), ptr); + CHK_(ptr); + } else + goto handle_unusual; + continue; default: goto handle_unusual; } // switch @@ -36367,6 +36775,13 @@ uint8_t* BatchTableRequest_Operation::_InternalSerialize( _Internal::raj(this).GetCachedSize(), target, stream); } + // .io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest column_statistics = 42; + if (_internal_has_column_statistics()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessage(42, _Internal::column_statistics(this), + _Internal::column_statistics(this).GetCachedSize(), target, stream); + } + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); @@ -36657,6 +37072,13 @@ size_t BatchTableRequest_Operation::ByteSizeLong() const { *op_.raj_); break; } + // .io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest column_statistics = 42; + case kColumnStatistics: { + total_size += 2 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *op_.column_statistics_); + break; + } case OP_NOT_SET: { break; } @@ -36840,6 +37262,10 @@ void BatchTableRequest_Operation::MergeFrom(const BatchTableRequest_Operation& f _internal_mutable_raj()->::io::deephaven::proto::backplane::grpc::AjRajTablesRequest::MergeFrom(from._internal_raj()); break; } + case kColumnStatistics: { + _internal_mutable_column_statistics()->::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest::MergeFrom(from._internal_column_statistics()); + break; + } case OP_NOT_SET: { break; } @@ -36868,7 +37294,7 @@ void BatchTableRequest_Operation::InternalSwap(BatchTableRequest_Operation* othe ::PROTOBUF_NAMESPACE_ID::Metadata BatchTableRequest_Operation::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_deephaven_2fproto_2ftable_2eproto_getter, &descriptor_table_deephaven_2fproto_2ftable_2eproto_once, - file_level_metadata_deephaven_2fproto_2ftable_2eproto[117]); + file_level_metadata_deephaven_2fproto_2ftable_2eproto[118]); } // =================================================================== @@ -37046,7 +37472,7 @@ void BatchTableRequest::InternalSwap(BatchTableRequest* other) { ::PROTOBUF_NAMESPACE_ID::Metadata BatchTableRequest::GetMetadata() const { return ::_pbi::AssignDescriptors( &descriptor_table_deephaven_2fproto_2ftable_2eproto_getter, &descriptor_table_deephaven_2fproto_2ftable_2eproto_once, - file_level_metadata_deephaven_2fproto_2ftable_2eproto[118]); + file_level_metadata_deephaven_2fproto_2ftable_2eproto[119]); } // @@protoc_insertion_point(namespace_scope) @@ -37524,6 +37950,10 @@ template<> PROTOBUF_NOINLINE ::io::deephaven::proto::backplane::grpc::WhereInReq Arena::CreateMaybeMessage< ::io::deephaven::proto::backplane::grpc::WhereInRequest >(Arena* arena) { return Arena::CreateMessageInternal< ::io::deephaven::proto::backplane::grpc::WhereInRequest >(arena); } +template<> PROTOBUF_NOINLINE ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* +Arena::CreateMaybeMessage< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest >(Arena* arena) { + return Arena::CreateMessageInternal< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest >(arena); +} template<> PROTOBUF_NOINLINE ::io::deephaven::proto::backplane::grpc::BatchTableRequest_Operation* Arena::CreateMaybeMessage< ::io::deephaven::proto::backplane::grpc::BatchTableRequest_Operation >(Arena* arena) { return Arena::CreateMessageInternal< ::io::deephaven::proto::backplane::grpc::BatchTableRequest_Operation >(arena); diff --git a/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.pb.h b/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.pb.h index c89856a9a53..7528e511312 100644 --- a/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.pb.h +++ b/cpp-client/deephaven/dhclient/proto/deephaven/proto/table.pb.h @@ -163,6 +163,9 @@ extern BatchTableRequestDefaultTypeInternal _BatchTableRequest_default_instance_ class BatchTableRequest_Operation; struct BatchTableRequest_OperationDefaultTypeInternal; extern BatchTableRequest_OperationDefaultTypeInternal _BatchTableRequest_Operation_default_instance_; +class ColumnStatisticsRequest; +struct ColumnStatisticsRequestDefaultTypeInternal; +extern ColumnStatisticsRequestDefaultTypeInternal _ColumnStatisticsRequest_default_instance_; class ComboAggregateRequest; struct ComboAggregateRequestDefaultTypeInternal; extern ComboAggregateRequestDefaultTypeInternal _ComboAggregateRequest_default_instance_; @@ -452,6 +455,7 @@ template<> ::io::deephaven::proto::backplane::grpc::ApplyPreviewColumnsRequest* template<> ::io::deephaven::proto::backplane::grpc::AsOfJoinTablesRequest* Arena::CreateMaybeMessage<::io::deephaven::proto::backplane::grpc::AsOfJoinTablesRequest>(Arena*); template<> ::io::deephaven::proto::backplane::grpc::BatchTableRequest* Arena::CreateMaybeMessage<::io::deephaven::proto::backplane::grpc::BatchTableRequest>(Arena*); template<> ::io::deephaven::proto::backplane::grpc::BatchTableRequest_Operation* Arena::CreateMaybeMessage<::io::deephaven::proto::backplane::grpc::BatchTableRequest_Operation>(Arena*); +template<> ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* Arena::CreateMaybeMessage<::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest>(Arena*); template<> ::io::deephaven::proto::backplane::grpc::ComboAggregateRequest* Arena::CreateMaybeMessage<::io::deephaven::proto::backplane::grpc::ComboAggregateRequest>(Arena*); template<> ::io::deephaven::proto::backplane::grpc::ComboAggregateRequest_Aggregate* Arena::CreateMaybeMessage<::io::deephaven::proto::backplane::grpc::ComboAggregateRequest_Aggregate>(Arena*); template<> ::io::deephaven::proto::backplane::grpc::CompareCondition* Arena::CreateMaybeMessage<::io::deephaven::proto::backplane::grpc::CompareCondition>(Arena*); @@ -23108,6 +23112,210 @@ class WhereInRequest final : }; // ------------------------------------------------------------------- +class ColumnStatisticsRequest final : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) */ { + public: + inline ColumnStatisticsRequest() : ColumnStatisticsRequest(nullptr) {} + ~ColumnStatisticsRequest() override; + explicit PROTOBUF_CONSTEXPR ColumnStatisticsRequest(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); + + ColumnStatisticsRequest(const ColumnStatisticsRequest& from); + ColumnStatisticsRequest(ColumnStatisticsRequest&& from) noexcept + : ColumnStatisticsRequest() { + *this = ::std::move(from); + } + + inline ColumnStatisticsRequest& operator=(const ColumnStatisticsRequest& from) { + CopyFrom(from); + return *this; + } + inline ColumnStatisticsRequest& operator=(ColumnStatisticsRequest&& from) noexcept { + if (this == &from) return *this; + if (GetOwningArena() == from.GetOwningArena() + #ifdef PROTOBUF_FORCE_COPY_IN_MOVE + && GetOwningArena() != nullptr + #endif // !PROTOBUF_FORCE_COPY_IN_MOVE + ) { + InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return default_instance().GetMetadata().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return default_instance().GetMetadata().reflection; + } + static const ColumnStatisticsRequest& default_instance() { + return *internal_default_instance(); + } + static inline const ColumnStatisticsRequest* internal_default_instance() { + return reinterpret_cast( + &_ColumnStatisticsRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = + 117; + + friend void swap(ColumnStatisticsRequest& a, ColumnStatisticsRequest& b) { + a.Swap(&b); + } + inline void Swap(ColumnStatisticsRequest* other) { + if (other == this) return; + #ifdef PROTOBUF_FORCE_COPY_IN_SWAP + if (GetOwningArena() != nullptr && + GetOwningArena() == other->GetOwningArena()) { + #else // PROTOBUF_FORCE_COPY_IN_SWAP + if (GetOwningArena() == other->GetOwningArena()) { + #endif // !PROTOBUF_FORCE_COPY_IN_SWAP + InternalSwap(other); + } else { + ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); + } + } + void UnsafeArenaSwap(ColumnStatisticsRequest* other) { + if (other == this) return; + GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); + InternalSwap(other); + } + + // implements Message ---------------------------------------------- + + ColumnStatisticsRequest* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { + return CreateMaybeMessage(arena); + } + using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; + void CopyFrom(const ColumnStatisticsRequest& from); + using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; + void MergeFrom(const ColumnStatisticsRequest& from); + private: + static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from); + public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + uint8_t* _InternalSerialize( + uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(ColumnStatisticsRequest* other); + + private: + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest"; + } + protected: + explicit ColumnStatisticsRequest(::PROTOBUF_NAMESPACE_ID::Arena* arena, + bool is_message_owned = false); + public: + + static const ClassData _class_data_; + const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + enum : int { + kColumnNameFieldNumber = 3, + kResultIdFieldNumber = 1, + kSourceIdFieldNumber = 2, + kUniqueValueLimitFieldNumber = 4, + }; + // string column_name = 3; + void clear_column_name(); + const std::string& column_name() const; + template + void set_column_name(ArgT0&& arg0, ArgT... args); + std::string* mutable_column_name(); + PROTOBUF_NODISCARD std::string* release_column_name(); + void set_allocated_column_name(std::string* column_name); + private: + const std::string& _internal_column_name() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_column_name(const std::string& value); + std::string* _internal_mutable_column_name(); + public: + + // .io.deephaven.proto.backplane.grpc.Ticket result_id = 1; + bool has_result_id() const; + private: + bool _internal_has_result_id() const; + public: + void clear_result_id(); + const ::io::deephaven::proto::backplane::grpc::Ticket& result_id() const; + PROTOBUF_NODISCARD ::io::deephaven::proto::backplane::grpc::Ticket* release_result_id(); + ::io::deephaven::proto::backplane::grpc::Ticket* mutable_result_id(); + void set_allocated_result_id(::io::deephaven::proto::backplane::grpc::Ticket* result_id); + private: + const ::io::deephaven::proto::backplane::grpc::Ticket& _internal_result_id() const; + ::io::deephaven::proto::backplane::grpc::Ticket* _internal_mutable_result_id(); + public: + void unsafe_arena_set_allocated_result_id( + ::io::deephaven::proto::backplane::grpc::Ticket* result_id); + ::io::deephaven::proto::backplane::grpc::Ticket* unsafe_arena_release_result_id(); + + // .io.deephaven.proto.backplane.grpc.TableReference source_id = 2; + bool has_source_id() const; + private: + bool _internal_has_source_id() const; + public: + void clear_source_id(); + const ::io::deephaven::proto::backplane::grpc::TableReference& source_id() const; + PROTOBUF_NODISCARD ::io::deephaven::proto::backplane::grpc::TableReference* release_source_id(); + ::io::deephaven::proto::backplane::grpc::TableReference* mutable_source_id(); + void set_allocated_source_id(::io::deephaven::proto::backplane::grpc::TableReference* source_id); + private: + const ::io::deephaven::proto::backplane::grpc::TableReference& _internal_source_id() const; + ::io::deephaven::proto::backplane::grpc::TableReference* _internal_mutable_source_id(); + public: + void unsafe_arena_set_allocated_source_id( + ::io::deephaven::proto::backplane::grpc::TableReference* source_id); + ::io::deephaven::proto::backplane::grpc::TableReference* unsafe_arena_release_source_id(); + + // optional int32 unique_value_limit = 4; + bool has_unique_value_limit() const; + private: + bool _internal_has_unique_value_limit() const; + public: + void clear_unique_value_limit(); + int32_t unique_value_limit() const; + void set_unique_value_limit(int32_t value); + private: + int32_t _internal_unique_value_limit() const; + void _internal_set_unique_value_limit(int32_t value); + public: + + // @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest) + private: + class _Internal; + + template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; + typedef void InternalArenaConstructable_; + typedef void DestructorSkippable_; + ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr column_name_; + ::io::deephaven::proto::backplane::grpc::Ticket* result_id_; + ::io::deephaven::proto::backplane::grpc::TableReference* source_id_; + int32_t unique_value_limit_; + friend struct ::TableStruct_deephaven_2fproto_2ftable_2eproto; +}; +// ------------------------------------------------------------------- + class BatchTableRequest_Operation final : public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation) */ { public: @@ -23191,6 +23399,7 @@ class BatchTableRequest_Operation final : kRangeJoin = 39, kAj = 40, kRaj = 41, + kColumnStatistics = 42, OP_NOT_SET = 0, }; @@ -23199,7 +23408,7 @@ class BatchTableRequest_Operation final : &_BatchTableRequest_Operation_default_instance_); } static constexpr int kIndexInFileMessages = - 117; + 118; friend void swap(BatchTableRequest_Operation& a, BatchTableRequest_Operation& b) { a.Swap(&b); @@ -23309,6 +23518,7 @@ class BatchTableRequest_Operation final : kRangeJoinFieldNumber = 39, kAjFieldNumber = 40, kRajFieldNumber = 41, + kColumnStatisticsFieldNumber = 42, }; // .io.deephaven.proto.backplane.grpc.EmptyTableRequest empty_table = 1; bool has_empty_table() const; @@ -24012,6 +24222,24 @@ class BatchTableRequest_Operation final : ::io::deephaven::proto::backplane::grpc::AjRajTablesRequest* raj); ::io::deephaven::proto::backplane::grpc::AjRajTablesRequest* unsafe_arena_release_raj(); + // .io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest column_statistics = 42; + bool has_column_statistics() const; + private: + bool _internal_has_column_statistics() const; + public: + void clear_column_statistics(); + const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& column_statistics() const; + PROTOBUF_NODISCARD ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* release_column_statistics(); + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* mutable_column_statistics(); + void set_allocated_column_statistics(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* column_statistics); + private: + const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& _internal_column_statistics() const; + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* _internal_mutable_column_statistics(); + public: + void unsafe_arena_set_allocated_column_statistics( + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* column_statistics); + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* unsafe_arena_release_column_statistics(); + void clear_op(); OpCase op_case() const; // @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation) @@ -24056,6 +24284,7 @@ class BatchTableRequest_Operation final : void set_has_range_join(); void set_has_aj(); void set_has_raj(); + void set_has_column_statistics(); inline bool has_op() const; inline void clear_has_op(); @@ -24105,6 +24334,7 @@ class BatchTableRequest_Operation final : ::io::deephaven::proto::backplane::grpc::RangeJoinTablesRequest* range_join_; ::io::deephaven::proto::backplane::grpc::AjRajTablesRequest* aj_; ::io::deephaven::proto::backplane::grpc::AjRajTablesRequest* raj_; + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* column_statistics_; } op_; mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; uint32_t _oneof_case_[1]; @@ -24161,7 +24391,7 @@ class BatchTableRequest final : &_BatchTableRequest_default_instance_); } static constexpr int kIndexInFileMessages = - 118; + 119; friend void swap(BatchTableRequest& a, BatchTableRequest& b) { a.Swap(&b); @@ -47015,6 +47245,263 @@ WhereInRequest::mutable_columns_to_match() { // ------------------------------------------------------------------- +// ColumnStatisticsRequest + +// .io.deephaven.proto.backplane.grpc.Ticket result_id = 1; +inline bool ColumnStatisticsRequest::_internal_has_result_id() const { + return this != internal_default_instance() && result_id_ != nullptr; +} +inline bool ColumnStatisticsRequest::has_result_id() const { + return _internal_has_result_id(); +} +inline const ::io::deephaven::proto::backplane::grpc::Ticket& ColumnStatisticsRequest::_internal_result_id() const { + const ::io::deephaven::proto::backplane::grpc::Ticket* p = result_id_; + return p != nullptr ? *p : reinterpret_cast( + ::io::deephaven::proto::backplane::grpc::_Ticket_default_instance_); +} +inline const ::io::deephaven::proto::backplane::grpc::Ticket& ColumnStatisticsRequest::result_id() const { + // @@protoc_insertion_point(field_get:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.result_id) + return _internal_result_id(); +} +inline void ColumnStatisticsRequest::unsafe_arena_set_allocated_result_id( + ::io::deephaven::proto::backplane::grpc::Ticket* result_id) { + if (GetArenaForAllocation() == nullptr) { + delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(result_id_); + } + result_id_ = result_id; + if (result_id) { + + } else { + + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.result_id) +} +inline ::io::deephaven::proto::backplane::grpc::Ticket* ColumnStatisticsRequest::release_result_id() { + + ::io::deephaven::proto::backplane::grpc::Ticket* temp = result_id_; + result_id_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); + temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); + if (GetArenaForAllocation() == nullptr) { delete old; } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArenaForAllocation() != nullptr) { + temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return temp; +} +inline ::io::deephaven::proto::backplane::grpc::Ticket* ColumnStatisticsRequest::unsafe_arena_release_result_id() { + // @@protoc_insertion_point(field_release:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.result_id) + + ::io::deephaven::proto::backplane::grpc::Ticket* temp = result_id_; + result_id_ = nullptr; + return temp; +} +inline ::io::deephaven::proto::backplane::grpc::Ticket* ColumnStatisticsRequest::_internal_mutable_result_id() { + + if (result_id_ == nullptr) { + auto* p = CreateMaybeMessage<::io::deephaven::proto::backplane::grpc::Ticket>(GetArenaForAllocation()); + result_id_ = p; + } + return result_id_; +} +inline ::io::deephaven::proto::backplane::grpc::Ticket* ColumnStatisticsRequest::mutable_result_id() { + ::io::deephaven::proto::backplane::grpc::Ticket* _msg = _internal_mutable_result_id(); + // @@protoc_insertion_point(field_mutable:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.result_id) + return _msg; +} +inline void ColumnStatisticsRequest::set_allocated_result_id(::io::deephaven::proto::backplane::grpc::Ticket* result_id) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); + if (message_arena == nullptr) { + delete reinterpret_cast< ::PROTOBUF_NAMESPACE_ID::MessageLite*>(result_id_); + } + if (result_id) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = + ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena( + reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(result_id)); + if (message_arena != submessage_arena) { + result_id = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, result_id, submessage_arena); + } + + } else { + + } + result_id_ = result_id; + // @@protoc_insertion_point(field_set_allocated:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.result_id) +} + +// .io.deephaven.proto.backplane.grpc.TableReference source_id = 2; +inline bool ColumnStatisticsRequest::_internal_has_source_id() const { + return this != internal_default_instance() && source_id_ != nullptr; +} +inline bool ColumnStatisticsRequest::has_source_id() const { + return _internal_has_source_id(); +} +inline void ColumnStatisticsRequest::clear_source_id() { + if (GetArenaForAllocation() == nullptr && source_id_ != nullptr) { + delete source_id_; + } + source_id_ = nullptr; +} +inline const ::io::deephaven::proto::backplane::grpc::TableReference& ColumnStatisticsRequest::_internal_source_id() const { + const ::io::deephaven::proto::backplane::grpc::TableReference* p = source_id_; + return p != nullptr ? *p : reinterpret_cast( + ::io::deephaven::proto::backplane::grpc::_TableReference_default_instance_); +} +inline const ::io::deephaven::proto::backplane::grpc::TableReference& ColumnStatisticsRequest::source_id() const { + // @@protoc_insertion_point(field_get:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.source_id) + return _internal_source_id(); +} +inline void ColumnStatisticsRequest::unsafe_arena_set_allocated_source_id( + ::io::deephaven::proto::backplane::grpc::TableReference* source_id) { + if (GetArenaForAllocation() == nullptr) { + delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(source_id_); + } + source_id_ = source_id; + if (source_id) { + + } else { + + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.source_id) +} +inline ::io::deephaven::proto::backplane::grpc::TableReference* ColumnStatisticsRequest::release_source_id() { + + ::io::deephaven::proto::backplane::grpc::TableReference* temp = source_id_; + source_id_ = nullptr; +#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE + auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); + temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); + if (GetArenaForAllocation() == nullptr) { delete old; } +#else // PROTOBUF_FORCE_COPY_IN_RELEASE + if (GetArenaForAllocation() != nullptr) { + temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); + } +#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE + return temp; +} +inline ::io::deephaven::proto::backplane::grpc::TableReference* ColumnStatisticsRequest::unsafe_arena_release_source_id() { + // @@protoc_insertion_point(field_release:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.source_id) + + ::io::deephaven::proto::backplane::grpc::TableReference* temp = source_id_; + source_id_ = nullptr; + return temp; +} +inline ::io::deephaven::proto::backplane::grpc::TableReference* ColumnStatisticsRequest::_internal_mutable_source_id() { + + if (source_id_ == nullptr) { + auto* p = CreateMaybeMessage<::io::deephaven::proto::backplane::grpc::TableReference>(GetArenaForAllocation()); + source_id_ = p; + } + return source_id_; +} +inline ::io::deephaven::proto::backplane::grpc::TableReference* ColumnStatisticsRequest::mutable_source_id() { + ::io::deephaven::proto::backplane::grpc::TableReference* _msg = _internal_mutable_source_id(); + // @@protoc_insertion_point(field_mutable:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.source_id) + return _msg; +} +inline void ColumnStatisticsRequest::set_allocated_source_id(::io::deephaven::proto::backplane::grpc::TableReference* source_id) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); + if (message_arena == nullptr) { + delete source_id_; + } + if (source_id) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = + ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(source_id); + if (message_arena != submessage_arena) { + source_id = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, source_id, submessage_arena); + } + + } else { + + } + source_id_ = source_id; + // @@protoc_insertion_point(field_set_allocated:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.source_id) +} + +// string column_name = 3; +inline void ColumnStatisticsRequest::clear_column_name() { + column_name_.ClearToEmpty(); +} +inline const std::string& ColumnStatisticsRequest::column_name() const { + // @@protoc_insertion_point(field_get:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.column_name) + return _internal_column_name(); +} +template +inline PROTOBUF_ALWAYS_INLINE +void ColumnStatisticsRequest::set_column_name(ArgT0&& arg0, ArgT... args) { + + column_name_.Set(static_cast(arg0), args..., GetArenaForAllocation()); + // @@protoc_insertion_point(field_set:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.column_name) +} +inline std::string* ColumnStatisticsRequest::mutable_column_name() { + std::string* _s = _internal_mutable_column_name(); + // @@protoc_insertion_point(field_mutable:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.column_name) + return _s; +} +inline const std::string& ColumnStatisticsRequest::_internal_column_name() const { + return column_name_.Get(); +} +inline void ColumnStatisticsRequest::_internal_set_column_name(const std::string& value) { + + column_name_.Set(value, GetArenaForAllocation()); +} +inline std::string* ColumnStatisticsRequest::_internal_mutable_column_name() { + + return column_name_.Mutable(GetArenaForAllocation()); +} +inline std::string* ColumnStatisticsRequest::release_column_name() { + // @@protoc_insertion_point(field_release:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.column_name) + return column_name_.Release(); +} +inline void ColumnStatisticsRequest::set_allocated_column_name(std::string* column_name) { + if (column_name != nullptr) { + + } else { + + } + column_name_.SetAllocated(column_name, GetArenaForAllocation()); +#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (column_name_.IsDefault()) { + column_name_.Set("", GetArenaForAllocation()); + } +#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.column_name) +} + +// optional int32 unique_value_limit = 4; +inline bool ColumnStatisticsRequest::_internal_has_unique_value_limit() const { + bool value = (_has_bits_[0] & 0x00000001u) != 0; + return value; +} +inline bool ColumnStatisticsRequest::has_unique_value_limit() const { + return _internal_has_unique_value_limit(); +} +inline void ColumnStatisticsRequest::clear_unique_value_limit() { + unique_value_limit_ = 0; + _has_bits_[0] &= ~0x00000001u; +} +inline int32_t ColumnStatisticsRequest::_internal_unique_value_limit() const { + return unique_value_limit_; +} +inline int32_t ColumnStatisticsRequest::unique_value_limit() const { + // @@protoc_insertion_point(field_get:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.unique_value_limit) + return _internal_unique_value_limit(); +} +inline void ColumnStatisticsRequest::_internal_set_unique_value_limit(int32_t value) { + _has_bits_[0] |= 0x00000001u; + unique_value_limit_ = value; +} +inline void ColumnStatisticsRequest::set_unique_value_limit(int32_t value) { + _internal_set_unique_value_limit(value); + // @@protoc_insertion_point(field_set:io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest.unique_value_limit) +} + +// ------------------------------------------------------------------- + // BatchTableRequest_Operation // .io.deephaven.proto.backplane.grpc.EmptyTableRequest empty_table = 1; @@ -49903,6 +50390,80 @@ inline ::io::deephaven::proto::backplane::grpc::AjRajTablesRequest* BatchTableRe return _msg; } +// .io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest column_statistics = 42; +inline bool BatchTableRequest_Operation::_internal_has_column_statistics() const { + return op_case() == kColumnStatistics; +} +inline bool BatchTableRequest_Operation::has_column_statistics() const { + return _internal_has_column_statistics(); +} +inline void BatchTableRequest_Operation::set_has_column_statistics() { + _oneof_case_[0] = kColumnStatistics; +} +inline void BatchTableRequest_Operation::clear_column_statistics() { + if (_internal_has_column_statistics()) { + if (GetArenaForAllocation() == nullptr) { + delete op_.column_statistics_; + } + clear_has_op(); + } +} +inline ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* BatchTableRequest_Operation::release_column_statistics() { + // @@protoc_insertion_point(field_release:io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation.column_statistics) + if (_internal_has_column_statistics()) { + clear_has_op(); + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* temp = op_.column_statistics_; + if (GetArenaForAllocation() != nullptr) { + temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); + } + op_.column_statistics_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& BatchTableRequest_Operation::_internal_column_statistics() const { + return _internal_has_column_statistics() + ? *op_.column_statistics_ + : reinterpret_cast< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest&>(::io::deephaven::proto::backplane::grpc::_ColumnStatisticsRequest_default_instance_); +} +inline const ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest& BatchTableRequest_Operation::column_statistics() const { + // @@protoc_insertion_point(field_get:io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation.column_statistics) + return _internal_column_statistics(); +} +inline ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* BatchTableRequest_Operation::unsafe_arena_release_column_statistics() { + // @@protoc_insertion_point(field_unsafe_arena_release:io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation.column_statistics) + if (_internal_has_column_statistics()) { + clear_has_op(); + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* temp = op_.column_statistics_; + op_.column_statistics_ = nullptr; + return temp; + } else { + return nullptr; + } +} +inline void BatchTableRequest_Operation::unsafe_arena_set_allocated_column_statistics(::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* column_statistics) { + clear_op(); + if (column_statistics) { + set_has_column_statistics(); + op_.column_statistics_ = column_statistics; + } + // @@protoc_insertion_point(field_unsafe_arena_set_allocated:io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation.column_statistics) +} +inline ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* BatchTableRequest_Operation::_internal_mutable_column_statistics() { + if (!_internal_has_column_statistics()) { + clear_op(); + set_has_column_statistics(); + op_.column_statistics_ = CreateMaybeMessage< ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest >(GetArenaForAllocation()); + } + return op_.column_statistics_; +} +inline ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* BatchTableRequest_Operation::mutable_column_statistics() { + ::io::deephaven::proto::backplane::grpc::ColumnStatisticsRequest* _msg = _internal_mutable_column_statistics(); + // @@protoc_insertion_point(field_mutable:io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation.column_statistics) + return _msg; +} + inline bool BatchTableRequest_Operation::has_op() const { return op_case() != OP_NOT_SET; } @@ -50195,6 +50756,8 @@ BatchTableRequest::ops() const { // ------------------------------------------------------------------- +// ------------------------------------------------------------------- + // @@protoc_insertion_point(namespace_scope) diff --git a/engine/test-utils/src/main/java/io/deephaven/engine/testutil/generator/StringGenerator.java b/engine/test-utils/src/main/java/io/deephaven/engine/testutil/generator/StringGenerator.java index e254fb9cbec..c20bffa5fc2 100644 --- a/engine/test-utils/src/main/java/io/deephaven/engine/testutil/generator/StringGenerator.java +++ b/engine/test-utils/src/main/java/io/deephaven/engine/testutil/generator/StringGenerator.java @@ -1,20 +1,33 @@ package io.deephaven.engine.testutil.generator; +import io.deephaven.util.QueryConstants; + import java.util.Random; public class StringGenerator extends AbstractGenerator { - int bound; + private final int bound; + private final double nullFrac; public StringGenerator() { - bound = 0; + this(0); } public StringGenerator(int bound) { + this(bound, 0); + } + + public StringGenerator(int bound, double nullFrac) { this.bound = bound; + this.nullFrac = nullFrac; } @Override public String nextValue(Random random) { + if (nullFrac > 0) { + if (random.nextDouble() < nullFrac) { + return null; + } + } final long value = bound > 0 ? random.nextInt(bound) : random.nextLong(); return Long.toString(value, 'z' - 'a' + 10); } diff --git a/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/util/OperationHelper.java b/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/util/OperationHelper.java index 9ddb1b6a984..4084229b66b 100644 --- a/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/util/OperationHelper.java +++ b/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/util/OperationHelper.java @@ -98,6 +98,8 @@ public static Stream getSourceIds(Operation op) { return Stream.of(op.getWhereIn().getLeftId(), op.getWhereIn().getRightId()); case RANGE_JOIN: return Stream.of(op.getRangeJoin().getLeftId(), op.getRangeJoin().getRightId()); + case COLUMN_STATISTICS: + return Stream.of(op.getColumnStatistics().getSourceId()); case OP_NOT_SET: throw new IllegalStateException("Operation id not set"); default: diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/table.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/table.proto index 4f44921fd0b..441732cda9c 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/table.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/table.proto @@ -254,6 +254,12 @@ service TableService { */ rpc MetaTable(MetaTableRequest) returns (ExportedTableCreationResponse) {} + /** + * Returns a new table representing statistics about a single column of the provided table. This + * result table will be static - use Aggregation() instead for updating results. Presently, the + * primary use case for this is the Deephaven Web UI. + */ + rpc ComputeColumnStatistics(ColumnStatisticsRequest) returns (ExportedTableCreationResponse) {} } message TableReference { @@ -1231,6 +1237,17 @@ message WhereInRequest { repeated string columns_to_match = 5; } +message ColumnStatisticsRequest { + Ticket result_id = 1; + TableReference source_id = 2; + + // The name of the column in the source table to read when generating statistics. + string column_name = 3; + // For non-numeric, non-date types, specify the max number of unique values to return, sorted by popularity. + // Leave unset to use server default, specify zero to skip. + optional int32 unique_value_limit = 4; +} + message BatchTableRequest { repeated Operation ops = 1; @@ -1278,6 +1295,7 @@ message BatchTableRequest { RangeJoinTablesRequest range_join = 39; AjRajTablesRequest aj = 40; AjRajTablesRequest raj = 41; + ColumnStatisticsRequest column_statistics = 42; } } } diff --git a/py/client/pydeephaven/proto/table_pb2.py b/py/client/pydeephaven/proto/table_pb2.py index cd6ff18a074..11a6db4c8ba 100644 --- a/py/client/pydeephaven/proto/table_pb2.py +++ b/py/client/pydeephaven/proto/table_pb2.py @@ -14,7 +14,7 @@ from pydeephaven.proto import ticket_pb2 as deephaven_dot_proto_dot_ticket__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1b\x64\x65\x65phaven/proto/table.proto\x12!io.deephaven.proto.backplane.grpc\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"l\n\x0eTableReference\x12;\n\x06ticket\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.TicketH\x00\x12\x16\n\x0c\x62\x61tch_offset\x18\x02 \x01(\x11H\x00\x42\x05\n\x03ref\"\xc6\x01\n\x1d\x45xportedTableCreationResponse\x12\x44\n\tresult_id\x18\x01 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x12\n\nerror_info\x18\x03 \x01(\t\x12\x15\n\rschema_header\x18\x04 \x01(\x0c\x12\x11\n\tis_static\x18\x05 \x01(\x08\x12\x10\n\x04size\x18\x06 \x01(\x12\x42\x02\x30\x01\"\x97\x01\n\x11\x46\x65tchTableRequest\x12\x44\n\tsource_id\x18\x01 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12<\n\tresult_id\x18\x02 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"\xa0\x01\n\x1a\x41pplyPreviewColumnsRequest\x12\x44\n\tsource_id\x18\x01 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12<\n\tresult_id\x18\x02 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"\x1d\n\x1b\x45xportedTableUpdatesRequest\"\x8c\x01\n\x1a\x45xportedTableUpdateMessage\x12<\n\texport_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x10\n\x04size\x18\x02 \x01(\x12\x42\x02\x30\x01\x12\x1e\n\x16update_failure_message\x18\x03 \x01(\t\"c\n\x11\x45mptyTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x10\n\x04size\x18\x02 \x01(\x12\x42\x02\x30\x01\"\xef\x01\n\x10TimeTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x1e\n\x10start_time_nanos\x18\x02 \x01(\x12\x42\x02\x30\x01H\x00\x12\x1b\n\x11start_time_string\x18\x05 \x01(\tH\x00\x12\x1a\n\x0cperiod_nanos\x18\x03 \x01(\x12\x42\x02\x30\x01H\x01\x12\x17\n\rperiod_string\x18\x06 \x01(\tH\x01\x12\x13\n\x0b\x62link_table\x18\x04 \x01(\x08\x42\x0c\n\nstart_timeB\x08\n\x06period\"\xb1\x01\n\x15SelectOrUpdateRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x0c\x63olumn_specs\x18\x03 \x03(\t\"\x8c\x02\n\x0bMathContext\x12\x11\n\tprecision\x18\x01 \x01(\x11\x12R\n\rrounding_mode\x18\x02 \x01(\x0e\x32;.io.deephaven.proto.backplane.grpc.MathContext.RoundingMode\"\x95\x01\n\x0cRoundingMode\x12\x1f\n\x1bROUNDING_MODE_NOT_SPECIFIED\x10\x00\x12\x06\n\x02UP\x10\x01\x12\x08\n\x04\x44OWN\x10\x02\x12\x0b\n\x07\x43\x45ILING\x10\x03\x12\t\n\x05\x46LOOR\x10\x04\x12\x0b\n\x07HALF_UP\x10\x05\x12\r\n\tHALF_DOWN\x10\x06\x12\r\n\tHALF_EVEN\x10\x07\x12\x0f\n\x0bUNNECESSARY\x10\x08\"\xdb\x02\n\x13UpdateByWindowScale\x12[\n\x05ticks\x18\x01 \x01(\x0b\x32J.io.deephaven.proto.backplane.grpc.UpdateByWindowScale.UpdateByWindowTicksH\x00\x12Y\n\x04time\x18\x02 \x01(\x0b\x32I.io.deephaven.proto.backplane.grpc.UpdateByWindowScale.UpdateByWindowTimeH\x00\x1a$\n\x13UpdateByWindowTicks\x12\r\n\x05ticks\x18\x01 \x01(\x01\x1a^\n\x12UpdateByWindowTime\x12\x0e\n\x06\x63olumn\x18\x01 \x01(\t\x12\x13\n\x05nanos\x18\x02 \x01(\x12\x42\x02\x30\x01H\x00\x12\x19\n\x0f\x64uration_string\x18\x03 \x01(\tH\x00\x42\x08\n\x06windowB\x06\n\x04type\"\xe1\x03\n\x11UpdateByEmOptions\x12I\n\ron_null_value\x18\x01 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12H\n\x0con_nan_value\x18\x02 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12H\n\x0con_null_time\x18\x03 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12R\n\x16on_negative_delta_time\x18\x04 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12N\n\x12on_zero_delta_time\x18\x05 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12I\n\x11\x62ig_value_context\x18\x06 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.MathContext\"f\n\x14UpdateByDeltaOptions\x12N\n\rnull_behavior\x18\x01 \x01(\x0e\x32\x37.io.deephaven.proto.backplane.grpc.UpdateByNullBehavior\"\x99\x34\n\x0fUpdateByRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12S\n\x07options\x18\x03 \x01(\x0b\x32\x42.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOptions\x12X\n\noperations\x18\x04 \x03(\x0b\x32\x44.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation\x12\x18\n\x10group_by_columns\x18\x05 \x03(\t\x1a\xc3\x03\n\x0fUpdateByOptions\x12\x1c\n\x0fuse_redirection\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x1b\n\x0e\x63hunk_capacity\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12.\n!max_static_sparse_memory_overhead\x18\x03 \x01(\x01H\x02\x88\x01\x01\x12$\n\x17initial_hash_table_size\x18\x04 \x01(\x05H\x03\x88\x01\x01\x12 \n\x13maximum_load_factor\x18\x05 \x01(\x01H\x04\x88\x01\x01\x12\x1f\n\x12target_load_factor\x18\x06 \x01(\x01H\x05\x88\x01\x01\x12\x44\n\x0cmath_context\x18\x07 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.MathContextB\x12\n\x10_use_redirectionB\x11\n\x0f_chunk_capacityB$\n\"_max_static_sparse_memory_overheadB\x1a\n\x18_initial_hash_table_sizeB\x16\n\x14_maximum_load_factorB\x15\n\x13_target_load_factor\x1a\xf2-\n\x11UpdateByOperation\x12\x65\n\x06\x63olumn\x18\x01 \x01(\x0b\x32S.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumnH\x00\x1a\xed,\n\x0eUpdateByColumn\x12n\n\x04spec\x18\x01 \x01(\x0b\x32`.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec\x12\x13\n\x0bmatch_pairs\x18\x02 \x03(\t\x1a\xd5+\n\x0cUpdateBySpec\x12\x85\x01\n\x03sum\x18\x01 \x01(\x0b\x32v.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByCumulativeSumH\x00\x12\x85\x01\n\x03min\x18\x02 \x01(\x0b\x32v.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByCumulativeMinH\x00\x12\x85\x01\n\x03max\x18\x03 \x01(\x0b\x32v.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByCumulativeMaxH\x00\x12\x8d\x01\n\x07product\x18\x04 \x01(\x0b\x32z.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByCumulativeProductH\x00\x12}\n\x04\x66ill\x18\x05 \x01(\x0b\x32m.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByFillH\x00\x12{\n\x03\x65ma\x18\x06 \x01(\x0b\x32l.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmaH\x00\x12\x8a\x01\n\x0brolling_sum\x18\x07 \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingSumH\x00\x12\x8e\x01\n\rrolling_group\x18\x08 \x01(\x0b\x32u.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingGroupH\x00\x12\x8a\x01\n\x0brolling_avg\x18\t \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingAvgH\x00\x12\x8a\x01\n\x0brolling_min\x18\n \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingMinH\x00\x12\x8a\x01\n\x0brolling_max\x18\x0b \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingMaxH\x00\x12\x92\x01\n\x0frolling_product\x18\x0c \x01(\x0b\x32w.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingProductH\x00\x12\x7f\n\x05\x64\x65lta\x18\r \x01(\x0b\x32n.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByDeltaH\x00\x12{\n\x03\x65ms\x18\x0e \x01(\x0b\x32l.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmsH\x00\x12\x80\x01\n\x06\x65m_min\x18\x0f \x01(\x0b\x32n.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmMinH\x00\x12\x80\x01\n\x06\x65m_max\x18\x10 \x01(\x0b\x32n.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmMaxH\x00\x12\x80\x01\n\x06\x65m_std\x18\x11 \x01(\x0b\x32n.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmStdH\x00\x12\x8e\x01\n\rrolling_count\x18\x12 \x01(\x0b\x32u.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingCountH\x00\x12\x8a\x01\n\x0brolling_std\x18\x13 \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingStdH\x00\x12\x8c\x01\n\x0crolling_wavg\x18\x14 \x01(\x0b\x32t.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingWAvgH\x00\x1a\x17\n\x15UpdateByCumulativeSum\x1a\x17\n\x15UpdateByCumulativeMin\x1a\x17\n\x15UpdateByCumulativeMax\x1a\x1b\n\x19UpdateByCumulativeProduct\x1a\x0e\n\x0cUpdateByFill\x1a\xa2\x01\n\x0bUpdateByEma\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xa2\x01\n\x0bUpdateByEms\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xa4\x01\n\rUpdateByEmMin\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xa4\x01\n\rUpdateByEmMax\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xa4\x01\n\rUpdateByEmStd\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1aY\n\rUpdateByDelta\x12H\n\x07options\x18\x01 \x01(\x0b\x32\x37.io.deephaven.proto.backplane.grpc.UpdateByDeltaOptions\x1a\xc0\x01\n\x12UpdateByRollingSum\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc2\x01\n\x14UpdateByRollingGroup\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc0\x01\n\x12UpdateByRollingAvg\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc0\x01\n\x12UpdateByRollingMin\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc0\x01\n\x12UpdateByRollingMax\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc4\x01\n\x16UpdateByRollingProduct\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc2\x01\n\x14UpdateByRollingCount\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc0\x01\n\x12UpdateByRollingStd\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xd8\x01\n\x13UpdateByRollingWAvg\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12\x15\n\rweight_column\x18\x03 \x01(\tB\x06\n\x04typeB\x06\n\x04type\"\xb1\x01\n\x15SelectDistinctRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x0c\x63olumn_names\x18\x03 \x03(\t\"\xae\x01\n\x12\x44ropColumnsRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x0c\x63olumn_names\x18\x03 \x03(\t\"\xb5\x01\n\x1eUnstructuredFilterTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x0f\n\x07\x66ilters\x18\x03 \x03(\t\"\xad\x01\n\x11HeadOrTailRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x08num_rows\x18\x03 \x01(\x12\x42\x02\x30\x01\"\xce\x01\n\x13HeadOrTailByRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x08num_rows\x18\x03 \x01(\x12\x42\x02\x30\x01\x12\x1d\n\x15group_by_column_specs\x18\x04 \x03(\t\"\xc3\x01\n\x0eUngroupRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x11\n\tnull_fill\x18\x03 \x01(\x08\x12\x1a\n\x12\x63olumns_to_ungroup\x18\x04 \x03(\t\"\xad\x01\n\x12MergeTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x45\n\nsource_ids\x18\x02 \x03(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x12\n\nkey_column\x18\x03 \x01(\t\"\x9a\x01\n\x14SnapshotTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\"\xb1\x02\n\x18SnapshotWhenTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07\x62\x61se_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x45\n\ntrigger_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x0f\n\x07initial\x18\x04 \x01(\x08\x12\x13\n\x0bincremental\x18\x05 \x01(\x08\x12\x0f\n\x07history\x18\x06 \x01(\x08\x12\x15\n\rstamp_columns\x18\x07 \x03(\t\"\xa7\x02\n\x16\x43rossJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\x12\x14\n\x0creserve_bits\x18\x06 \x01(\x05\"\x93\x02\n\x18NaturalJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\"\x91\x02\n\x16\x45xactJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\"\x90\x02\n\x15LeftJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\"\xd1\x03\n\x15\x41sOfJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\x12\\\n\x10\x61s_of_match_rule\x18\x07 \x01(\x0e\x32\x42.io.deephaven.proto.backplane.grpc.AsOfJoinTablesRequest.MatchRule\"]\n\tMatchRule\x12\x13\n\x0fLESS_THAN_EQUAL\x10\x00\x12\r\n\tLESS_THAN\x10\x01\x12\x16\n\x12GREATER_THAN_EQUAL\x10\x02\x12\x10\n\x0cGREATER_THAN\x10\x03\x1a\x02\x18\x01:\x02\x18\x01\"\xa6\x02\n\x12\x41jRajTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x1b\n\x13\x65xact_match_columns\x18\x04 \x03(\t\x12\x14\n\x0c\x61s_of_column\x18\x05 \x01(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x06 \x03(\t\"\xcb\x06\n\x16RangeJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x1b\n\x13\x65xact_match_columns\x18\x04 \x03(\t\x12\x19\n\x11left_start_column\x18\x05 \x01(\t\x12\x62\n\x10range_start_rule\x18\x06 \x01(\x0e\x32H.io.deephaven.proto.backplane.grpc.RangeJoinTablesRequest.RangeStartRule\x12\x1a\n\x12right_range_column\x18\x07 \x01(\t\x12^\n\x0erange_end_rule\x18\x08 \x01(\x0e\x32\x46.io.deephaven.proto.backplane.grpc.RangeJoinTablesRequest.RangeEndRule\x12\x17\n\x0fleft_end_column\x18\t \x01(\t\x12\x44\n\x0c\x61ggregations\x18\n \x03(\x0b\x32..io.deephaven.proto.backplane.grpc.Aggregation\"v\n\x0eRangeStartRule\x12\x15\n\x11START_UNSPECIFIED\x10\x00\x12\r\n\tLESS_THAN\x10\x01\x12\x16\n\x12LESS_THAN_OR_EQUAL\x10\x02\x12&\n\"LESS_THAN_OR_EQUAL_ALLOW_PRECEDING\x10\x03\"{\n\x0cRangeEndRule\x12\x13\n\x0f\x45ND_UNSPECIFIED\x10\x00\x12\x10\n\x0cGREATER_THAN\x10\x01\x12\x19\n\x15GREATER_THAN_OR_EQUAL\x10\x02\x12)\n%GREATER_THAN_OR_EQUAL_ALLOW_FOLLOWING\x10\x03\"\xfe\x04\n\x15\x43omboAggregateRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12V\n\naggregates\x18\x03 \x03(\x0b\x32\x42.io.deephaven.proto.backplane.grpc.ComboAggregateRequest.Aggregate\x12\x18\n\x10group_by_columns\x18\x04 \x03(\t\x12\x13\n\x0b\x66orce_combo\x18\x05 \x01(\x08\x1a\xad\x01\n\tAggregate\x12N\n\x04type\x18\x01 \x01(\x0e\x32@.io.deephaven.proto.backplane.grpc.ComboAggregateRequest.AggType\x12\x13\n\x0bmatch_pairs\x18\x02 \x03(\t\x12\x13\n\x0b\x63olumn_name\x18\x03 \x01(\t\x12\x12\n\npercentile\x18\x04 \x01(\x01\x12\x12\n\navg_median\x18\x05 \x01(\x08\"\xa5\x01\n\x07\x41ggType\x12\x07\n\x03SUM\x10\x00\x12\x0b\n\x07\x41\x42S_SUM\x10\x01\x12\t\n\x05GROUP\x10\x02\x12\x07\n\x03\x41VG\x10\x03\x12\t\n\x05\x43OUNT\x10\x04\x12\t\n\x05\x46IRST\x10\x05\x12\x08\n\x04LAST\x10\x06\x12\x07\n\x03MIN\x10\x07\x12\x07\n\x03MAX\x10\x08\x12\n\n\x06MEDIAN\x10\t\x12\x0e\n\nPERCENTILE\x10\n\x12\x07\n\x03STD\x10\x0b\x12\x07\n\x03VAR\x10\x0c\x12\x10\n\x0cWEIGHTED_AVG\x10\r:\x02\x18\x01\"\xed\x01\n\x13\x41ggregateAllRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x38\n\x04spec\x18\x03 \x01(\x0b\x32*.io.deephaven.proto.backplane.grpc.AggSpec\x12\x18\n\x10group_by_columns\x18\x04 \x03(\t\"\xd7\x17\n\x07\x41ggSpec\x12K\n\x07\x61\x62s_sum\x18\x01 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecAbsSumH\x00\x12i\n\x16\x61pproximate_percentile\x18\x02 \x01(\x0b\x32G.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecApproximatePercentileH\x00\x12\x44\n\x03\x61vg\x18\x03 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecAvgH\x00\x12Y\n\x0e\x63ount_distinct\x18\x04 \x01(\x0b\x32?.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecCountDistinctH\x00\x12N\n\x08\x64istinct\x18\x05 \x01(\x0b\x32:.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecDistinctH\x00\x12H\n\x05\x66irst\x18\x06 \x01(\x0b\x32\x37.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecFirstH\x00\x12L\n\x07\x66ormula\x18\x07 \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecFormulaH\x00\x12J\n\x06\x66reeze\x18\x08 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecFreezeH\x00\x12H\n\x05group\x18\t \x01(\x0b\x32\x37.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecGroupH\x00\x12\x46\n\x04last\x18\n \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecLastH\x00\x12\x44\n\x03max\x18\x0b \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecMaxH\x00\x12J\n\x06median\x18\x0c \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecMedianH\x00\x12\x44\n\x03min\x18\r \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecMinH\x00\x12R\n\npercentile\x18\x0e \x01(\x0b\x32<.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecPercentileH\x00\x12P\n\x0csorted_first\x18\x0f \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecSortedH\x00\x12O\n\x0bsorted_last\x18\x10 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecSortedH\x00\x12\x44\n\x03std\x18\x11 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecStdH\x00\x12\x44\n\x03sum\x18\x12 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecSumH\x00\x12M\n\x08t_digest\x18\x13 \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecTDigestH\x00\x12J\n\x06unique\x18\x14 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecUniqueH\x00\x12R\n\x0cweighted_avg\x18\x15 \x01(\x0b\x32:.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecWeightedH\x00\x12R\n\x0cweighted_sum\x18\x16 \x01(\x0b\x32:.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecWeightedH\x00\x12\x44\n\x03var\x18\x17 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecVarH\x00\x1a\\\n\x1c\x41ggSpecApproximatePercentile\x12\x12\n\npercentile\x18\x01 \x01(\x01\x12\x18\n\x0b\x63ompression\x18\x02 \x01(\x01H\x00\x88\x01\x01\x42\x0e\n\x0c_compression\x1a+\n\x14\x41ggSpecCountDistinct\x12\x13\n\x0b\x63ount_nulls\x18\x01 \x01(\x08\x1a(\n\x0f\x41ggSpecDistinct\x12\x15\n\rinclude_nulls\x18\x01 \x01(\x08\x1a\x36\n\x0e\x41ggSpecFormula\x12\x0f\n\x07\x66ormula\x18\x01 \x01(\t\x12\x13\n\x0bparam_token\x18\x02 \x01(\t\x1a/\n\rAggSpecMedian\x12\x1e\n\x16\x61verage_evenly_divided\x18\x01 \x01(\x08\x1aG\n\x11\x41ggSpecPercentile\x12\x12\n\npercentile\x18\x01 \x01(\x01\x12\x1e\n\x16\x61verage_evenly_divided\x18\x02 \x01(\x08\x1a`\n\rAggSpecSorted\x12O\n\x07\x63olumns\x18\x01 \x03(\x0b\x32>.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecSortedColumn\x1a*\n\x13\x41ggSpecSortedColumn\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x1a:\n\x0e\x41ggSpecTDigest\x12\x18\n\x0b\x63ompression\x18\x01 \x01(\x01H\x00\x88\x01\x01\x42\x0e\n\x0c_compression\x1a\x88\x01\n\rAggSpecUnique\x12\x15\n\rinclude_nulls\x18\x01 \x01(\x08\x12`\n\x13non_unique_sentinel\x18\x02 \x01(\x0b\x32\x43.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecNonUniqueSentinel\x1a\xb5\x02\n\x18\x41ggSpecNonUniqueSentinel\x12\x42\n\nnull_value\x18\x01 \x01(\x0e\x32,.io.deephaven.proto.backplane.grpc.NullValueH\x00\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x13\n\tint_value\x18\x03 \x01(\x11H\x00\x12\x18\n\nlong_value\x18\x04 \x01(\x12\x42\x02\x30\x01H\x00\x12\x15\n\x0b\x66loat_value\x18\x05 \x01(\x02H\x00\x12\x16\n\x0c\x64ouble_value\x18\x06 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x07 \x01(\x08H\x00\x12\x14\n\nbyte_value\x18\x08 \x01(\x11H\x00\x12\x15\n\x0bshort_value\x18\t \x01(\x11H\x00\x12\x14\n\nchar_value\x18\n \x01(\x11H\x00\x42\x06\n\x04type\x1a(\n\x0f\x41ggSpecWeighted\x12\x15\n\rweight_column\x18\x01 \x01(\t\x1a\x0f\n\rAggSpecAbsSum\x1a\x0c\n\nAggSpecAvg\x1a\x0e\n\x0c\x41ggSpecFirst\x1a\x0f\n\rAggSpecFreeze\x1a\x0e\n\x0c\x41ggSpecGroup\x1a\r\n\x0b\x41ggSpecLast\x1a\x0c\n\nAggSpecMax\x1a\x0c\n\nAggSpecMin\x1a\x0c\n\nAggSpecStd\x1a\x0c\n\nAggSpecSum\x1a\x0c\n\nAggSpecVarB\x06\n\x04type\"\xdc\x02\n\x10\x41ggregateRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12L\n\x11initial_groups_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x16\n\x0epreserve_empty\x18\x04 \x01(\x08\x12\x44\n\x0c\x61ggregations\x18\x05 \x03(\x0b\x32..io.deephaven.proto.backplane.grpc.Aggregation\x12\x18\n\x10group_by_columns\x18\x06 \x03(\t\"\xd3\x05\n\x0b\x41ggregation\x12T\n\x07\x63olumns\x18\x01 \x01(\x0b\x32\x41.io.deephaven.proto.backplane.grpc.Aggregation.AggregationColumnsH\x00\x12P\n\x05\x63ount\x18\x02 \x01(\x0b\x32?.io.deephaven.proto.backplane.grpc.Aggregation.AggregationCountH\x00\x12Y\n\rfirst_row_key\x18\x03 \x01(\x0b\x32@.io.deephaven.proto.backplane.grpc.Aggregation.AggregationRowKeyH\x00\x12X\n\x0clast_row_key\x18\x04 \x01(\x0b\x32@.io.deephaven.proto.backplane.grpc.Aggregation.AggregationRowKeyH\x00\x12X\n\tpartition\x18\x05 \x01(\x0b\x32\x43.io.deephaven.proto.backplane.grpc.Aggregation.AggregationPartitionH\x00\x1a\x63\n\x12\x41ggregationColumns\x12\x38\n\x04spec\x18\x01 \x01(\x0b\x32*.io.deephaven.proto.backplane.grpc.AggSpec\x12\x13\n\x0bmatch_pairs\x18\x02 \x03(\t\x1a\'\n\x10\x41ggregationCount\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x1a(\n\x11\x41ggregationRowKey\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x1aM\n\x14\x41ggregationPartition\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x12 \n\x18include_group_by_columns\x18\x02 \x01(\x08\x42\x06\n\x04type\"\xe1\x01\n\x0eSortDescriptor\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x12\x13\n\x0bis_absolute\x18\x02 \x01(\x08\x12R\n\tdirection\x18\x03 \x01(\x0e\x32?.io.deephaven.proto.backplane.grpc.SortDescriptor.SortDirection\"Q\n\rSortDirection\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x17\n\nDESCENDING\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x12\r\n\tASCENDING\x10\x01\x12\x0b\n\x07REVERSE\x10\x02\"\xd8\x01\n\x10SortTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12@\n\x05sorts\x18\x03 \x03(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.SortDescriptor\"\xd7\x01\n\x12\x46ilterTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12=\n\x07\x66ilters\x18\x03 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.Condition\"\xf9\x01\n\x0eSeekRowRequest\x12<\n\tsource_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x18\n\x0cstarting_row\x18\x02 \x01(\x12\x42\x02\x30\x01\x12\x13\n\x0b\x63olumn_name\x18\x03 \x01(\t\x12>\n\nseek_value\x18\x04 \x01(\x0b\x32*.io.deephaven.proto.backplane.grpc.Literal\x12\x13\n\x0binsensitive\x18\x05 \x01(\x08\x12\x10\n\x08\x63ontains\x18\x06 \x01(\x08\x12\x13\n\x0bis_backward\x18\x07 \x01(\x08\")\n\x0fSeekRowResponse\x12\x16\n\nresult_row\x18\x01 \x01(\x12\x42\x02\x30\x01\" \n\tReference\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\"\x91\x01\n\x07Literal\x12\x16\n\x0cstring_value\x18\x01 \x01(\tH\x00\x12\x16\n\x0c\x64ouble_value\x18\x02 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x18\n\nlong_value\x18\x04 \x01(\x12\x42\x02\x30\x01H\x00\x12\x1d\n\x0fnano_time_value\x18\x05 \x01(\x12\x42\x02\x30\x01H\x00\x42\x07\n\x05value\"\x91\x01\n\x05Value\x12\x41\n\treference\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.ReferenceH\x00\x12=\n\x07literal\x18\x02 \x01(\x0b\x32*.io.deephaven.proto.backplane.grpc.LiteralH\x00\x42\x06\n\x04\x64\x61ta\"\xbc\x05\n\tCondition\x12>\n\x03\x61nd\x18\x01 \x01(\x0b\x32/.io.deephaven.proto.backplane.grpc.AndConditionH\x00\x12<\n\x02or\x18\x02 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.OrConditionH\x00\x12>\n\x03not\x18\x03 \x01(\x0b\x32/.io.deephaven.proto.backplane.grpc.NotConditionH\x00\x12\x46\n\x07\x63ompare\x18\x04 \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.CompareConditionH\x00\x12<\n\x02in\x18\x05 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.InConditionH\x00\x12\x44\n\x06invoke\x18\x06 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.grpc.InvokeConditionH\x00\x12\x45\n\x07is_null\x18\x07 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.grpc.IsNullConditionH\x00\x12\x46\n\x07matches\x18\x08 \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.MatchesConditionH\x00\x12H\n\x08\x63ontains\x18\t \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.ContainsConditionH\x00\x12\x44\n\x06search\x18\n \x01(\x0b\x32\x32.io.deephaven.proto.backplane.grpc.SearchConditionH\x00\x42\x06\n\x04\x64\x61ta\"M\n\x0c\x41ndCondition\x12=\n\x07\x66ilters\x18\x01 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.Condition\"L\n\x0bOrCondition\x12=\n\x07\x66ilters\x18\x01 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.Condition\"L\n\x0cNotCondition\x12<\n\x06\x66ilter\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.Condition\"\xac\x03\n\x10\x43ompareCondition\x12W\n\toperation\x18\x01 \x01(\x0e\x32\x44.io.deephaven.proto.backplane.grpc.CompareCondition.CompareOperation\x12L\n\x10\x63\x61se_sensitivity\x18\x02 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.CaseSensitivity\x12\x35\n\x03lhs\x18\x03 \x01(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\x12\x35\n\x03rhs\x18\x04 \x01(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\"\x82\x01\n\x10\x43ompareOperation\x12\r\n\tLESS_THAN\x10\x00\x12\x16\n\x12LESS_THAN_OR_EQUAL\x10\x01\x12\x10\n\x0cGREATER_THAN\x10\x02\x12\x19\n\x15GREATER_THAN_OR_EQUAL\x10\x03\x12\n\n\x06\x45QUALS\x10\x04\x12\x0e\n\nNOT_EQUALS\x10\x05\"\x95\x02\n\x0bInCondition\x12\x38\n\x06target\x18\x01 \x01(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\x12<\n\ncandidates\x18\x02 \x03(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\x12L\n\x10\x63\x61se_sensitivity\x18\x03 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.CaseSensitivity\x12@\n\nmatch_type\x18\x04 \x01(\x0e\x32,.io.deephaven.proto.backplane.grpc.MatchType\"\x98\x01\n\x0fInvokeCondition\x12\x0e\n\x06method\x18\x01 \x01(\t\x12\x38\n\x06target\x18\x02 \x01(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\x12;\n\targuments\x18\x03 \x03(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\"R\n\x0fIsNullCondition\x12?\n\treference\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.Reference\"\xf2\x01\n\x10MatchesCondition\x12?\n\treference\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.Reference\x12\r\n\x05regex\x18\x02 \x01(\t\x12L\n\x10\x63\x61se_sensitivity\x18\x03 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.CaseSensitivity\x12@\n\nmatch_type\x18\x04 \x01(\x0e\x32,.io.deephaven.proto.backplane.grpc.MatchType\"\xfb\x01\n\x11\x43ontainsCondition\x12?\n\treference\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.Reference\x12\x15\n\rsearch_string\x18\x02 \x01(\t\x12L\n\x10\x63\x61se_sensitivity\x18\x03 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.CaseSensitivity\x12@\n\nmatch_type\x18\x04 \x01(\x0e\x32,.io.deephaven.proto.backplane.grpc.MatchType\"s\n\x0fSearchCondition\x12\x15\n\rsearch_string\x18\x01 \x01(\t\x12I\n\x13optional_references\x18\x02 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.Reference\"\x94\x01\n\x0e\x46lattenRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\"\x96\x01\n\x10MetaTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\"\xb4\x03\n\x19RunChartDownsampleRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x13\n\x0bpixel_count\x18\x03 \x01(\x05\x12Z\n\nzoom_range\x18\x04 \x01(\x0b\x32\x46.io.deephaven.proto.backplane.grpc.RunChartDownsampleRequest.ZoomRange\x12\x15\n\rx_column_name\x18\x05 \x01(\t\x12\x16\n\x0ey_column_names\x18\x06 \x03(\t\x1as\n\tZoomRange\x12\x1f\n\x0emin_date_nanos\x18\x01 \x01(\x03\x42\x02\x30\x01H\x00\x88\x01\x01\x12\x1f\n\x0emax_date_nanos\x18\x02 \x01(\x03\x42\x02\x30\x01H\x01\x88\x01\x01\x42\x11\n\x0f_min_date_nanosB\x11\n\x0f_max_date_nanos\"\xf5\x04\n\x17\x43reateInputTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12L\n\x0fsource_table_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReferenceH\x00\x12\x10\n\x06schema\x18\x03 \x01(\x0cH\x00\x12W\n\x04kind\x18\x04 \x01(\x0b\x32I.io.deephaven.proto.backplane.grpc.CreateInputTableRequest.InputTableKind\x1a\xd4\x02\n\x0eInputTableKind\x12}\n\x15in_memory_append_only\x18\x01 \x01(\x0b\x32\\.io.deephaven.proto.backplane.grpc.CreateInputTableRequest.InputTableKind.InMemoryAppendOnlyH\x00\x12{\n\x14in_memory_key_backed\x18\x02 \x01(\x0b\x32[.io.deephaven.proto.backplane.grpc.CreateInputTableRequest.InputTableKind.InMemoryKeyBackedH\x00\x1a\x14\n\x12InMemoryAppendOnly\x1a(\n\x11InMemoryKeyBacked\x12\x13\n\x0bkey_columns\x18\x01 \x03(\tB\x06\n\x04kindB\x0c\n\ndefinition\"\x83\x02\n\x0eWhereInRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x10\n\x08inverted\x18\x04 \x01(\x08\x12\x18\n\x10\x63olumns_to_match\x18\x05 \x03(\t\"\xef\x18\n\x11\x42\x61tchTableRequest\x12K\n\x03ops\x18\x01 \x03(\x0b\x32>.io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation\x1a\x8c\x18\n\tOperation\x12K\n\x0b\x65mpty_table\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.EmptyTableRequestH\x00\x12I\n\ntime_table\x18\x02 \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.TimeTableRequestH\x00\x12M\n\x0c\x64rop_columns\x18\x03 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.DropColumnsRequestH\x00\x12J\n\x06update\x18\x04 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12O\n\x0blazy_update\x18\x05 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12H\n\x04view\x18\x06 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12O\n\x0bupdate_view\x18\x07 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12J\n\x06select\x18\x08 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12S\n\x0fselect_distinct\x18\t \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectDistinctRequestH\x00\x12G\n\x06\x66ilter\x18\n \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.FilterTableRequestH\x00\x12`\n\x13unstructured_filter\x18\x0b \x01(\x0b\x32\x41.io.deephaven.proto.backplane.grpc.UnstructuredFilterTableRequestH\x00\x12\x43\n\x04sort\x18\x0c \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.SortTableRequestH\x00\x12\x44\n\x04head\x18\r \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.HeadOrTailRequestH\x00\x12\x44\n\x04tail\x18\x0e \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.HeadOrTailRequestH\x00\x12I\n\x07head_by\x18\x0f \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.HeadOrTailByRequestH\x00\x12I\n\x07tail_by\x18\x10 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.HeadOrTailByRequestH\x00\x12\x44\n\x07ungroup\x18\x11 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.UngroupRequestH\x00\x12\x46\n\x05merge\x18\x12 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.MergeTablesRequestH\x00\x12S\n\x0f\x63ombo_aggregate\x18\x13 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.ComboAggregateRequestH\x00\x12\x44\n\x07\x66latten\x18\x15 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.FlattenRequestH\x00\x12\\\n\x14run_chart_downsample\x18\x16 \x01(\x0b\x32<.io.deephaven.proto.backplane.grpc.RunChartDownsampleRequestH\x00\x12O\n\ncross_join\x18\x17 \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.CrossJoinTablesRequestH\x00\x12S\n\x0cnatural_join\x18\x18 \x01(\x0b\x32;.io.deephaven.proto.backplane.grpc.NaturalJoinTablesRequestH\x00\x12O\n\nexact_join\x18\x19 \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.ExactJoinTablesRequestH\x00\x12M\n\tleft_join\x18\x1a \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.LeftJoinTablesRequestH\x00\x12R\n\nas_of_join\x18\x1b \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AsOfJoinTablesRequestB\x02\x18\x01H\x00\x12K\n\x0b\x66\x65tch_table\x18\x1c \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.FetchTableRequestH\x00\x12^\n\x15\x61pply_preview_columns\x18\x1e \x01(\x0b\x32=.io.deephaven.proto.backplane.grpc.ApplyPreviewColumnsRequestH\x00\x12X\n\x12\x63reate_input_table\x18\x1f \x01(\x0b\x32:.io.deephaven.proto.backplane.grpc.CreateInputTableRequestH\x00\x12G\n\tupdate_by\x18 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.grpc.UpdateByRequestH\x00\x12\x45\n\x08where_in\x18! \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.WhereInRequestH\x00\x12O\n\raggregate_all\x18\" \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.AggregateAllRequestH\x00\x12H\n\taggregate\x18# \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.AggregateRequestH\x00\x12K\n\x08snapshot\x18$ \x01(\x0b\x32\x37.io.deephaven.proto.backplane.grpc.SnapshotTableRequestH\x00\x12T\n\rsnapshot_when\x18% \x01(\x0b\x32;.io.deephaven.proto.backplane.grpc.SnapshotWhenTableRequestH\x00\x12I\n\nmeta_table\x18& \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.MetaTableRequestH\x00\x12O\n\nrange_join\x18\' \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.RangeJoinTablesRequestH\x00\x12\x43\n\x02\x61j\x18( \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AjRajTablesRequestH\x00\x12\x44\n\x03raj\x18) \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AjRajTablesRequestH\x00\x42\x04\n\x02opJ\x04\x08\x14\x10\x15J\x04\x08\x1d\x10\x1e*b\n\x0f\x42\x61\x64\x44\x61taBehavior\x12#\n\x1f\x42\x41\x44_DATA_BEHAVIOR_NOT_SPECIFIED\x10\x00\x12\t\n\x05THROW\x10\x01\x12\t\n\x05RESET\x10\x02\x12\x08\n\x04SKIP\x10\x03\x12\n\n\x06POISON\x10\x04*t\n\x14UpdateByNullBehavior\x12\x1f\n\x1bNULL_BEHAVIOR_NOT_SPECIFIED\x10\x00\x12\x12\n\x0eNULL_DOMINATES\x10\x01\x12\x13\n\x0fVALUE_DOMINATES\x10\x02\x12\x12\n\x0eZERO_DOMINATES\x10\x03*\x1b\n\tNullValue\x12\x0e\n\nNULL_VALUE\x10\x00*2\n\x0f\x43\x61seSensitivity\x12\x0e\n\nMATCH_CASE\x10\x00\x12\x0f\n\x0bIGNORE_CASE\x10\x01*&\n\tMatchType\x12\x0b\n\x07REGULAR\x10\x00\x12\x0c\n\x08INVERTED\x10\x01\x32\x8c/\n\x0cTableService\x12\x91\x01\n GetExportedTableCreationResponse\x12).io.deephaven.proto.backplane.grpc.Ticket\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\nFetchTable\x12\x34.io.deephaven.proto.backplane.grpc.FetchTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x98\x01\n\x13\x41pplyPreviewColumns\x12=.io.deephaven.proto.backplane.grpc.ApplyPreviewColumnsRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\nEmptyTable\x12\x34.io.deephaven.proto.backplane.grpc.EmptyTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\tTimeTable\x12\x33.io.deephaven.proto.backplane.grpc.TimeTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x88\x01\n\x0b\x44ropColumns\x12\x35.io.deephaven.proto.backplane.grpc.DropColumnsRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\x06Update\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8a\x01\n\nLazyUpdate\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\x04View\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8a\x01\n\nUpdateView\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\x06Select\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x82\x01\n\x08UpdateBy\x12\x32.io.deephaven.proto.backplane.grpc.UpdateByRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8e\x01\n\x0eSelectDistinct\x12\x38.io.deephaven.proto.backplane.grpc.SelectDistinctRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x83\x01\n\x06\x46ilter\x12\x35.io.deephaven.proto.backplane.grpc.FilterTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x9b\x01\n\x12UnstructuredFilter\x12\x41.io.deephaven.proto.backplane.grpc.UnstructuredFilterTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x7f\n\x04Sort\x12\x33.io.deephaven.proto.backplane.grpc.SortTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x04Head\x12\x34.io.deephaven.proto.backplane.grpc.HeadOrTailRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x04Tail\x12\x34.io.deephaven.proto.backplane.grpc.HeadOrTailRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\x06HeadBy\x12\x36.io.deephaven.proto.backplane.grpc.HeadOrTailByRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\x06TailBy\x12\x36.io.deephaven.proto.backplane.grpc.HeadOrTailByRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x07Ungroup\x12\x31.io.deephaven.proto.backplane.grpc.UngroupRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x88\x01\n\x0bMergeTables\x12\x35.io.deephaven.proto.backplane.grpc.MergeTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x90\x01\n\x0f\x43rossJoinTables\x12\x39.io.deephaven.proto.backplane.grpc.CrossJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x94\x01\n\x11NaturalJoinTables\x12;.io.deephaven.proto.backplane.grpc.NaturalJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x90\x01\n\x0f\x45xactJoinTables\x12\x39.io.deephaven.proto.backplane.grpc.ExactJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8e\x01\n\x0eLeftJoinTables\x12\x38.io.deephaven.proto.backplane.grpc.LeftJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x91\x01\n\x0e\x41sOfJoinTables\x12\x38.io.deephaven.proto.backplane.grpc.AsOfJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x03\x88\x02\x01\x12\x85\x01\n\x08\x41jTables\x12\x35.io.deephaven.proto.backplane.grpc.AjRajTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\tRajTables\x12\x35.io.deephaven.proto.backplane.grpc.AjRajTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x90\x01\n\x0fRangeJoinTables\x12\x39.io.deephaven.proto.backplane.grpc.RangeJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x91\x01\n\x0e\x43omboAggregate\x12\x38.io.deephaven.proto.backplane.grpc.ComboAggregateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x03\x88\x02\x01\x12\x8a\x01\n\x0c\x41ggregateAll\x12\x36.io.deephaven.proto.backplane.grpc.AggregateAllRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\tAggregate\x12\x33.io.deephaven.proto.backplane.grpc.AggregateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x87\x01\n\x08Snapshot\x12\x37.io.deephaven.proto.backplane.grpc.SnapshotTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8f\x01\n\x0cSnapshotWhen\x12;.io.deephaven.proto.backplane.grpc.SnapshotWhenTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x07\x46latten\x12\x31.io.deephaven.proto.backplane.grpc.FlattenRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x96\x01\n\x12RunChartDownsample\x12<.io.deephaven.proto.backplane.grpc.RunChartDownsampleRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x92\x01\n\x10\x43reateInputTable\x12:.io.deephaven.proto.backplane.grpc.CreateInputTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x07WhereIn\x12\x31.io.deephaven.proto.backplane.grpc.WhereInRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x83\x01\n\x05\x42\x61tch\x12\x34.io.deephaven.proto.backplane.grpc.BatchTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x30\x01\x12\x99\x01\n\x14\x45xportedTableUpdates\x12>.io.deephaven.proto.backplane.grpc.ExportedTableUpdatesRequest\x1a=.io.deephaven.proto.backplane.grpc.ExportedTableUpdateMessage\"\x00\x30\x01\x12r\n\x07SeekRow\x12\x31.io.deephaven.proto.backplane.grpc.SeekRowRequest\x1a\x32.io.deephaven.proto.backplane.grpc.SeekRowResponse\"\x00\x12\x84\x01\n\tMetaTable\x12\x33.io.deephaven.proto.backplane.grpc.MetaTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x42\x41H\x01P\x01Z;github.com/deephaven/deephaven-core/go/internal/proto/tableb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1b\x64\x65\x65phaven/proto/table.proto\x12!io.deephaven.proto.backplane.grpc\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"l\n\x0eTableReference\x12;\n\x06ticket\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.TicketH\x00\x12\x16\n\x0c\x62\x61tch_offset\x18\x02 \x01(\x11H\x00\x42\x05\n\x03ref\"\xc6\x01\n\x1d\x45xportedTableCreationResponse\x12\x44\n\tresult_id\x18\x01 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\x12\n\nerror_info\x18\x03 \x01(\t\x12\x15\n\rschema_header\x18\x04 \x01(\x0c\x12\x11\n\tis_static\x18\x05 \x01(\x08\x12\x10\n\x04size\x18\x06 \x01(\x12\x42\x02\x30\x01\"\x97\x01\n\x11\x46\x65tchTableRequest\x12\x44\n\tsource_id\x18\x01 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12<\n\tresult_id\x18\x02 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"\xa0\x01\n\x1a\x41pplyPreviewColumnsRequest\x12\x44\n\tsource_id\x18\x01 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12<\n\tresult_id\x18\x02 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"\x1d\n\x1b\x45xportedTableUpdatesRequest\"\x8c\x01\n\x1a\x45xportedTableUpdateMessage\x12<\n\texport_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x10\n\x04size\x18\x02 \x01(\x12\x42\x02\x30\x01\x12\x1e\n\x16update_failure_message\x18\x03 \x01(\t\"c\n\x11\x45mptyTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x10\n\x04size\x18\x02 \x01(\x12\x42\x02\x30\x01\"\xef\x01\n\x10TimeTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x1e\n\x10start_time_nanos\x18\x02 \x01(\x12\x42\x02\x30\x01H\x00\x12\x1b\n\x11start_time_string\x18\x05 \x01(\tH\x00\x12\x1a\n\x0cperiod_nanos\x18\x03 \x01(\x12\x42\x02\x30\x01H\x01\x12\x17\n\rperiod_string\x18\x06 \x01(\tH\x01\x12\x13\n\x0b\x62link_table\x18\x04 \x01(\x08\x42\x0c\n\nstart_timeB\x08\n\x06period\"\xb1\x01\n\x15SelectOrUpdateRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x0c\x63olumn_specs\x18\x03 \x03(\t\"\x8c\x02\n\x0bMathContext\x12\x11\n\tprecision\x18\x01 \x01(\x11\x12R\n\rrounding_mode\x18\x02 \x01(\x0e\x32;.io.deephaven.proto.backplane.grpc.MathContext.RoundingMode\"\x95\x01\n\x0cRoundingMode\x12\x1f\n\x1bROUNDING_MODE_NOT_SPECIFIED\x10\x00\x12\x06\n\x02UP\x10\x01\x12\x08\n\x04\x44OWN\x10\x02\x12\x0b\n\x07\x43\x45ILING\x10\x03\x12\t\n\x05\x46LOOR\x10\x04\x12\x0b\n\x07HALF_UP\x10\x05\x12\r\n\tHALF_DOWN\x10\x06\x12\r\n\tHALF_EVEN\x10\x07\x12\x0f\n\x0bUNNECESSARY\x10\x08\"\xdb\x02\n\x13UpdateByWindowScale\x12[\n\x05ticks\x18\x01 \x01(\x0b\x32J.io.deephaven.proto.backplane.grpc.UpdateByWindowScale.UpdateByWindowTicksH\x00\x12Y\n\x04time\x18\x02 \x01(\x0b\x32I.io.deephaven.proto.backplane.grpc.UpdateByWindowScale.UpdateByWindowTimeH\x00\x1a$\n\x13UpdateByWindowTicks\x12\r\n\x05ticks\x18\x01 \x01(\x01\x1a^\n\x12UpdateByWindowTime\x12\x0e\n\x06\x63olumn\x18\x01 \x01(\t\x12\x13\n\x05nanos\x18\x02 \x01(\x12\x42\x02\x30\x01H\x00\x12\x19\n\x0f\x64uration_string\x18\x03 \x01(\tH\x00\x42\x08\n\x06windowB\x06\n\x04type\"\xe1\x03\n\x11UpdateByEmOptions\x12I\n\ron_null_value\x18\x01 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12H\n\x0con_nan_value\x18\x02 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12H\n\x0con_null_time\x18\x03 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12R\n\x16on_negative_delta_time\x18\x04 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12N\n\x12on_zero_delta_time\x18\x05 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.BadDataBehavior\x12I\n\x11\x62ig_value_context\x18\x06 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.MathContext\"f\n\x14UpdateByDeltaOptions\x12N\n\rnull_behavior\x18\x01 \x01(\x0e\x32\x37.io.deephaven.proto.backplane.grpc.UpdateByNullBehavior\"\x99\x34\n\x0fUpdateByRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12S\n\x07options\x18\x03 \x01(\x0b\x32\x42.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOptions\x12X\n\noperations\x18\x04 \x03(\x0b\x32\x44.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation\x12\x18\n\x10group_by_columns\x18\x05 \x03(\t\x1a\xc3\x03\n\x0fUpdateByOptions\x12\x1c\n\x0fuse_redirection\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x1b\n\x0e\x63hunk_capacity\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12.\n!max_static_sparse_memory_overhead\x18\x03 \x01(\x01H\x02\x88\x01\x01\x12$\n\x17initial_hash_table_size\x18\x04 \x01(\x05H\x03\x88\x01\x01\x12 \n\x13maximum_load_factor\x18\x05 \x01(\x01H\x04\x88\x01\x01\x12\x1f\n\x12target_load_factor\x18\x06 \x01(\x01H\x05\x88\x01\x01\x12\x44\n\x0cmath_context\x18\x07 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.MathContextB\x12\n\x10_use_redirectionB\x11\n\x0f_chunk_capacityB$\n\"_max_static_sparse_memory_overheadB\x1a\n\x18_initial_hash_table_sizeB\x16\n\x14_maximum_load_factorB\x15\n\x13_target_load_factor\x1a\xf2-\n\x11UpdateByOperation\x12\x65\n\x06\x63olumn\x18\x01 \x01(\x0b\x32S.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumnH\x00\x1a\xed,\n\x0eUpdateByColumn\x12n\n\x04spec\x18\x01 \x01(\x0b\x32`.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec\x12\x13\n\x0bmatch_pairs\x18\x02 \x03(\t\x1a\xd5+\n\x0cUpdateBySpec\x12\x85\x01\n\x03sum\x18\x01 \x01(\x0b\x32v.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByCumulativeSumH\x00\x12\x85\x01\n\x03min\x18\x02 \x01(\x0b\x32v.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByCumulativeMinH\x00\x12\x85\x01\n\x03max\x18\x03 \x01(\x0b\x32v.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByCumulativeMaxH\x00\x12\x8d\x01\n\x07product\x18\x04 \x01(\x0b\x32z.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByCumulativeProductH\x00\x12}\n\x04\x66ill\x18\x05 \x01(\x0b\x32m.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByFillH\x00\x12{\n\x03\x65ma\x18\x06 \x01(\x0b\x32l.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmaH\x00\x12\x8a\x01\n\x0brolling_sum\x18\x07 \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingSumH\x00\x12\x8e\x01\n\rrolling_group\x18\x08 \x01(\x0b\x32u.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingGroupH\x00\x12\x8a\x01\n\x0brolling_avg\x18\t \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingAvgH\x00\x12\x8a\x01\n\x0brolling_min\x18\n \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingMinH\x00\x12\x8a\x01\n\x0brolling_max\x18\x0b \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingMaxH\x00\x12\x92\x01\n\x0frolling_product\x18\x0c \x01(\x0b\x32w.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingProductH\x00\x12\x7f\n\x05\x64\x65lta\x18\r \x01(\x0b\x32n.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByDeltaH\x00\x12{\n\x03\x65ms\x18\x0e \x01(\x0b\x32l.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmsH\x00\x12\x80\x01\n\x06\x65m_min\x18\x0f \x01(\x0b\x32n.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmMinH\x00\x12\x80\x01\n\x06\x65m_max\x18\x10 \x01(\x0b\x32n.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmMaxH\x00\x12\x80\x01\n\x06\x65m_std\x18\x11 \x01(\x0b\x32n.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByEmStdH\x00\x12\x8e\x01\n\rrolling_count\x18\x12 \x01(\x0b\x32u.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingCountH\x00\x12\x8a\x01\n\x0brolling_std\x18\x13 \x01(\x0b\x32s.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingStdH\x00\x12\x8c\x01\n\x0crolling_wavg\x18\x14 \x01(\x0b\x32t.io.deephaven.proto.backplane.grpc.UpdateByRequest.UpdateByOperation.UpdateByColumn.UpdateBySpec.UpdateByRollingWAvgH\x00\x1a\x17\n\x15UpdateByCumulativeSum\x1a\x17\n\x15UpdateByCumulativeMin\x1a\x17\n\x15UpdateByCumulativeMax\x1a\x1b\n\x19UpdateByCumulativeProduct\x1a\x0e\n\x0cUpdateByFill\x1a\xa2\x01\n\x0bUpdateByEma\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xa2\x01\n\x0bUpdateByEms\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xa4\x01\n\rUpdateByEmMin\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xa4\x01\n\rUpdateByEmMax\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xa4\x01\n\rUpdateByEmStd\x12\x45\n\x07options\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.UpdateByEmOptions\x12L\n\x0cwindow_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1aY\n\rUpdateByDelta\x12H\n\x07options\x18\x01 \x01(\x0b\x32\x37.io.deephaven.proto.backplane.grpc.UpdateByDeltaOptions\x1a\xc0\x01\n\x12UpdateByRollingSum\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc2\x01\n\x14UpdateByRollingGroup\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc0\x01\n\x12UpdateByRollingAvg\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc0\x01\n\x12UpdateByRollingMin\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc0\x01\n\x12UpdateByRollingMax\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc4\x01\n\x16UpdateByRollingProduct\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc2\x01\n\x14UpdateByRollingCount\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xc0\x01\n\x12UpdateByRollingStd\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x1a\xd8\x01\n\x13UpdateByRollingWAvg\x12T\n\x14reverse_window_scale\x18\x01 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12T\n\x14\x66orward_window_scale\x18\x02 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.UpdateByWindowScale\x12\x15\n\rweight_column\x18\x03 \x01(\tB\x06\n\x04typeB\x06\n\x04type\"\xb1\x01\n\x15SelectDistinctRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x0c\x63olumn_names\x18\x03 \x03(\t\"\xae\x01\n\x12\x44ropColumnsRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x0c\x63olumn_names\x18\x03 \x03(\t\"\xb5\x01\n\x1eUnstructuredFilterTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x0f\n\x07\x66ilters\x18\x03 \x03(\t\"\xad\x01\n\x11HeadOrTailRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x08num_rows\x18\x03 \x01(\x12\x42\x02\x30\x01\"\xce\x01\n\x13HeadOrTailByRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x14\n\x08num_rows\x18\x03 \x01(\x12\x42\x02\x30\x01\x12\x1d\n\x15group_by_column_specs\x18\x04 \x03(\t\"\xc3\x01\n\x0eUngroupRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x11\n\tnull_fill\x18\x03 \x01(\x08\x12\x1a\n\x12\x63olumns_to_ungroup\x18\x04 \x03(\t\"\xad\x01\n\x12MergeTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x45\n\nsource_ids\x18\x02 \x03(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x12\n\nkey_column\x18\x03 \x01(\t\"\x9a\x01\n\x14SnapshotTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\"\xb1\x02\n\x18SnapshotWhenTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07\x62\x61se_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x45\n\ntrigger_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x0f\n\x07initial\x18\x04 \x01(\x08\x12\x13\n\x0bincremental\x18\x05 \x01(\x08\x12\x0f\n\x07history\x18\x06 \x01(\x08\x12\x15\n\rstamp_columns\x18\x07 \x03(\t\"\xa7\x02\n\x16\x43rossJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\x12\x14\n\x0creserve_bits\x18\x06 \x01(\x05\"\x93\x02\n\x18NaturalJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\"\x91\x02\n\x16\x45xactJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\"\x90\x02\n\x15LeftJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\"\xd1\x03\n\x15\x41sOfJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x18\n\x10\x63olumns_to_match\x18\x04 \x03(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x05 \x03(\t\x12\\\n\x10\x61s_of_match_rule\x18\x07 \x01(\x0e\x32\x42.io.deephaven.proto.backplane.grpc.AsOfJoinTablesRequest.MatchRule\"]\n\tMatchRule\x12\x13\n\x0fLESS_THAN_EQUAL\x10\x00\x12\r\n\tLESS_THAN\x10\x01\x12\x16\n\x12GREATER_THAN_EQUAL\x10\x02\x12\x10\n\x0cGREATER_THAN\x10\x03\x1a\x02\x18\x01:\x02\x18\x01\"\xa6\x02\n\x12\x41jRajTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x1b\n\x13\x65xact_match_columns\x18\x04 \x03(\t\x12\x14\n\x0c\x61s_of_column\x18\x05 \x01(\t\x12\x16\n\x0e\x63olumns_to_add\x18\x06 \x03(\t\"\xcb\x06\n\x16RangeJoinTablesRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x1b\n\x13\x65xact_match_columns\x18\x04 \x03(\t\x12\x19\n\x11left_start_column\x18\x05 \x01(\t\x12\x62\n\x10range_start_rule\x18\x06 \x01(\x0e\x32H.io.deephaven.proto.backplane.grpc.RangeJoinTablesRequest.RangeStartRule\x12\x1a\n\x12right_range_column\x18\x07 \x01(\t\x12^\n\x0erange_end_rule\x18\x08 \x01(\x0e\x32\x46.io.deephaven.proto.backplane.grpc.RangeJoinTablesRequest.RangeEndRule\x12\x17\n\x0fleft_end_column\x18\t \x01(\t\x12\x44\n\x0c\x61ggregations\x18\n \x03(\x0b\x32..io.deephaven.proto.backplane.grpc.Aggregation\"v\n\x0eRangeStartRule\x12\x15\n\x11START_UNSPECIFIED\x10\x00\x12\r\n\tLESS_THAN\x10\x01\x12\x16\n\x12LESS_THAN_OR_EQUAL\x10\x02\x12&\n\"LESS_THAN_OR_EQUAL_ALLOW_PRECEDING\x10\x03\"{\n\x0cRangeEndRule\x12\x13\n\x0f\x45ND_UNSPECIFIED\x10\x00\x12\x10\n\x0cGREATER_THAN\x10\x01\x12\x19\n\x15GREATER_THAN_OR_EQUAL\x10\x02\x12)\n%GREATER_THAN_OR_EQUAL_ALLOW_FOLLOWING\x10\x03\"\xfe\x04\n\x15\x43omboAggregateRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12V\n\naggregates\x18\x03 \x03(\x0b\x32\x42.io.deephaven.proto.backplane.grpc.ComboAggregateRequest.Aggregate\x12\x18\n\x10group_by_columns\x18\x04 \x03(\t\x12\x13\n\x0b\x66orce_combo\x18\x05 \x01(\x08\x1a\xad\x01\n\tAggregate\x12N\n\x04type\x18\x01 \x01(\x0e\x32@.io.deephaven.proto.backplane.grpc.ComboAggregateRequest.AggType\x12\x13\n\x0bmatch_pairs\x18\x02 \x03(\t\x12\x13\n\x0b\x63olumn_name\x18\x03 \x01(\t\x12\x12\n\npercentile\x18\x04 \x01(\x01\x12\x12\n\navg_median\x18\x05 \x01(\x08\"\xa5\x01\n\x07\x41ggType\x12\x07\n\x03SUM\x10\x00\x12\x0b\n\x07\x41\x42S_SUM\x10\x01\x12\t\n\x05GROUP\x10\x02\x12\x07\n\x03\x41VG\x10\x03\x12\t\n\x05\x43OUNT\x10\x04\x12\t\n\x05\x46IRST\x10\x05\x12\x08\n\x04LAST\x10\x06\x12\x07\n\x03MIN\x10\x07\x12\x07\n\x03MAX\x10\x08\x12\n\n\x06MEDIAN\x10\t\x12\x0e\n\nPERCENTILE\x10\n\x12\x07\n\x03STD\x10\x0b\x12\x07\n\x03VAR\x10\x0c\x12\x10\n\x0cWEIGHTED_AVG\x10\r:\x02\x18\x01\"\xed\x01\n\x13\x41ggregateAllRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x38\n\x04spec\x18\x03 \x01(\x0b\x32*.io.deephaven.proto.backplane.grpc.AggSpec\x12\x18\n\x10group_by_columns\x18\x04 \x03(\t\"\xd7\x17\n\x07\x41ggSpec\x12K\n\x07\x61\x62s_sum\x18\x01 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecAbsSumH\x00\x12i\n\x16\x61pproximate_percentile\x18\x02 \x01(\x0b\x32G.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecApproximatePercentileH\x00\x12\x44\n\x03\x61vg\x18\x03 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecAvgH\x00\x12Y\n\x0e\x63ount_distinct\x18\x04 \x01(\x0b\x32?.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecCountDistinctH\x00\x12N\n\x08\x64istinct\x18\x05 \x01(\x0b\x32:.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecDistinctH\x00\x12H\n\x05\x66irst\x18\x06 \x01(\x0b\x32\x37.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecFirstH\x00\x12L\n\x07\x66ormula\x18\x07 \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecFormulaH\x00\x12J\n\x06\x66reeze\x18\x08 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecFreezeH\x00\x12H\n\x05group\x18\t \x01(\x0b\x32\x37.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecGroupH\x00\x12\x46\n\x04last\x18\n \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecLastH\x00\x12\x44\n\x03max\x18\x0b \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecMaxH\x00\x12J\n\x06median\x18\x0c \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecMedianH\x00\x12\x44\n\x03min\x18\r \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecMinH\x00\x12R\n\npercentile\x18\x0e \x01(\x0b\x32<.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecPercentileH\x00\x12P\n\x0csorted_first\x18\x0f \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecSortedH\x00\x12O\n\x0bsorted_last\x18\x10 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecSortedH\x00\x12\x44\n\x03std\x18\x11 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecStdH\x00\x12\x44\n\x03sum\x18\x12 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecSumH\x00\x12M\n\x08t_digest\x18\x13 \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecTDigestH\x00\x12J\n\x06unique\x18\x14 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecUniqueH\x00\x12R\n\x0cweighted_avg\x18\x15 \x01(\x0b\x32:.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecWeightedH\x00\x12R\n\x0cweighted_sum\x18\x16 \x01(\x0b\x32:.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecWeightedH\x00\x12\x44\n\x03var\x18\x17 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecVarH\x00\x1a\\\n\x1c\x41ggSpecApproximatePercentile\x12\x12\n\npercentile\x18\x01 \x01(\x01\x12\x18\n\x0b\x63ompression\x18\x02 \x01(\x01H\x00\x88\x01\x01\x42\x0e\n\x0c_compression\x1a+\n\x14\x41ggSpecCountDistinct\x12\x13\n\x0b\x63ount_nulls\x18\x01 \x01(\x08\x1a(\n\x0f\x41ggSpecDistinct\x12\x15\n\rinclude_nulls\x18\x01 \x01(\x08\x1a\x36\n\x0e\x41ggSpecFormula\x12\x0f\n\x07\x66ormula\x18\x01 \x01(\t\x12\x13\n\x0bparam_token\x18\x02 \x01(\t\x1a/\n\rAggSpecMedian\x12\x1e\n\x16\x61verage_evenly_divided\x18\x01 \x01(\x08\x1aG\n\x11\x41ggSpecPercentile\x12\x12\n\npercentile\x18\x01 \x01(\x01\x12\x1e\n\x16\x61verage_evenly_divided\x18\x02 \x01(\x08\x1a`\n\rAggSpecSorted\x12O\n\x07\x63olumns\x18\x01 \x03(\x0b\x32>.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecSortedColumn\x1a*\n\x13\x41ggSpecSortedColumn\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x1a:\n\x0e\x41ggSpecTDigest\x12\x18\n\x0b\x63ompression\x18\x01 \x01(\x01H\x00\x88\x01\x01\x42\x0e\n\x0c_compression\x1a\x88\x01\n\rAggSpecUnique\x12\x15\n\rinclude_nulls\x18\x01 \x01(\x08\x12`\n\x13non_unique_sentinel\x18\x02 \x01(\x0b\x32\x43.io.deephaven.proto.backplane.grpc.AggSpec.AggSpecNonUniqueSentinel\x1a\xb5\x02\n\x18\x41ggSpecNonUniqueSentinel\x12\x42\n\nnull_value\x18\x01 \x01(\x0e\x32,.io.deephaven.proto.backplane.grpc.NullValueH\x00\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x13\n\tint_value\x18\x03 \x01(\x11H\x00\x12\x18\n\nlong_value\x18\x04 \x01(\x12\x42\x02\x30\x01H\x00\x12\x15\n\x0b\x66loat_value\x18\x05 \x01(\x02H\x00\x12\x16\n\x0c\x64ouble_value\x18\x06 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x07 \x01(\x08H\x00\x12\x14\n\nbyte_value\x18\x08 \x01(\x11H\x00\x12\x15\n\x0bshort_value\x18\t \x01(\x11H\x00\x12\x14\n\nchar_value\x18\n \x01(\x11H\x00\x42\x06\n\x04type\x1a(\n\x0f\x41ggSpecWeighted\x12\x15\n\rweight_column\x18\x01 \x01(\t\x1a\x0f\n\rAggSpecAbsSum\x1a\x0c\n\nAggSpecAvg\x1a\x0e\n\x0c\x41ggSpecFirst\x1a\x0f\n\rAggSpecFreeze\x1a\x0e\n\x0c\x41ggSpecGroup\x1a\r\n\x0b\x41ggSpecLast\x1a\x0c\n\nAggSpecMax\x1a\x0c\n\nAggSpecMin\x1a\x0c\n\nAggSpecStd\x1a\x0c\n\nAggSpecSum\x1a\x0c\n\nAggSpecVarB\x06\n\x04type\"\xdc\x02\n\x10\x41ggregateRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12L\n\x11initial_groups_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x16\n\x0epreserve_empty\x18\x04 \x01(\x08\x12\x44\n\x0c\x61ggregations\x18\x05 \x03(\x0b\x32..io.deephaven.proto.backplane.grpc.Aggregation\x12\x18\n\x10group_by_columns\x18\x06 \x03(\t\"\xd3\x05\n\x0b\x41ggregation\x12T\n\x07\x63olumns\x18\x01 \x01(\x0b\x32\x41.io.deephaven.proto.backplane.grpc.Aggregation.AggregationColumnsH\x00\x12P\n\x05\x63ount\x18\x02 \x01(\x0b\x32?.io.deephaven.proto.backplane.grpc.Aggregation.AggregationCountH\x00\x12Y\n\rfirst_row_key\x18\x03 \x01(\x0b\x32@.io.deephaven.proto.backplane.grpc.Aggregation.AggregationRowKeyH\x00\x12X\n\x0clast_row_key\x18\x04 \x01(\x0b\x32@.io.deephaven.proto.backplane.grpc.Aggregation.AggregationRowKeyH\x00\x12X\n\tpartition\x18\x05 \x01(\x0b\x32\x43.io.deephaven.proto.backplane.grpc.Aggregation.AggregationPartitionH\x00\x1a\x63\n\x12\x41ggregationColumns\x12\x38\n\x04spec\x18\x01 \x01(\x0b\x32*.io.deephaven.proto.backplane.grpc.AggSpec\x12\x13\n\x0bmatch_pairs\x18\x02 \x03(\t\x1a\'\n\x10\x41ggregationCount\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x1a(\n\x11\x41ggregationRowKey\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x1aM\n\x14\x41ggregationPartition\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x12 \n\x18include_group_by_columns\x18\x02 \x01(\x08\x42\x06\n\x04type\"\xe1\x01\n\x0eSortDescriptor\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\x12\x13\n\x0bis_absolute\x18\x02 \x01(\x08\x12R\n\tdirection\x18\x03 \x01(\x0e\x32?.io.deephaven.proto.backplane.grpc.SortDescriptor.SortDirection\"Q\n\rSortDirection\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x17\n\nDESCENDING\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x12\r\n\tASCENDING\x10\x01\x12\x0b\n\x07REVERSE\x10\x02\"\xd8\x01\n\x10SortTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12@\n\x05sorts\x18\x03 \x03(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.SortDescriptor\"\xd7\x01\n\x12\x46ilterTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12=\n\x07\x66ilters\x18\x03 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.Condition\"\xf9\x01\n\x0eSeekRowRequest\x12<\n\tsource_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x18\n\x0cstarting_row\x18\x02 \x01(\x12\x42\x02\x30\x01\x12\x13\n\x0b\x63olumn_name\x18\x03 \x01(\t\x12>\n\nseek_value\x18\x04 \x01(\x0b\x32*.io.deephaven.proto.backplane.grpc.Literal\x12\x13\n\x0binsensitive\x18\x05 \x01(\x08\x12\x10\n\x08\x63ontains\x18\x06 \x01(\x08\x12\x13\n\x0bis_backward\x18\x07 \x01(\x08\")\n\x0fSeekRowResponse\x12\x16\n\nresult_row\x18\x01 \x01(\x12\x42\x02\x30\x01\" \n\tReference\x12\x13\n\x0b\x63olumn_name\x18\x01 \x01(\t\"\x91\x01\n\x07Literal\x12\x16\n\x0cstring_value\x18\x01 \x01(\tH\x00\x12\x16\n\x0c\x64ouble_value\x18\x02 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x03 \x01(\x08H\x00\x12\x18\n\nlong_value\x18\x04 \x01(\x12\x42\x02\x30\x01H\x00\x12\x1d\n\x0fnano_time_value\x18\x05 \x01(\x12\x42\x02\x30\x01H\x00\x42\x07\n\x05value\"\x91\x01\n\x05Value\x12\x41\n\treference\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.ReferenceH\x00\x12=\n\x07literal\x18\x02 \x01(\x0b\x32*.io.deephaven.proto.backplane.grpc.LiteralH\x00\x42\x06\n\x04\x64\x61ta\"\xbc\x05\n\tCondition\x12>\n\x03\x61nd\x18\x01 \x01(\x0b\x32/.io.deephaven.proto.backplane.grpc.AndConditionH\x00\x12<\n\x02or\x18\x02 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.OrConditionH\x00\x12>\n\x03not\x18\x03 \x01(\x0b\x32/.io.deephaven.proto.backplane.grpc.NotConditionH\x00\x12\x46\n\x07\x63ompare\x18\x04 \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.CompareConditionH\x00\x12<\n\x02in\x18\x05 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.InConditionH\x00\x12\x44\n\x06invoke\x18\x06 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.grpc.InvokeConditionH\x00\x12\x45\n\x07is_null\x18\x07 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.grpc.IsNullConditionH\x00\x12\x46\n\x07matches\x18\x08 \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.MatchesConditionH\x00\x12H\n\x08\x63ontains\x18\t \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.ContainsConditionH\x00\x12\x44\n\x06search\x18\n \x01(\x0b\x32\x32.io.deephaven.proto.backplane.grpc.SearchConditionH\x00\x42\x06\n\x04\x64\x61ta\"M\n\x0c\x41ndCondition\x12=\n\x07\x66ilters\x18\x01 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.Condition\"L\n\x0bOrCondition\x12=\n\x07\x66ilters\x18\x01 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.Condition\"L\n\x0cNotCondition\x12<\n\x06\x66ilter\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.Condition\"\xac\x03\n\x10\x43ompareCondition\x12W\n\toperation\x18\x01 \x01(\x0e\x32\x44.io.deephaven.proto.backplane.grpc.CompareCondition.CompareOperation\x12L\n\x10\x63\x61se_sensitivity\x18\x02 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.CaseSensitivity\x12\x35\n\x03lhs\x18\x03 \x01(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\x12\x35\n\x03rhs\x18\x04 \x01(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\"\x82\x01\n\x10\x43ompareOperation\x12\r\n\tLESS_THAN\x10\x00\x12\x16\n\x12LESS_THAN_OR_EQUAL\x10\x01\x12\x10\n\x0cGREATER_THAN\x10\x02\x12\x19\n\x15GREATER_THAN_OR_EQUAL\x10\x03\x12\n\n\x06\x45QUALS\x10\x04\x12\x0e\n\nNOT_EQUALS\x10\x05\"\x95\x02\n\x0bInCondition\x12\x38\n\x06target\x18\x01 \x01(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\x12<\n\ncandidates\x18\x02 \x03(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\x12L\n\x10\x63\x61se_sensitivity\x18\x03 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.CaseSensitivity\x12@\n\nmatch_type\x18\x04 \x01(\x0e\x32,.io.deephaven.proto.backplane.grpc.MatchType\"\x98\x01\n\x0fInvokeCondition\x12\x0e\n\x06method\x18\x01 \x01(\t\x12\x38\n\x06target\x18\x02 \x01(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\x12;\n\targuments\x18\x03 \x03(\x0b\x32(.io.deephaven.proto.backplane.grpc.Value\"R\n\x0fIsNullCondition\x12?\n\treference\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.Reference\"\xf2\x01\n\x10MatchesCondition\x12?\n\treference\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.Reference\x12\r\n\x05regex\x18\x02 \x01(\t\x12L\n\x10\x63\x61se_sensitivity\x18\x03 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.CaseSensitivity\x12@\n\nmatch_type\x18\x04 \x01(\x0e\x32,.io.deephaven.proto.backplane.grpc.MatchType\"\xfb\x01\n\x11\x43ontainsCondition\x12?\n\treference\x18\x01 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.Reference\x12\x15\n\rsearch_string\x18\x02 \x01(\t\x12L\n\x10\x63\x61se_sensitivity\x18\x03 \x01(\x0e\x32\x32.io.deephaven.proto.backplane.grpc.CaseSensitivity\x12@\n\nmatch_type\x18\x04 \x01(\x0e\x32,.io.deephaven.proto.backplane.grpc.MatchType\"s\n\x0fSearchCondition\x12\x15\n\rsearch_string\x18\x01 \x01(\t\x12I\n\x13optional_references\x18\x02 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.Reference\"\x94\x01\n\x0e\x46lattenRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\"\x96\x01\n\x10MetaTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\"\xb4\x03\n\x19RunChartDownsampleRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x13\n\x0bpixel_count\x18\x03 \x01(\x05\x12Z\n\nzoom_range\x18\x04 \x01(\x0b\x32\x46.io.deephaven.proto.backplane.grpc.RunChartDownsampleRequest.ZoomRange\x12\x15\n\rx_column_name\x18\x05 \x01(\t\x12\x16\n\x0ey_column_names\x18\x06 \x03(\t\x1as\n\tZoomRange\x12\x1f\n\x0emin_date_nanos\x18\x01 \x01(\x03\x42\x02\x30\x01H\x00\x88\x01\x01\x12\x1f\n\x0emax_date_nanos\x18\x02 \x01(\x03\x42\x02\x30\x01H\x01\x88\x01\x01\x42\x11\n\x0f_min_date_nanosB\x11\n\x0f_max_date_nanos\"\xf5\x04\n\x17\x43reateInputTableRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12L\n\x0fsource_table_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReferenceH\x00\x12\x10\n\x06schema\x18\x03 \x01(\x0cH\x00\x12W\n\x04kind\x18\x04 \x01(\x0b\x32I.io.deephaven.proto.backplane.grpc.CreateInputTableRequest.InputTableKind\x1a\xd4\x02\n\x0eInputTableKind\x12}\n\x15in_memory_append_only\x18\x01 \x01(\x0b\x32\\.io.deephaven.proto.backplane.grpc.CreateInputTableRequest.InputTableKind.InMemoryAppendOnlyH\x00\x12{\n\x14in_memory_key_backed\x18\x02 \x01(\x0b\x32[.io.deephaven.proto.backplane.grpc.CreateInputTableRequest.InputTableKind.InMemoryKeyBackedH\x00\x1a\x14\n\x12InMemoryAppendOnly\x1a(\n\x11InMemoryKeyBacked\x12\x13\n\x0bkey_columns\x18\x01 \x03(\tB\x06\n\x04kindB\x0c\n\ndefinition\"\x83\x02\n\x0eWhereInRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x42\n\x07left_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x43\n\x08right_id\x18\x03 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x10\n\x08inverted\x18\x04 \x01(\x08\x12\x18\n\x10\x63olumns_to_match\x18\x05 \x03(\t\"\xea\x01\n\x17\x43olumnStatisticsRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x44\n\tsource_id\x18\x02 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.TableReference\x12\x13\n\x0b\x63olumn_name\x18\x03 \x01(\t\x12\x1f\n\x12unique_value_limit\x18\x04 \x01(\x05H\x00\x88\x01\x01\x42\x15\n\x13_unique_value_limit\"\xc8\x19\n\x11\x42\x61tchTableRequest\x12K\n\x03ops\x18\x01 \x03(\x0b\x32>.io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation\x1a\xe5\x18\n\tOperation\x12K\n\x0b\x65mpty_table\x18\x01 \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.EmptyTableRequestH\x00\x12I\n\ntime_table\x18\x02 \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.TimeTableRequestH\x00\x12M\n\x0c\x64rop_columns\x18\x03 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.DropColumnsRequestH\x00\x12J\n\x06update\x18\x04 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12O\n\x0blazy_update\x18\x05 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12H\n\x04view\x18\x06 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12O\n\x0bupdate_view\x18\x07 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12J\n\x06select\x18\x08 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequestH\x00\x12S\n\x0fselect_distinct\x18\t \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.SelectDistinctRequestH\x00\x12G\n\x06\x66ilter\x18\n \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.FilterTableRequestH\x00\x12`\n\x13unstructured_filter\x18\x0b \x01(\x0b\x32\x41.io.deephaven.proto.backplane.grpc.UnstructuredFilterTableRequestH\x00\x12\x43\n\x04sort\x18\x0c \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.SortTableRequestH\x00\x12\x44\n\x04head\x18\r \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.HeadOrTailRequestH\x00\x12\x44\n\x04tail\x18\x0e \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.HeadOrTailRequestH\x00\x12I\n\x07head_by\x18\x0f \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.HeadOrTailByRequestH\x00\x12I\n\x07tail_by\x18\x10 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.HeadOrTailByRequestH\x00\x12\x44\n\x07ungroup\x18\x11 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.UngroupRequestH\x00\x12\x46\n\x05merge\x18\x12 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.MergeTablesRequestH\x00\x12S\n\x0f\x63ombo_aggregate\x18\x13 \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.ComboAggregateRequestH\x00\x12\x44\n\x07\x66latten\x18\x15 \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.FlattenRequestH\x00\x12\\\n\x14run_chart_downsample\x18\x16 \x01(\x0b\x32<.io.deephaven.proto.backplane.grpc.RunChartDownsampleRequestH\x00\x12O\n\ncross_join\x18\x17 \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.CrossJoinTablesRequestH\x00\x12S\n\x0cnatural_join\x18\x18 \x01(\x0b\x32;.io.deephaven.proto.backplane.grpc.NaturalJoinTablesRequestH\x00\x12O\n\nexact_join\x18\x19 \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.ExactJoinTablesRequestH\x00\x12M\n\tleft_join\x18\x1a \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.LeftJoinTablesRequestH\x00\x12R\n\nas_of_join\x18\x1b \x01(\x0b\x32\x38.io.deephaven.proto.backplane.grpc.AsOfJoinTablesRequestB\x02\x18\x01H\x00\x12K\n\x0b\x66\x65tch_table\x18\x1c \x01(\x0b\x32\x34.io.deephaven.proto.backplane.grpc.FetchTableRequestH\x00\x12^\n\x15\x61pply_preview_columns\x18\x1e \x01(\x0b\x32=.io.deephaven.proto.backplane.grpc.ApplyPreviewColumnsRequestH\x00\x12X\n\x12\x63reate_input_table\x18\x1f \x01(\x0b\x32:.io.deephaven.proto.backplane.grpc.CreateInputTableRequestH\x00\x12G\n\tupdate_by\x18 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.grpc.UpdateByRequestH\x00\x12\x45\n\x08where_in\x18! \x01(\x0b\x32\x31.io.deephaven.proto.backplane.grpc.WhereInRequestH\x00\x12O\n\raggregate_all\x18\" \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.AggregateAllRequestH\x00\x12H\n\taggregate\x18# \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.AggregateRequestH\x00\x12K\n\x08snapshot\x18$ \x01(\x0b\x32\x37.io.deephaven.proto.backplane.grpc.SnapshotTableRequestH\x00\x12T\n\rsnapshot_when\x18% \x01(\x0b\x32;.io.deephaven.proto.backplane.grpc.SnapshotWhenTableRequestH\x00\x12I\n\nmeta_table\x18& \x01(\x0b\x32\x33.io.deephaven.proto.backplane.grpc.MetaTableRequestH\x00\x12O\n\nrange_join\x18\' \x01(\x0b\x32\x39.io.deephaven.proto.backplane.grpc.RangeJoinTablesRequestH\x00\x12\x43\n\x02\x61j\x18( \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AjRajTablesRequestH\x00\x12\x44\n\x03raj\x18) \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.AjRajTablesRequestH\x00\x12W\n\x11\x63olumn_statistics\x18* \x01(\x0b\x32:.io.deephaven.proto.backplane.grpc.ColumnStatisticsRequestH\x00\x42\x04\n\x02opJ\x04\x08\x14\x10\x15J\x04\x08\x1d\x10\x1e*b\n\x0f\x42\x61\x64\x44\x61taBehavior\x12#\n\x1f\x42\x41\x44_DATA_BEHAVIOR_NOT_SPECIFIED\x10\x00\x12\t\n\x05THROW\x10\x01\x12\t\n\x05RESET\x10\x02\x12\x08\n\x04SKIP\x10\x03\x12\n\n\x06POISON\x10\x04*t\n\x14UpdateByNullBehavior\x12\x1f\n\x1bNULL_BEHAVIOR_NOT_SPECIFIED\x10\x00\x12\x12\n\x0eNULL_DOMINATES\x10\x01\x12\x13\n\x0fVALUE_DOMINATES\x10\x02\x12\x12\n\x0eZERO_DOMINATES\x10\x03*\x1b\n\tNullValue\x12\x0e\n\nNULL_VALUE\x10\x00*2\n\x0f\x43\x61seSensitivity\x12\x0e\n\nMATCH_CASE\x10\x00\x12\x0f\n\x0bIGNORE_CASE\x10\x01*&\n\tMatchType\x12\x0b\n\x07REGULAR\x10\x00\x12\x0c\n\x08INVERTED\x10\x01\x32\xa8\x30\n\x0cTableService\x12\x91\x01\n GetExportedTableCreationResponse\x12).io.deephaven.proto.backplane.grpc.Ticket\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\nFetchTable\x12\x34.io.deephaven.proto.backplane.grpc.FetchTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x98\x01\n\x13\x41pplyPreviewColumns\x12=.io.deephaven.proto.backplane.grpc.ApplyPreviewColumnsRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\nEmptyTable\x12\x34.io.deephaven.proto.backplane.grpc.EmptyTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\tTimeTable\x12\x33.io.deephaven.proto.backplane.grpc.TimeTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x88\x01\n\x0b\x44ropColumns\x12\x35.io.deephaven.proto.backplane.grpc.DropColumnsRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\x06Update\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8a\x01\n\nLazyUpdate\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\x04View\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8a\x01\n\nUpdateView\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\x06Select\x12\x38.io.deephaven.proto.backplane.grpc.SelectOrUpdateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x82\x01\n\x08UpdateBy\x12\x32.io.deephaven.proto.backplane.grpc.UpdateByRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8e\x01\n\x0eSelectDistinct\x12\x38.io.deephaven.proto.backplane.grpc.SelectDistinctRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x83\x01\n\x06\x46ilter\x12\x35.io.deephaven.proto.backplane.grpc.FilterTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x9b\x01\n\x12UnstructuredFilter\x12\x41.io.deephaven.proto.backplane.grpc.UnstructuredFilterTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x7f\n\x04Sort\x12\x33.io.deephaven.proto.backplane.grpc.SortTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x04Head\x12\x34.io.deephaven.proto.backplane.grpc.HeadOrTailRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x04Tail\x12\x34.io.deephaven.proto.backplane.grpc.HeadOrTailRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\x06HeadBy\x12\x36.io.deephaven.proto.backplane.grpc.HeadOrTailByRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\x06TailBy\x12\x36.io.deephaven.proto.backplane.grpc.HeadOrTailByRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x07Ungroup\x12\x31.io.deephaven.proto.backplane.grpc.UngroupRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x88\x01\n\x0bMergeTables\x12\x35.io.deephaven.proto.backplane.grpc.MergeTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x90\x01\n\x0f\x43rossJoinTables\x12\x39.io.deephaven.proto.backplane.grpc.CrossJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x94\x01\n\x11NaturalJoinTables\x12;.io.deephaven.proto.backplane.grpc.NaturalJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x90\x01\n\x0f\x45xactJoinTables\x12\x39.io.deephaven.proto.backplane.grpc.ExactJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8e\x01\n\x0eLeftJoinTables\x12\x38.io.deephaven.proto.backplane.grpc.LeftJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x91\x01\n\x0e\x41sOfJoinTables\x12\x38.io.deephaven.proto.backplane.grpc.AsOfJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x03\x88\x02\x01\x12\x85\x01\n\x08\x41jTables\x12\x35.io.deephaven.proto.backplane.grpc.AjRajTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x86\x01\n\tRajTables\x12\x35.io.deephaven.proto.backplane.grpc.AjRajTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x90\x01\n\x0fRangeJoinTables\x12\x39.io.deephaven.proto.backplane.grpc.RangeJoinTablesRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x91\x01\n\x0e\x43omboAggregate\x12\x38.io.deephaven.proto.backplane.grpc.ComboAggregateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x03\x88\x02\x01\x12\x8a\x01\n\x0c\x41ggregateAll\x12\x36.io.deephaven.proto.backplane.grpc.AggregateAllRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x84\x01\n\tAggregate\x12\x33.io.deephaven.proto.backplane.grpc.AggregateRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x87\x01\n\x08Snapshot\x12\x37.io.deephaven.proto.backplane.grpc.SnapshotTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x8f\x01\n\x0cSnapshotWhen\x12;.io.deephaven.proto.backplane.grpc.SnapshotWhenTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x07\x46latten\x12\x31.io.deephaven.proto.backplane.grpc.FlattenRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x96\x01\n\x12RunChartDownsample\x12<.io.deephaven.proto.backplane.grpc.RunChartDownsampleRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x92\x01\n\x10\x43reateInputTable\x12:.io.deephaven.proto.backplane.grpc.CreateInputTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x80\x01\n\x07WhereIn\x12\x31.io.deephaven.proto.backplane.grpc.WhereInRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x83\x01\n\x05\x42\x61tch\x12\x34.io.deephaven.proto.backplane.grpc.BatchTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x30\x01\x12\x99\x01\n\x14\x45xportedTableUpdates\x12>.io.deephaven.proto.backplane.grpc.ExportedTableUpdatesRequest\x1a=.io.deephaven.proto.backplane.grpc.ExportedTableUpdateMessage\"\x00\x30\x01\x12r\n\x07SeekRow\x12\x31.io.deephaven.proto.backplane.grpc.SeekRowRequest\x1a\x32.io.deephaven.proto.backplane.grpc.SeekRowResponse\"\x00\x12\x84\x01\n\tMetaTable\x12\x33.io.deephaven.proto.backplane.grpc.MetaTableRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x12\x99\x01\n\x17\x43omputeColumnStatistics\x12:.io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest\x1a@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\"\x00\x42\x41H\x01P\x01Z;github.com/deephaven/deephaven-core/go/internal/proto/tableb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'deephaven.proto.table_pb2', globals()) @@ -64,16 +64,16 @@ _TABLESERVICE.methods_by_name['AsOfJoinTables']._serialized_options = b'\210\002\001' _TABLESERVICE.methods_by_name['ComboAggregate']._options = None _TABLESERVICE.methods_by_name['ComboAggregate']._serialized_options = b'\210\002\001' - _BADDATABEHAVIOR._serialized_start=27426 - _BADDATABEHAVIOR._serialized_end=27524 - _UPDATEBYNULLBEHAVIOR._serialized_start=27526 - _UPDATEBYNULLBEHAVIOR._serialized_end=27642 - _NULLVALUE._serialized_start=27644 - _NULLVALUE._serialized_end=27671 - _CASESENSITIVITY._serialized_start=27673 - _CASESENSITIVITY._serialized_end=27723 - _MATCHTYPE._serialized_start=27725 - _MATCHTYPE._serialized_end=27763 + _BADDATABEHAVIOR._serialized_start=27752 + _BADDATABEHAVIOR._serialized_end=27850 + _UPDATEBYNULLBEHAVIOR._serialized_start=27852 + _UPDATEBYNULLBEHAVIOR._serialized_end=27968 + _NULLVALUE._serialized_start=27970 + _NULLVALUE._serialized_end=27997 + _CASESENSITIVITY._serialized_start=27999 + _CASESENSITIVITY._serialized_end=28049 + _MATCHTYPE._serialized_start=28051 + _MATCHTYPE._serialized_end=28089 _TABLEREFERENCE._serialized_start=96 _TABLEREFERENCE._serialized_end=204 _EXPORTEDTABLECREATIONRESPONSE._serialized_start=207 @@ -322,10 +322,12 @@ _CREATEINPUTTABLEREQUEST_INPUTTABLEKIND_INMEMORYKEYBACKED._serialized_end=23954 _WHEREINREQUEST._serialized_start=23979 _WHEREINREQUEST._serialized_end=24238 - _BATCHTABLEREQUEST._serialized_start=24241 - _BATCHTABLEREQUEST._serialized_end=27424 - _BATCHTABLEREQUEST_OPERATION._serialized_start=24340 - _BATCHTABLEREQUEST_OPERATION._serialized_end=27424 - _TABLESERVICE._serialized_start=27766 - _TABLESERVICE._serialized_end=33794 + _COLUMNSTATISTICSREQUEST._serialized_start=24241 + _COLUMNSTATISTICSREQUEST._serialized_end=24475 + _BATCHTABLEREQUEST._serialized_start=24478 + _BATCHTABLEREQUEST._serialized_end=27750 + _BATCHTABLEREQUEST_OPERATION._serialized_start=24577 + _BATCHTABLEREQUEST_OPERATION._serialized_end=27750 + _TABLESERVICE._serialized_start=28092 + _TABLESERVICE._serialized_end=34276 # @@protoc_insertion_point(module_scope) diff --git a/py/client/pydeephaven/proto/table_pb2_grpc.py b/py/client/pydeephaven/proto/table_pb2_grpc.py index 0e49069826d..51ef7b023e1 100644 --- a/py/client/pydeephaven/proto/table_pb2_grpc.py +++ b/py/client/pydeephaven/proto/table_pb2_grpc.py @@ -230,6 +230,11 @@ def __init__(self, channel): request_serializer=deephaven_dot_proto_dot_table__pb2.MetaTableRequest.SerializeToString, response_deserializer=deephaven_dot_proto_dot_table__pb2.ExportedTableCreationResponse.FromString, ) + self.ComputeColumnStatistics = channel.unary_unary( + '/io.deephaven.proto.backplane.grpc.TableService/ComputeColumnStatistics', + request_serializer=deephaven_dot_proto_dot_table__pb2.ColumnStatisticsRequest.SerializeToString, + response_deserializer=deephaven_dot_proto_dot_table__pb2.ExportedTableCreationResponse.FromString, + ) class TableServiceServicer(object): @@ -602,6 +607,16 @@ def MetaTable(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def ComputeColumnStatistics(self, request, context): + """* + Returns a new table representing statistics about a single column of the provided table. This + result table will be static - use Aggregation() instead for updating results. Presently, the + primary use case for this is the Deephaven Web UI. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_TableServiceServicer_to_server(servicer, server): rpc_method_handlers = { @@ -820,6 +835,11 @@ def add_TableServiceServicer_to_server(servicer, server): request_deserializer=deephaven_dot_proto_dot_table__pb2.MetaTableRequest.FromString, response_serializer=deephaven_dot_proto_dot_table__pb2.ExportedTableCreationResponse.SerializeToString, ), + 'ComputeColumnStatistics': grpc.unary_unary_rpc_method_handler( + servicer.ComputeColumnStatistics, + request_deserializer=deephaven_dot_proto_dot_table__pb2.ColumnStatisticsRequest.FromString, + response_serializer=deephaven_dot_proto_dot_table__pb2.ExportedTableCreationResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'io.deephaven.proto.backplane.grpc.TableService', rpc_method_handlers) @@ -1560,3 +1580,20 @@ def MetaTable(request, deephaven_dot_proto_dot_table__pb2.ExportedTableCreationResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ComputeColumnStatistics(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/io.deephaven.proto.backplane.grpc.TableService/ComputeColumnStatistics', + deephaven_dot_proto_dot_table__pb2.ColumnStatisticsRequest.SerializeToString, + deephaven_dot_proto_dot_table__pb2.ExportedTableCreationResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/replication/static/build.gradle b/replication/static/build.gradle index a090f51befe..60f22f528de 100644 --- a/replication/static/build.gradle +++ b/replication/static/build.gradle @@ -85,6 +85,8 @@ task replicateAllSafe { dependsOn Tasks.registerMainExecTask(project, 'replicateRangeSearchKernels', 'io.deephaven.replicators.ReplicateRangeSearchKernels') dependsOn Tasks.registerMainExecTask(project, 'replicateParquetTransferObjects', 'io.deephaven.replicators.ReplicateParquetTransferObjects') + + dependsOn Tasks.registerMainExecTask(project, 'replicateColumnStats', 'io.deephaven.replicators.ReplicateColumnStats') } // These replicators need manual fix-up post replication and should not be run without supervision diff --git a/replication/static/src/main/java/io/deephaven/replicators/ReplicateColumnStats.java b/replication/static/src/main/java/io/deephaven/replicators/ReplicateColumnStats.java new file mode 100644 index 00000000000..4b5613bdb42 --- /dev/null +++ b/replication/static/src/main/java/io/deephaven/replicators/ReplicateColumnStats.java @@ -0,0 +1,64 @@ +package io.deephaven.replicators; + +import io.deephaven.replication.ReplicatePrimitiveCode; +import io.deephaven.replication.ReplicationUtils; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static io.deephaven.replication.ReplicatePrimitiveCode.shortToAllIntegralTypes; +import static io.deephaven.replication.ReplicationUtils.globalReplacements; + +public class ReplicateColumnStats { + public static void main(String[] args) throws IOException { + final List paths = shortToAllIntegralTypes( + "server/src/main/java/io/deephaven/server/table/stats/ShortChunkedNumericalStats.java"); + final String intPath = + paths.stream().filter(p -> p.contains("Integer")).findFirst().orElseThrow(FileNotFoundException::new); + fixupIntegerChunkName(intPath); + + ReplicatePrimitiveCode.floatToAllFloatingPoints( + "server/src/main/java/io/deephaven/server/table/stats/FloatChunkedNumericalStats.java"); + + final String objectPath = ReplicatePrimitiveCode.charToObject( + "server/src/main/java/io/deephaven/server/table/stats/CharacterChunkedStats.java"); + fixupObjectChunk(objectPath); + } + + private static void fixupIntegerChunkName(final String intPath) throws IOException { + final File objectFile = new File(intPath); + final List lines = FileUtils.readLines(objectFile, Charset.defaultCharset()); + FileUtils.writeLines(objectFile, globalReplacements(lines, "chunk.IntegerChunk", "chunk.IntChunk", + "final IntegerChunk", "final IntChunk", "asIntegerChunk", "asIntChunk")); + } + + private static void fixupObjectChunk(final String objectPath) throws IOException { + final File objectFile = new File(objectPath); + List lines = FileUtils.readLines(objectFile, Charset.defaultCharset()); + lines = ReplicationUtils.removeImport(lines, + "import gnu.trove.set.TObjectSet;", + "import gnu.trove.set.hash.TObjectHashSet;", + "import io.deephaven.util.QueryConstants;"); + lines = ReplicationUtils.addImport(lines, + Set.class, + HashSet.class); + lines = globalReplacements(lines, + "QueryConstants.NULL_OBJECT", "null", + "\\? extends Attributes.Values", "?, ? extends Attributes.Values", + "ObjectChunk<[?] ", "ObjectChunk", + " TObjectLongHashMap", " TObjectLongHashMap<>", + " TObjectSet", " Set", + " TObjectHashSet", " HashSet<>", + "new ChunkedObjectColumnIterator", "new ChunkedObjectColumnIterator<>", + "\\(ObjectColumnIterator", "(ObjectColumnIterator", + "nextObject\\(\\)", "next()"); + FileUtils.writeLines(objectFile, lines); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/TableModule.java b/server/src/main/java/io/deephaven/server/table/TableModule.java index e7ed9991904..202587fc2d9 100644 --- a/server/src/main/java/io/deephaven/server/table/TableModule.java +++ b/server/src/main/java/io/deephaven/server/table/TableModule.java @@ -18,6 +18,7 @@ import io.deephaven.server.table.ops.AjRajGrpcImpl.RajGrpcImpl; import io.deephaven.server.table.ops.ApplyPreviewColumnsGrpcImpl; import io.deephaven.server.table.ops.AjRajGrpcImpl; +import io.deephaven.server.table.ops.ColumnStatisticsGrpcImpl; import io.deephaven.server.table.ops.ComboAggregateGrpcImpl; import io.deephaven.server.table.ops.CreateInputTableGrpcImpl; import io.deephaven.server.table.ops.DropColumnsGrpcImpl; @@ -253,6 +254,11 @@ static TableServiceContextualAuthWiring provideAuthWiring(AuthorizationProvider @BatchOpCode(BatchTableRequest.Operation.OpCase.WHERE_IN) GrpcTableOperation bindWhereIn(WhereInGrpcImpl op); + @Binds + @IntoMap + @BatchOpCode(BatchTableRequest.Operation.OpCase.COLUMN_STATISTICS) + GrpcTableOperation bindColumnStats(ColumnStatisticsGrpcImpl op); + @Binds @IntoMap @BatchOpCode(BatchTableRequest.Operation.OpCase.META_TABLE) diff --git a/server/src/main/java/io/deephaven/server/table/ops/ColumnStatisticsGrpcImpl.java b/server/src/main/java/io/deephaven/server/table/ops/ColumnStatisticsGrpcImpl.java new file mode 100644 index 00000000000..e66c6c053b4 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/ops/ColumnStatisticsGrpcImpl.java @@ -0,0 +1,111 @@ +package io.deephaven.server.table.ops; + +import com.google.rpc.Code; +import io.deephaven.auth.codegen.impl.TableServiceContextualAuthWiring; +import io.deephaven.configuration.Configuration; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ColumnDefinition; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.table.impl.NotificationStepSource; +import io.deephaven.engine.table.impl.remote.ConstructSnapshot; +import io.deephaven.engine.table.impl.sources.ReinterpretUtils; +import io.deephaven.proto.backplane.grpc.BatchTableRequest; +import io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest; +import io.deephaven.proto.util.Exceptions; +import io.deephaven.server.session.SessionState; +import io.deephaven.server.table.stats.CharacterChunkedStats; +import io.deephaven.server.table.stats.ChunkedNumericalStatsKernel; +import io.deephaven.server.table.stats.ChunkedStatsKernel; +import io.deephaven.server.table.stats.DateTimeChunkedStats; +import io.deephaven.server.table.stats.ObjectChunkedStats; +import io.deephaven.util.type.TypeUtils; +import org.apache.commons.lang3.mutable.Mutable; +import org.apache.commons.lang3.mutable.MutableObject; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.time.Instant; +import java.time.ZonedDateTime; +import java.util.List; + +@Singleton +public class ColumnStatisticsGrpcImpl extends GrpcTableOperation { + /** Default number of unique values to collect from a column. */ + private static final int DEFAULT_UNIQUE_LIMIT = + Configuration.getInstance().getIntegerWithDefault("ColumnStatistics.defaultUniqueLimit", 20); + /** Maximum number of unique values to let a client request. */ + private static final int MAX_UNIQUE_LIMIT = + Configuration.getInstance().getIntegerWithDefault("ColumnStatistics.maxUniqueLimit", 200); + /** + * Maximum number of unique values to collect before falling back and only collecting the count, not the most common + * values + */ + private static final int MAX_UNIQUE_TO_COLLECT = + Configuration.getInstance().getIntegerWithDefault("ColumnStatistics.maxUniqueToCollect", 1_000_000); + + @Inject + public ColumnStatisticsGrpcImpl(final TableServiceContextualAuthWiring authWiring) { + super(authWiring::checkPermissionComputeColumnStatistics, BatchTableRequest.Operation::getColumnStatistics, + ColumnStatisticsRequest::getResultId, ColumnStatisticsRequest::getSourceId); + } + + @Override + public Table create(ColumnStatisticsRequest request, List> sourceTables) { + Table table = sourceTables.get(0).get().coalesce(); + String columnName = request.getColumnName(); + ColumnDefinition column = table.getDefinition().getColumn(columnName); + if (column == null) { + throw Exceptions.statusRuntimeException(Code.INVALID_ARGUMENT, + "Table doesn't have a column with the specified name"); + } + final Class type = column.getDataType(); + + // Based on the column type, make a stats function and get a column source + final ChunkedStatsKernel statsFunc; + final ColumnSource columnSource; + if (TypeUtils.isDateTime(type)) { + // Instant/ZonedDateTime only look at max/min and count + statsFunc = new DateTimeChunkedStats(); + + // Reinterpret the column to read only long values + if (Instant.class.isAssignableFrom(type)) { + columnSource = ReinterpretUtils.instantToLongSource(table.getColumnSource(columnName)); + } else if (ZonedDateTime.class.isAssignableFrom(type)) { + columnSource = ReinterpretUtils.zonedDateTimeToLongSource(table.getColumnSource(columnName)); + } else { + throw Exceptions.statusRuntimeException(Code.INVALID_ARGUMENT, + "DateTime columns must be Instant or ZonedDateTime"); + } + } else if (TypeUtils.isNumeric(type)) { + // Numeric types have a variety of statistics recorded + statsFunc = ChunkedNumericalStatsKernel.makeChunkedNumericalStats(type); + columnSource = table.getColumnSource(columnName); + } else { + // For remaining types the best we can do is count/track unique values in the column + final int maxUnique; + if (request.hasUniqueValueLimit()) { + maxUnique = Math.min(request.getUniqueValueLimit(), MAX_UNIQUE_LIMIT); + } else { + maxUnique = DEFAULT_UNIQUE_LIMIT; + } + if (type == Character.class || type == char.class) { + statsFunc = new CharacterChunkedStats(MAX_UNIQUE_TO_COLLECT, maxUnique); + } else { + statsFunc = new ObjectChunkedStats(MAX_UNIQUE_TO_COLLECT, maxUnique); + } + columnSource = table.getColumnSource(columnName); + } + + // Execute the function in a snapshot + final Mutable
resultHolder = new MutableObject<>(); + ConstructSnapshot.callDataSnapshotFunction("GenerateColumnStats()", + ConstructSnapshot.makeSnapshotControl(false, table.isRefreshing(), (NotificationStepSource) table), + (usePrev, beforeClockValue) -> { + final RowSet rowSet = usePrev ? table.getRowSet().prev() : table.getRowSet(); + resultHolder.setValue(statsFunc.processChunks(rowSet, columnSource, usePrev)); + return true; + }); + return resultHolder.getValue(); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/ops/TableServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/table/ops/TableServiceGrpcImpl.java index 16d41bfef6f..0d6ec180a91 100644 --- a/server/src/main/java/io/deephaven/server/table/ops/TableServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/table/ops/TableServiceGrpcImpl.java @@ -18,6 +18,7 @@ import io.deephaven.proto.backplane.grpc.BatchTableRequest; import io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation; import io.deephaven.proto.backplane.grpc.BatchTableRequest.Operation.OpCase; +import io.deephaven.proto.backplane.grpc.ColumnStatisticsRequest; import io.deephaven.proto.backplane.grpc.ComboAggregateRequest; import io.deephaven.proto.backplane.grpc.CreateInputTableRequest; import io.deephaven.proto.backplane.grpc.CrossJoinTablesRequest; @@ -472,6 +473,12 @@ public void seekRow( }); } + @Override + public void computeColumnStatistics(ColumnStatisticsRequest request, + StreamObserver responseObserver) { + oneShotOperationWrapper(BatchTableRequest.Operation.OpCase.COLUMN_STATISTICS, request, responseObserver); + } + @Override public void batch( @NotNull final BatchTableRequest request, diff --git a/server/src/main/java/io/deephaven/server/table/stats/BigDecimalChunkedNumericalStats.java b/server/src/main/java/io/deephaven/server/table/stats/BigDecimalChunkedNumericalStats.java new file mode 100644 index 00000000000..d365e9f693b --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/BigDecimalChunkedNumericalStats.java @@ -0,0 +1,106 @@ +package io.deephaven.server.table.stats; + +import io.deephaven.chunk.ObjectChunk; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.configuration.Configuration; +import io.deephaven.engine.rowset.RowSequence; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.table.impl.util.ColumnHolder; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.BigDecimalUtils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class BigDecimalChunkedNumericalStats implements ChunkedNumericalStatsKernel { + private final static int SCALE = + Configuration.getInstance().getIntegerWithDefault("BigDecimalStdOperator.scale", 10); + + private long count = 0; + + private BigDecimal sum = BigDecimal.ZERO; + private BigDecimal absSum = BigDecimal.ZERO; + private BigDecimal sqrdSum = BigDecimal.ZERO; + + private BigDecimal min = null; + private BigDecimal max = null; + private BigDecimal absMin = null; + private BigDecimal absMax = null; + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + + try (final ChunkSource.GetContext getContext = columnSource.makeGetContext(CHUNK_SIZE)) { + final RowSequence.Iterator rsIt = rowSet.getRowSequenceIterator(); + + while (rsIt.hasMore()) { + final RowSequence nextKeys = rsIt.getNextRowSequenceWithLength(CHUNK_SIZE); + final ObjectChunk chunk = + (usePrev ? columnSource.getPrevChunk(getContext, nextKeys) + : columnSource.getChunk(getContext, nextKeys)).asObjectChunk(); + + final int chunkSize = chunk.size(); + for (int ii = 0; ii < chunkSize; ii++) { + final BigDecimal val = chunk.get(ii); + + if (val == null) { + continue; + } + + final BigDecimal absVal = val.abs(); + + if (count == 0) { + min = max = val; + absMax = absMin = absVal; + } else { + if (val.compareTo(min) < 0) { + min = val; + } + + if (val.compareTo(max) > 0) { + max = val; + } + + if (absVal.compareTo(absMin) < 0) { + absMin = absVal; + } + + if (absVal.compareTo(absMax) > 0) { + absMax = absVal; + } + } + + count++; + + sum = sum.add(val); + absSum = absSum.add(absVal); + sqrdSum = sqrdSum.add(absVal.multiply(absVal)); + } + } + } + + BigDecimal c = BigDecimal.valueOf(count); + BigDecimal avg = count == 0 ? null : sum.divide(c, SCALE, RoundingMode.HALF_UP); + BigDecimal absAvg = count == 0 ? null : absSum.divide(c, SCALE, RoundingMode.HALF_UP); + BigDecimal stdDev = count <= 1 ? null + : BigDecimalUtils.sqrt((sqrdSum.subtract(avg.pow(2).multiply(c))) + .divide(BigDecimal.valueOf(count - 1), SCALE, RoundingMode.HALF_UP), SCALE); + + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + new ColumnHolder<>("SUM", BigDecimal.class, null, false, sum), + new ColumnHolder<>("SUM_ABS", BigDecimal.class, null, false, absSum), + new ColumnHolder<>("SUM_SQRD", BigDecimal.class, null, false, sqrdSum), + new ColumnHolder<>("MIN", BigDecimal.class, null, false, min), + new ColumnHolder<>("MAX", BigDecimal.class, null, false, max), + new ColumnHolder<>("MIN_ABS", BigDecimal.class, null, false, absMin), + new ColumnHolder<>("MAX_ABS", BigDecimal.class, null, false, absMax), + new ColumnHolder<>("AVG", BigDecimal.class, null, false, avg), + new ColumnHolder<>("AVG_ABS", BigDecimal.class, null, false, absAvg), + new ColumnHolder<>("STD_DEV", BigDecimal.class, null, false, stdDev)); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/BigIntegerChunkedNumericalStats.java b/server/src/main/java/io/deephaven/server/table/stats/BigIntegerChunkedNumericalStats.java new file mode 100644 index 00000000000..df9c735fc6b --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/BigIntegerChunkedNumericalStats.java @@ -0,0 +1,107 @@ +package io.deephaven.server.table.stats; + +import io.deephaven.chunk.ObjectChunk; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.configuration.Configuration; +import io.deephaven.engine.rowset.RowSequence; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.table.impl.util.ColumnHolder; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.BigDecimalUtils; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; + +public class BigIntegerChunkedNumericalStats implements ChunkedNumericalStatsKernel { + private final static int SCALE = + Configuration.getInstance().getIntegerWithDefault("BigDecimalStdOperator.scale", 10); + + private long count = 0; + + private BigInteger sum = BigInteger.ZERO; + private BigInteger absSum = BigInteger.ZERO; + private BigInteger sqrdSum = BigInteger.ZERO; + + private BigInteger min = null; + private BigInteger max = null; + private BigInteger absMin = null; + private BigInteger absMax = null; + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + + try (final ChunkSource.GetContext getContext = columnSource.makeGetContext(CHUNK_SIZE)) { + final RowSequence.Iterator rsIt = rowSet.getRowSequenceIterator(); + + while (rsIt.hasMore()) { + final RowSequence nextKeys = rsIt.getNextRowSequenceWithLength(CHUNK_SIZE); + final ObjectChunk chunk = + (usePrev ? columnSource.getPrevChunk(getContext, nextKeys) + : columnSource.getChunk(getContext, nextKeys)).asObjectChunk(); + + final int chunkSize = chunk.size(); + for (int ii = 0; ii < chunkSize; ii++) { + final BigInteger val = chunk.get(ii); + + if (val == null) { + continue; + } + + final BigInteger absVal = val.abs(); + + if (count == 0) { + min = max = val; + absMax = absMin = absVal; + } else { + if (val.compareTo(min) < 0) { + min = val; + } + + if (val.compareTo(max) > 0) { + max = val; + } + + if (absVal.compareTo(absMin) < 0) { + absMin = absVal; + } + + if (absVal.compareTo(absMax) > 0) { + absMax = absVal; + } + } + + count++; + + sum = sum.add(val); + absSum = absSum.add(absVal); + sqrdSum = sqrdSum.add(absVal.multiply(absVal)); + } + } + } + + BigDecimal c = BigDecimal.valueOf(count); + BigDecimal avg = count == 0 ? null : new BigDecimal(sum).divide(c, SCALE, RoundingMode.HALF_UP); + BigDecimal absAvg = count == 0 ? null : new BigDecimal(absSum).divide(c, SCALE, RoundingMode.HALF_UP); + BigDecimal stdDev = count <= 1 ? null + : BigDecimalUtils.sqrt((new BigDecimal(sqrdSum).subtract(avg.pow(2).multiply(c))) + .divide(BigDecimal.valueOf(count - 1), SCALE, RoundingMode.HALF_UP), SCALE); + + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + new ColumnHolder<>("SUM", BigInteger.class, null, false, sum), + new ColumnHolder<>("SUM_ABS", BigInteger.class, null, false, absSum), + new ColumnHolder<>("SUM_SQRD", BigInteger.class, null, false, sqrdSum), + new ColumnHolder<>("MIN", BigInteger.class, null, false, min), + new ColumnHolder<>("MAX", BigInteger.class, null, false, max), + new ColumnHolder<>("MIN_ABS", BigInteger.class, null, false, absMin), + new ColumnHolder<>("MAX_ABS", BigInteger.class, null, false, absMax), + new ColumnHolder<>("AVG", BigDecimal.class, null, false, avg), + new ColumnHolder<>("AVG_ABS", BigDecimal.class, null, false, absAvg), + new ColumnHolder<>("STD_DEV", BigDecimal.class, null, false, stdDev)); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/ByteChunkedNumericalStats.java b/server/src/main/java/io/deephaven/server/table/stats/ByteChunkedNumericalStats.java new file mode 100644 index 00000000000..5c6c09415dc --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/ByteChunkedNumericalStats.java @@ -0,0 +1,161 @@ +/* + * --------------------------------------------------------------------------------------------------------------------- + * AUTO-GENERATED CLASS - DO NOT EDIT MANUALLY - for any changes edit ShortChunkedNumericalStats and regenerate + * --------------------------------------------------------------------------------------------------------------------- + */ +package io.deephaven.server.table.stats; + +import io.deephaven.chunk.ByteChunk; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.engine.rowset.RowSequence; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.QueryConstants; + +public class ByteChunkedNumericalStats implements ChunkedNumericalStatsKernel { + private long count = 0; + + private long sum = 0; + private boolean useFloatingSum = false; + private double floatingSum = .0; + + private long absSum = 0; + private boolean useFloatingAbsSum = false; + private double floatingAbsSum = .0; + + private long sumOfSquares = 0; + private boolean useFloatingSumOfSquares = false; + private double floatingSumOfSquares = .0; + + private byte min = QueryConstants.NULL_BYTE; + private byte max = QueryConstants.NULL_BYTE; + private byte absMin = QueryConstants.NULL_BYTE; + private byte absMax = QueryConstants.NULL_BYTE; + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + + try (final ChunkSource.GetContext getContext = columnSource.makeGetContext(CHUNK_SIZE)) { + final RowSequence.Iterator rsIt = rowSet.getRowSequenceIterator(); + + while (rsIt.hasMore()) { + final RowSequence nextKeys = rsIt.getNextRowSequenceWithLength(CHUNK_SIZE); + final ByteChunk chunk = (usePrev ? columnSource.getPrevChunk(getContext, nextKeys) + : columnSource.getChunk(getContext, nextKeys)).asByteChunk(); + + /* + * we'll use these to get as big as we can before adding into a potentially MUCH larger "total" in an + * attempt to reduce cumulative loss-of-precision error brought on by floating-point math; - but ONLY if + * we've overflowed our non-floating-point (long) + */ + double chunkedOverflowSum = .0; + double chunkedOverflowAbsSum = .0; + double chunkedOverflowSumOfSquares = .0; + + final int chunkSize = chunk.size(); + for (int ii = 0; ii < chunkSize; ii++) { + final byte val = chunk.get(ii); + + if (val == QueryConstants.NULL_BYTE) { + continue; + } + + final byte absVal = (byte) Math.abs(val); + + if (count == 0) { + min = max = val; + absMax = absMin = absVal; + } else { + if (val < min) { + min = val; + } + + if (val > max) { + max = val; + } + + if (absVal < absMin) { + absMin = absVal; + } + + if (absVal > absMax) { + absMax = absVal; + } + } + + count++; + + if (!useFloatingSum) { + try { + sum = Math.addExact(sum, val); + } catch (final ArithmeticException ae) { + useFloatingSum = true; + floatingSum = sum; + chunkedOverflowSum = val; + } + } else { + chunkedOverflowSum += val; + } + + if (!useFloatingAbsSum) { + try { + absSum = Math.addExact(absSum, absVal); + } catch (final ArithmeticException ae) { + useFloatingAbsSum = true; + floatingAbsSum = absSum; + chunkedOverflowAbsSum = absVal; + } + } else { + chunkedOverflowAbsSum += absVal; + } + + if (!useFloatingSumOfSquares) { + try { + sumOfSquares = Math.addExact(sumOfSquares, Math.multiplyExact(val, val)); + } catch (final ArithmeticException ae) { + useFloatingSumOfSquares = true; + floatingSumOfSquares = sumOfSquares; + chunkedOverflowSumOfSquares = Math.pow(val, 2); + } + + } else { + chunkedOverflowSumOfSquares += Math.pow(val, 2); + } + } + + if (useFloatingSum) { + floatingSum += chunkedOverflowSum; + } + + if (useFloatingAbsSum) { + floatingAbsSum += chunkedOverflowAbsSum; + } + + if (useFloatingSumOfSquares) { + floatingSumOfSquares += chunkedOverflowSumOfSquares; + } + } + } + + double avg = avg(count, useFloatingSum ? floatingSum : sum); + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + useFloatingSum ? TableTools.doubleCol("SUM", floatingSum) : TableTools.longCol("SUM", sum), + useFloatingAbsSum ? TableTools.doubleCol("SUM_ABS", floatingAbsSum) + : TableTools.longCol("SUM_ABS", absSum), + useFloatingSumOfSquares ? TableTools.doubleCol("SQRD_SUM", floatingSumOfSquares) + : TableTools.longCol("SUM_SQRD", sumOfSquares), + TableTools.byteCol("MIN", min), + TableTools.byteCol("MAX", max), + TableTools.byteCol("MIN_ABS", absMin), + TableTools.byteCol("MAX_ABS", absMax), + TableTools.doubleCol("AVG", avg), + TableTools.doubleCol("AVG_ABS", avg(count, absSum)), + TableTools.doubleCol("STD_DEV", stdDev(count, useFloatingSum ? floatingSum : sum, + useFloatingSumOfSquares ? floatingSumOfSquares : sumOfSquares))); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/CharacterChunkedStats.java b/server/src/main/java/io/deephaven/server/table/stats/CharacterChunkedStats.java new file mode 100644 index 00000000000..b9273a50247 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/CharacterChunkedStats.java @@ -0,0 +1,101 @@ +package io.deephaven.server.table.stats; + +import gnu.trove.map.TCharLongMap; +import gnu.trove.map.hash.TCharLongHashMap; +import gnu.trove.set.TCharSet; +import gnu.trove.set.hash.TCharHashSet; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.table.impl.util.ColumnHolder; +import io.deephaven.engine.table.iterators.CharacterColumnIterator; +import io.deephaven.engine.table.iterators.ChunkedCharacterColumnIterator; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.QueryConstants; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class CharacterChunkedStats implements ChunkedStatsKernel { + private final int maxUniqueToCollect; + private final int maxUniqueToDisplay; + + public CharacterChunkedStats(int maxUniqueToCollect, int maxUniqueToDisplay) { + this.maxUniqueToCollect = maxUniqueToCollect; + this.maxUniqueToDisplay = maxUniqueToDisplay; + } + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + long count = 0; + int uniqueCount = 0; + + final TCharLongMap countValues = new TCharLongHashMap(); + boolean useSet = false; + final TCharSet uniqueValues = new TCharHashSet(); + + try (CharacterColumnIterator iterator = + new ChunkedCharacterColumnIterator(usePrev ? columnSource.getPrevSource() : columnSource, rowSet)) { + while (iterator.hasNext()) { + char val = iterator.nextChar(); + if (val == QueryConstants.NULL_CHAR) { + continue; + } + count++; + + if (countValues.adjustOrPutValue(val, 1, 1) == 1 && ++uniqueCount > maxUniqueToCollect) { + // we no longer want to track counts for these items; fall back to a Set to get at least a count + uniqueValues.addAll(countValues.keySet()); + countValues.clear(); + useSet = true; + break; + } + } + while (iterator.hasNext()) { + // items still remain, count non-nulls and uniques + char val = iterator.nextChar(); + if (val == QueryConstants.NULL_CHAR) { + continue; + } + count++; + + uniqueValues.add(val); + } + } + + + if (useSet) { + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + TableTools.intCol("UNIQUE_VALUES", uniqueValues.size())); + } + List> sorted = new ArrayList<>(countValues.size()); + + countValues.forEachEntry((o, c) -> { + sorted.add(Map.entry(Objects.toString(o), c)); + return true; + }); + sorted.sort(Map.Entry.comparingByValue().reversed()); + + int resultCount = Math.min(maxUniqueToDisplay, sorted.size()); + String[] uniqueKeys = new String[resultCount]; + long[] uniqueCounts = new long[resultCount]; + Iterator> iter = sorted.iterator(); + for (int i = 0; i < resultCount; i++) { + Map.Entry entry = iter.next(); + uniqueKeys[i] = entry.getKey(); + uniqueCounts[i] = entry.getValue(); + } + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + TableTools.intCol("UNIQUE_VALUES", countValues.size()), + new ColumnHolder<>("UNIQUE_KEYS", String[].class, String.class, false, uniqueKeys), + new ColumnHolder<>("UNIQUE_COUNTS", long[].class, long.class, false, uniqueCounts)); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/ChunkedNumericalStatsKernel.java b/server/src/main/java/io/deephaven/server/table/stats/ChunkedNumericalStatsKernel.java new file mode 100644 index 00000000000..1163984ab1c --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/ChunkedNumericalStatsKernel.java @@ -0,0 +1,49 @@ +package io.deephaven.server.table.stats; + +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.util.QueryConstants; + +import java.math.BigDecimal; +import java.math.BigInteger; + +public interface ChunkedNumericalStatsKernel extends ChunkedStatsKernel { + + static ChunkedNumericalStatsKernel makeChunkedNumericalStats(final Class type) { + if (type == Byte.class || type == byte.class) { + return new ByteChunkedNumericalStats(); + } else if (type == Short.class || type == short.class) { + return new ShortChunkedNumericalStats(); + } else if (type == Integer.class || type == int.class) { + return new IntegerChunkedNumericalStats(); + } else if (type == Long.class || type == long.class) { + return new LongChunkedNumericalStats(); + } else if (type == Float.class || type == float.class) { + return new FloatChunkedNumericalStats(); + } else if (type == Double.class || type == double.class) { + return new DoubleChunkedNumericalStats(); + } else if (type == BigInteger.class) { + return new BigIntegerChunkedNumericalStats(); + } else if (type == BigDecimal.class) { + return new BigDecimalChunkedNumericalStats(); + } else { + throw new IllegalStateException( + "Invalid type for ChunkedNumericalStatsKernel: " + type.getCanonicalName()); + } + } + + default double avg(long count, double sumValue) { + if (count == 0) { + return QueryConstants.NULL_DOUBLE; + } + return sumValue / count; + } + + default double stdDev(long count, double sum, double sumOfSquares) { + if (count <= 1) { + return QueryConstants.NULL_DOUBLE; + } + return Math.sqrt((sumOfSquares - sum * sum / count) / (count - 1)); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/ChunkedStatsKernel.java b/server/src/main/java/io/deephaven/server/table/stats/ChunkedStatsKernel.java new file mode 100644 index 00000000000..32dfed978f1 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/ChunkedStatsKernel.java @@ -0,0 +1,14 @@ +package io.deephaven.server.table.stats; + +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; + +/** + * A function ready to be run in a snapshot, to collect data about a table column. + */ +public interface ChunkedStatsKernel { + int CHUNK_SIZE = 2048; + + Table processChunks(RowSet rowSet, ColumnSource columnSource, boolean usePrev); +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/DateTimeChunkedStats.java b/server/src/main/java/io/deephaven/server/table/stats/DateTimeChunkedStats.java new file mode 100644 index 00000000000..898c4a6f1db --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/DateTimeChunkedStats.java @@ -0,0 +1,54 @@ +package io.deephaven.server.table.stats; + +import io.deephaven.chunk.LongChunk; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.engine.rowset.RowSequence; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.table.iterators.ChunkedLongColumnIterator; +import io.deephaven.engine.table.iterators.LongColumnIterator; +import io.deephaven.engine.util.TableTools; +import io.deephaven.time.DateTimeUtils; +import io.deephaven.util.QueryConstants; + +public class DateTimeChunkedStats implements ChunkedStatsKernel { + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + long count = 0; + + long min = QueryConstants.NULL_LONG; + long max = QueryConstants.NULL_LONG; + + try (LongColumnIterator iterator = + new ChunkedLongColumnIterator(usePrev ? columnSource.getPrevSource() : columnSource, rowSet)) { + while (iterator.hasNext()) { + long val = iterator.nextLong(); + + if (val == QueryConstants.NULL_LONG) { + continue; + } + + if (count == 0) { + min = max = val; + } else { + if (val < min) { + min = val; + } + + if (val > max) { + max = val; + } + } + + count++; + } + } + + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + TableTools.instantCol("MIN", DateTimeUtils.epochNanosToInstant(min)), + TableTools.instantCol("MAX", DateTimeUtils.epochNanosToInstant(max))); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/DoubleChunkedNumericalStats.java b/server/src/main/java/io/deephaven/server/table/stats/DoubleChunkedNumericalStats.java new file mode 100644 index 00000000000..1a2cc7dff62 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/DoubleChunkedNumericalStats.java @@ -0,0 +1,108 @@ +/* + * --------------------------------------------------------------------------------------------------------------------- + * AUTO-GENERATED CLASS - DO NOT EDIT MANUALLY - for any changes edit FloatChunkedNumericalStats and regenerate + * --------------------------------------------------------------------------------------------------------------------- + */ +package io.deephaven.server.table.stats; + +import io.deephaven.chunk.DoubleChunk; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.engine.rowset.RowSequence; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.QueryConstants; + +public class DoubleChunkedNumericalStats implements ChunkedNumericalStatsKernel { + private long count = 0; + + private double sum = .0; + private double absSum = .0; + private double sumOfSquares = .0; + + private double min = QueryConstants.NULL_DOUBLE; + private double max = QueryConstants.NULL_DOUBLE; + private double absMin = QueryConstants.NULL_DOUBLE; + private double absMax = QueryConstants.NULL_DOUBLE; + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + + try (final ChunkSource.GetContext getContext = columnSource.makeGetContext(CHUNK_SIZE)) { + final RowSequence.Iterator rsIt = rowSet.getRowSequenceIterator(); + + while (rsIt.hasMore()) { + final RowSequence nextKeys = rsIt.getNextRowSequenceWithLength(CHUNK_SIZE); + final DoubleChunk chunk = (usePrev ? columnSource.getPrevChunk(getContext, nextKeys) + : columnSource.getChunk(getContext, nextKeys)).asDoubleChunk(); + + /* + * we'll use these to get as big as we can before adding into a potentially MUCH larger "total" in an + * attempt to reduce cumulative loss-of-precision error brought on by FP math. + */ + double chunkedSum = .0; + double chunkedAbsSum = .0; + double chunkedSumOfSquares = .0; + + final int chunkSize = chunk.size(); + for (int ii = 0; ii < chunkSize; ii++) { + final double val = chunk.get(ii); + + if (val == QueryConstants.NULL_DOUBLE) { + continue; + } + + final double absVal = Math.abs(val); + + if (count == 0) { + min = max = val; + absMax = absMin = absVal; + } else { + if (val < min) { + min = val; + } + + if (val > max) { + max = val; + } + + if (absVal < absMin) { + absMin = absVal; + } + + if (absVal > absMax) { + absMax = absVal; + } + } + + count++; + + chunkedSum += val; + chunkedAbsSum += absVal; + chunkedSumOfSquares += (double) val * (double) val; + } + + sum += chunkedSum; + absSum += chunkedAbsSum; + sumOfSquares += chunkedSumOfSquares; + } + } + + double avg = avg(count, sum); + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + TableTools.doubleCol("SUM", sum), + TableTools.doubleCol("SUM_ABS", absSum), + TableTools.doubleCol("SUM_SQRD", sumOfSquares), + TableTools.doubleCol("MIN", min), + TableTools.doubleCol("MAX", max), + TableTools.doubleCol("MIN_ABS", absMin), + TableTools.doubleCol("MAX_ABS", absMax), + TableTools.doubleCol("AVG", avg), + TableTools.doubleCol("AVG_ABS", avg(count, absSum)), + TableTools.doubleCol("STD_DEV", stdDev(count, sum, sumOfSquares))); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/FloatChunkedNumericalStats.java b/server/src/main/java/io/deephaven/server/table/stats/FloatChunkedNumericalStats.java new file mode 100644 index 00000000000..39eb031f6f0 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/FloatChunkedNumericalStats.java @@ -0,0 +1,103 @@ +package io.deephaven.server.table.stats; + +import io.deephaven.chunk.FloatChunk; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.engine.rowset.RowSequence; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.QueryConstants; + +public class FloatChunkedNumericalStats implements ChunkedNumericalStatsKernel { + private long count = 0; + + private double sum = .0; + private double absSum = .0; + private double sumOfSquares = .0; + + private float min = QueryConstants.NULL_FLOAT; + private float max = QueryConstants.NULL_FLOAT; + private float absMin = QueryConstants.NULL_FLOAT; + private float absMax = QueryConstants.NULL_FLOAT; + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + + try (final ChunkSource.GetContext getContext = columnSource.makeGetContext(CHUNK_SIZE)) { + final RowSequence.Iterator rsIt = rowSet.getRowSequenceIterator(); + + while (rsIt.hasMore()) { + final RowSequence nextKeys = rsIt.getNextRowSequenceWithLength(CHUNK_SIZE); + final FloatChunk chunk = (usePrev ? columnSource.getPrevChunk(getContext, nextKeys) + : columnSource.getChunk(getContext, nextKeys)).asFloatChunk(); + + /* + * we'll use these to get as big as we can before adding into a potentially MUCH larger "total" in an + * attempt to reduce cumulative loss-of-precision error brought on by FP math. + */ + double chunkedSum = .0; + double chunkedAbsSum = .0; + double chunkedSumOfSquares = .0; + + final int chunkSize = chunk.size(); + for (int ii = 0; ii < chunkSize; ii++) { + final float val = chunk.get(ii); + + if (val == QueryConstants.NULL_FLOAT) { + continue; + } + + final float absVal = Math.abs(val); + + if (count == 0) { + min = max = val; + absMax = absMin = absVal; + } else { + if (val < min) { + min = val; + } + + if (val > max) { + max = val; + } + + if (absVal < absMin) { + absMin = absVal; + } + + if (absVal > absMax) { + absMax = absVal; + } + } + + count++; + + chunkedSum += val; + chunkedAbsSum += absVal; + chunkedSumOfSquares += (double) val * (double) val; + } + + sum += chunkedSum; + absSum += chunkedAbsSum; + sumOfSquares += chunkedSumOfSquares; + } + } + + double avg = avg(count, sum); + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + TableTools.doubleCol("SUM", sum), + TableTools.doubleCol("SUM_ABS", absSum), + TableTools.doubleCol("SUM_SQRD", sumOfSquares), + TableTools.floatCol("MIN", min), + TableTools.floatCol("MAX", max), + TableTools.floatCol("MIN_ABS", absMin), + TableTools.floatCol("MAX_ABS", absMax), + TableTools.doubleCol("AVG", avg), + TableTools.doubleCol("AVG_ABS", avg(count, absSum)), + TableTools.doubleCol("STD_DEV", stdDev(count, sum, sumOfSquares))); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/IntegerChunkedNumericalStats.java b/server/src/main/java/io/deephaven/server/table/stats/IntegerChunkedNumericalStats.java new file mode 100644 index 00000000000..4cdf3a3b910 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/IntegerChunkedNumericalStats.java @@ -0,0 +1,161 @@ +/* + * --------------------------------------------------------------------------------------------------------------------- + * AUTO-GENERATED CLASS - DO NOT EDIT MANUALLY - for any changes edit ShortChunkedNumericalStats and regenerate + * --------------------------------------------------------------------------------------------------------------------- + */ +package io.deephaven.server.table.stats; + +import io.deephaven.chunk.IntChunk; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.engine.rowset.RowSequence; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.QueryConstants; + +public class IntegerChunkedNumericalStats implements ChunkedNumericalStatsKernel { + private long count = 0; + + private long sum = 0; + private boolean useFloatingSum = false; + private double floatingSum = .0; + + private long absSum = 0; + private boolean useFloatingAbsSum = false; + private double floatingAbsSum = .0; + + private long sumOfSquares = 0; + private boolean useFloatingSumOfSquares = false; + private double floatingSumOfSquares = .0; + + private int min = QueryConstants.NULL_INT; + private int max = QueryConstants.NULL_INT; + private int absMin = QueryConstants.NULL_INT; + private int absMax = QueryConstants.NULL_INT; + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + + try (final ChunkSource.GetContext getContext = columnSource.makeGetContext(CHUNK_SIZE)) { + final RowSequence.Iterator rsIt = rowSet.getRowSequenceIterator(); + + while (rsIt.hasMore()) { + final RowSequence nextKeys = rsIt.getNextRowSequenceWithLength(CHUNK_SIZE); + final IntChunk chunk = (usePrev ? columnSource.getPrevChunk(getContext, nextKeys) + : columnSource.getChunk(getContext, nextKeys)).asIntChunk(); + + /* + * we'll use these to get as big as we can before adding into a potentially MUCH larger "total" in an + * attempt to reduce cumulative loss-of-precision error brought on by floating-point math; - but ONLY if + * we've overflowed our non-floating-point (long) + */ + double chunkedOverflowSum = .0; + double chunkedOverflowAbsSum = .0; + double chunkedOverflowSumOfSquares = .0; + + final int chunkSize = chunk.size(); + for (int ii = 0; ii < chunkSize; ii++) { + final int val = chunk.get(ii); + + if (val == QueryConstants.NULL_INT) { + continue; + } + + final int absVal = (int) Math.abs(val); + + if (count == 0) { + min = max = val; + absMax = absMin = absVal; + } else { + if (val < min) { + min = val; + } + + if (val > max) { + max = val; + } + + if (absVal < absMin) { + absMin = absVal; + } + + if (absVal > absMax) { + absMax = absVal; + } + } + + count++; + + if (!useFloatingSum) { + try { + sum = Math.addExact(sum, val); + } catch (final ArithmeticException ae) { + useFloatingSum = true; + floatingSum = sum; + chunkedOverflowSum = val; + } + } else { + chunkedOverflowSum += val; + } + + if (!useFloatingAbsSum) { + try { + absSum = Math.addExact(absSum, absVal); + } catch (final ArithmeticException ae) { + useFloatingAbsSum = true; + floatingAbsSum = absSum; + chunkedOverflowAbsSum = absVal; + } + } else { + chunkedOverflowAbsSum += absVal; + } + + if (!useFloatingSumOfSquares) { + try { + sumOfSquares = Math.addExact(sumOfSquares, Math.multiplyExact(val, val)); + } catch (final ArithmeticException ae) { + useFloatingSumOfSquares = true; + floatingSumOfSquares = sumOfSquares; + chunkedOverflowSumOfSquares = Math.pow(val, 2); + } + + } else { + chunkedOverflowSumOfSquares += Math.pow(val, 2); + } + } + + if (useFloatingSum) { + floatingSum += chunkedOverflowSum; + } + + if (useFloatingAbsSum) { + floatingAbsSum += chunkedOverflowAbsSum; + } + + if (useFloatingSumOfSquares) { + floatingSumOfSquares += chunkedOverflowSumOfSquares; + } + } + } + + double avg = avg(count, useFloatingSum ? floatingSum : sum); + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + useFloatingSum ? TableTools.doubleCol("SUM", floatingSum) : TableTools.longCol("SUM", sum), + useFloatingAbsSum ? TableTools.doubleCol("SUM_ABS", floatingAbsSum) + : TableTools.longCol("SUM_ABS", absSum), + useFloatingSumOfSquares ? TableTools.doubleCol("SQRD_SUM", floatingSumOfSquares) + : TableTools.longCol("SUM_SQRD", sumOfSquares), + TableTools.intCol("MIN", min), + TableTools.intCol("MAX", max), + TableTools.intCol("MIN_ABS", absMin), + TableTools.intCol("MAX_ABS", absMax), + TableTools.doubleCol("AVG", avg), + TableTools.doubleCol("AVG_ABS", avg(count, absSum)), + TableTools.doubleCol("STD_DEV", stdDev(count, useFloatingSum ? floatingSum : sum, + useFloatingSumOfSquares ? floatingSumOfSquares : sumOfSquares))); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/LongChunkedNumericalStats.java b/server/src/main/java/io/deephaven/server/table/stats/LongChunkedNumericalStats.java new file mode 100644 index 00000000000..97eef2fd464 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/LongChunkedNumericalStats.java @@ -0,0 +1,161 @@ +/* + * --------------------------------------------------------------------------------------------------------------------- + * AUTO-GENERATED CLASS - DO NOT EDIT MANUALLY - for any changes edit ShortChunkedNumericalStats and regenerate + * --------------------------------------------------------------------------------------------------------------------- + */ +package io.deephaven.server.table.stats; + +import io.deephaven.chunk.LongChunk; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.engine.rowset.RowSequence; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.QueryConstants; + +public class LongChunkedNumericalStats implements ChunkedNumericalStatsKernel { + private long count = 0; + + private long sum = 0; + private boolean useFloatingSum = false; + private double floatingSum = .0; + + private long absSum = 0; + private boolean useFloatingAbsSum = false; + private double floatingAbsSum = .0; + + private long sumOfSquares = 0; + private boolean useFloatingSumOfSquares = false; + private double floatingSumOfSquares = .0; + + private long min = QueryConstants.NULL_LONG; + private long max = QueryConstants.NULL_LONG; + private long absMin = QueryConstants.NULL_LONG; + private long absMax = QueryConstants.NULL_LONG; + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + + try (final ChunkSource.GetContext getContext = columnSource.makeGetContext(CHUNK_SIZE)) { + final RowSequence.Iterator rsIt = rowSet.getRowSequenceIterator(); + + while (rsIt.hasMore()) { + final RowSequence nextKeys = rsIt.getNextRowSequenceWithLength(CHUNK_SIZE); + final LongChunk chunk = (usePrev ? columnSource.getPrevChunk(getContext, nextKeys) + : columnSource.getChunk(getContext, nextKeys)).asLongChunk(); + + /* + * we'll use these to get as big as we can before adding into a potentially MUCH larger "total" in an + * attempt to reduce cumulative loss-of-precision error brought on by floating-point math; - but ONLY if + * we've overflowed our non-floating-point (long) + */ + double chunkedOverflowSum = .0; + double chunkedOverflowAbsSum = .0; + double chunkedOverflowSumOfSquares = .0; + + final int chunkSize = chunk.size(); + for (int ii = 0; ii < chunkSize; ii++) { + final long val = chunk.get(ii); + + if (val == QueryConstants.NULL_LONG) { + continue; + } + + final long absVal = (long) Math.abs(val); + + if (count == 0) { + min = max = val; + absMax = absMin = absVal; + } else { + if (val < min) { + min = val; + } + + if (val > max) { + max = val; + } + + if (absVal < absMin) { + absMin = absVal; + } + + if (absVal > absMax) { + absMax = absVal; + } + } + + count++; + + if (!useFloatingSum) { + try { + sum = Math.addExact(sum, val); + } catch (final ArithmeticException ae) { + useFloatingSum = true; + floatingSum = sum; + chunkedOverflowSum = val; + } + } else { + chunkedOverflowSum += val; + } + + if (!useFloatingAbsSum) { + try { + absSum = Math.addExact(absSum, absVal); + } catch (final ArithmeticException ae) { + useFloatingAbsSum = true; + floatingAbsSum = absSum; + chunkedOverflowAbsSum = absVal; + } + } else { + chunkedOverflowAbsSum += absVal; + } + + if (!useFloatingSumOfSquares) { + try { + sumOfSquares = Math.addExact(sumOfSquares, Math.multiplyExact(val, val)); + } catch (final ArithmeticException ae) { + useFloatingSumOfSquares = true; + floatingSumOfSquares = sumOfSquares; + chunkedOverflowSumOfSquares = Math.pow(val, 2); + } + + } else { + chunkedOverflowSumOfSquares += Math.pow(val, 2); + } + } + + if (useFloatingSum) { + floatingSum += chunkedOverflowSum; + } + + if (useFloatingAbsSum) { + floatingAbsSum += chunkedOverflowAbsSum; + } + + if (useFloatingSumOfSquares) { + floatingSumOfSquares += chunkedOverflowSumOfSquares; + } + } + } + + double avg = avg(count, useFloatingSum ? floatingSum : sum); + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + useFloatingSum ? TableTools.doubleCol("SUM", floatingSum) : TableTools.longCol("SUM", sum), + useFloatingAbsSum ? TableTools.doubleCol("SUM_ABS", floatingAbsSum) + : TableTools.longCol("SUM_ABS", absSum), + useFloatingSumOfSquares ? TableTools.doubleCol("SQRD_SUM", floatingSumOfSquares) + : TableTools.longCol("SUM_SQRD", sumOfSquares), + TableTools.longCol("MIN", min), + TableTools.longCol("MAX", max), + TableTools.longCol("MIN_ABS", absMin), + TableTools.longCol("MAX_ABS", absMax), + TableTools.doubleCol("AVG", avg), + TableTools.doubleCol("AVG_ABS", avg(count, absSum)), + TableTools.doubleCol("STD_DEV", stdDev(count, useFloatingSum ? floatingSum : sum, + useFloatingSumOfSquares ? floatingSumOfSquares : sumOfSquares))); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/ObjectChunkedStats.java b/server/src/main/java/io/deephaven/server/table/stats/ObjectChunkedStats.java new file mode 100644 index 00000000000..561d178859f --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/ObjectChunkedStats.java @@ -0,0 +1,106 @@ +/* + * --------------------------------------------------------------------------------------------------------------------- + * AUTO-GENERATED CLASS - DO NOT EDIT MANUALLY - for any changes edit CharacterChunkedStats and regenerate + * --------------------------------------------------------------------------------------------------------------------- + */ +package io.deephaven.server.table.stats; + +import java.util.Set; +import java.util.HashSet; + +import gnu.trove.map.TObjectLongMap; +import gnu.trove.map.hash.TObjectLongHashMap; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.table.impl.util.ColumnHolder; +import io.deephaven.engine.table.iterators.ObjectColumnIterator; +import io.deephaven.engine.table.iterators.ChunkedObjectColumnIterator; +import io.deephaven.engine.util.TableTools; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class ObjectChunkedStats implements ChunkedStatsKernel { + private final int maxUniqueToCollect; + private final int maxUniqueToDisplay; + + public ObjectChunkedStats(int maxUniqueToCollect, int maxUniqueToDisplay) { + this.maxUniqueToCollect = maxUniqueToCollect; + this.maxUniqueToDisplay = maxUniqueToDisplay; + } + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + long count = 0; + int uniqueCount = 0; + + final TObjectLongMap countValues = new TObjectLongHashMap<>(); + boolean useSet = false; + final Set uniqueValues = new HashSet<>(); + + try (ObjectColumnIterator iterator = + new ChunkedObjectColumnIterator<>(usePrev ? columnSource.getPrevSource() : columnSource, rowSet)) { + while (iterator.hasNext()) { + Object val = iterator.next(); + if (val == null) { + continue; + } + count++; + + if (countValues.adjustOrPutValue(val, 1, 1) == 1 && ++uniqueCount > maxUniqueToCollect) { + // we no longer want to track counts for these items; fall back to a Set to get at least a count + uniqueValues.addAll(countValues.keySet()); + countValues.clear(); + useSet = true; + break; + } + } + while (iterator.hasNext()) { + // items still remain, count non-nulls and uniques + Object val = iterator.next(); + if (val == null) { + continue; + } + count++; + + uniqueValues.add(val); + } + } + + + if (useSet) { + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + TableTools.intCol("UNIQUE_VALUES", uniqueValues.size())); + } + List> sorted = new ArrayList<>(countValues.size()); + + countValues.forEachEntry((o, c) -> { + sorted.add(Map.entry(Objects.toString(o), c)); + return true; + }); + sorted.sort(Map.Entry.comparingByValue().reversed()); + + int resultCount = Math.min(maxUniqueToDisplay, sorted.size()); + String[] uniqueKeys = new String[resultCount]; + long[] uniqueCounts = new long[resultCount]; + Iterator> iter = sorted.iterator(); + for (int i = 0; i < resultCount; i++) { + Map.Entry entry = iter.next(); + uniqueKeys[i] = entry.getKey(); + uniqueCounts[i] = entry.getValue(); + } + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + TableTools.intCol("UNIQUE_VALUES", countValues.size()), + new ColumnHolder<>("UNIQUE_KEYS", String[].class, String.class, false, uniqueKeys), + new ColumnHolder<>("UNIQUE_COUNTS", long[].class, long.class, false, uniqueCounts)); + } +} diff --git a/server/src/main/java/io/deephaven/server/table/stats/ShortChunkedNumericalStats.java b/server/src/main/java/io/deephaven/server/table/stats/ShortChunkedNumericalStats.java new file mode 100644 index 00000000000..5a6cae838f6 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/table/stats/ShortChunkedNumericalStats.java @@ -0,0 +1,156 @@ +package io.deephaven.server.table.stats; + +import io.deephaven.chunk.ShortChunk; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.engine.rowset.RowSequence; +import io.deephaven.engine.rowset.RowSet; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.QueryConstants; + +public class ShortChunkedNumericalStats implements ChunkedNumericalStatsKernel { + private long count = 0; + + private long sum = 0; + private boolean useFloatingSum = false; + private double floatingSum = .0; + + private long absSum = 0; + private boolean useFloatingAbsSum = false; + private double floatingAbsSum = .0; + + private long sumOfSquares = 0; + private boolean useFloatingSumOfSquares = false; + private double floatingSumOfSquares = .0; + + private short min = QueryConstants.NULL_SHORT; + private short max = QueryConstants.NULL_SHORT; + private short absMin = QueryConstants.NULL_SHORT; + private short absMax = QueryConstants.NULL_SHORT; + + @Override + public Table processChunks(final RowSet rowSet, final ColumnSource columnSource, boolean usePrev) { + + try (final ChunkSource.GetContext getContext = columnSource.makeGetContext(CHUNK_SIZE)) { + final RowSequence.Iterator rsIt = rowSet.getRowSequenceIterator(); + + while (rsIt.hasMore()) { + final RowSequence nextKeys = rsIt.getNextRowSequenceWithLength(CHUNK_SIZE); + final ShortChunk chunk = (usePrev ? columnSource.getPrevChunk(getContext, nextKeys) + : columnSource.getChunk(getContext, nextKeys)).asShortChunk(); + + /* + * we'll use these to get as big as we can before adding into a potentially MUCH larger "total" in an + * attempt to reduce cumulative loss-of-precision error brought on by floating-point math; - but ONLY if + * we've overflowed our non-floating-point (long) + */ + double chunkedOverflowSum = .0; + double chunkedOverflowAbsSum = .0; + double chunkedOverflowSumOfSquares = .0; + + final int chunkSize = chunk.size(); + for (int ii = 0; ii < chunkSize; ii++) { + final short val = chunk.get(ii); + + if (val == QueryConstants.NULL_SHORT) { + continue; + } + + final short absVal = (short) Math.abs(val); + + if (count == 0) { + min = max = val; + absMax = absMin = absVal; + } else { + if (val < min) { + min = val; + } + + if (val > max) { + max = val; + } + + if (absVal < absMin) { + absMin = absVal; + } + + if (absVal > absMax) { + absMax = absVal; + } + } + + count++; + + if (!useFloatingSum) { + try { + sum = Math.addExact(sum, val); + } catch (final ArithmeticException ae) { + useFloatingSum = true; + floatingSum = sum; + chunkedOverflowSum = val; + } + } else { + chunkedOverflowSum += val; + } + + if (!useFloatingAbsSum) { + try { + absSum = Math.addExact(absSum, absVal); + } catch (final ArithmeticException ae) { + useFloatingAbsSum = true; + floatingAbsSum = absSum; + chunkedOverflowAbsSum = absVal; + } + } else { + chunkedOverflowAbsSum += absVal; + } + + if (!useFloatingSumOfSquares) { + try { + sumOfSquares = Math.addExact(sumOfSquares, Math.multiplyExact(val, val)); + } catch (final ArithmeticException ae) { + useFloatingSumOfSquares = true; + floatingSumOfSquares = sumOfSquares; + chunkedOverflowSumOfSquares = Math.pow(val, 2); + } + + } else { + chunkedOverflowSumOfSquares += Math.pow(val, 2); + } + } + + if (useFloatingSum) { + floatingSum += chunkedOverflowSum; + } + + if (useFloatingAbsSum) { + floatingAbsSum += chunkedOverflowAbsSum; + } + + if (useFloatingSumOfSquares) { + floatingSumOfSquares += chunkedOverflowSumOfSquares; + } + } + } + + double avg = avg(count, useFloatingSum ? floatingSum : sum); + return TableTools.newTable( + TableTools.longCol("COUNT", count), + TableTools.longCol("SIZE", rowSet.size()), + useFloatingSum ? TableTools.doubleCol("SUM", floatingSum) : TableTools.longCol("SUM", sum), + useFloatingAbsSum ? TableTools.doubleCol("SUM_ABS", floatingAbsSum) + : TableTools.longCol("SUM_ABS", absSum), + useFloatingSumOfSquares ? TableTools.doubleCol("SQRD_SUM", floatingSumOfSquares) + : TableTools.longCol("SUM_SQRD", sumOfSquares), + TableTools.shortCol("MIN", min), + TableTools.shortCol("MAX", max), + TableTools.shortCol("MIN_ABS", absMin), + TableTools.shortCol("MAX_ABS", absMax), + TableTools.doubleCol("AVG", avg), + TableTools.doubleCol("AVG_ABS", avg(count, absSum)), + TableTools.doubleCol("STD_DEV", stdDev(count, useFloatingSum ? floatingSum : sum, + useFloatingSumOfSquares ? floatingSumOfSquares : sumOfSquares))); + } +} diff --git a/server/src/test/java/io/deephaven/server/table/stats/ChunkedStatsKernelTest.java b/server/src/test/java/io/deephaven/server/table/stats/ChunkedStatsKernelTest.java new file mode 100644 index 00000000000..8ac6a40708c --- /dev/null +++ b/server/src/test/java/io/deephaven/server/table/stats/ChunkedStatsKernelTest.java @@ -0,0 +1,233 @@ +package io.deephaven.server.table.stats; + +import io.deephaven.api.agg.spec.AggSpec; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.table.impl.QueryTable; +import io.deephaven.engine.table.impl.sources.ReinterpretUtils; +import io.deephaven.engine.table.impl.vector.ObjectVectorColumnWrapper; +import io.deephaven.engine.testutil.generator.BigDecimalGenerator; +import io.deephaven.engine.testutil.generator.BigIntegerGenerator; +import io.deephaven.engine.testutil.generator.ByteGenerator; +import io.deephaven.engine.testutil.generator.CharGenerator; +import io.deephaven.engine.testutil.generator.DoubleGenerator; +import io.deephaven.engine.testutil.generator.FloatGenerator; +import io.deephaven.engine.testutil.generator.IntGenerator; +import io.deephaven.engine.testutil.generator.LongGenerator; +import io.deephaven.engine.testutil.generator.ShortGenerator; +import io.deephaven.engine.testutil.generator.StringGenerator; +import io.deephaven.engine.testutil.generator.UnsortedInstantGenerator; +import io.deephaven.engine.testutil.junit4.EngineCleanup; +import io.deephaven.engine.util.TableTools; +import io.deephaven.util.QueryConstants; +import org.junit.Rule; +import org.junit.Test; + +import java.time.Duration; +import java.time.Instant; +import java.time.temporal.TemporalAmount; +import java.util.LinkedHashMap; +import java.util.Random; + +import static io.deephaven.engine.testutil.TstUtils.getTable; +import static io.deephaven.engine.testutil.TstUtils.initColumnInfos; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +public class ChunkedStatsKernelTest { + @Rule + public final EngineCleanup framework = new EngineCleanup(); + + @Test + public void testNonNumericColumns() { + final int size = 1000; + final Random random = new Random(); + + Instant now = Instant.now(); + // This sample deliberately limits the universe of possible values to ensure that the count of each item is + // high enough to ensure consistent sorts. The column stats code is not concerned about stable sorts, so we + // need to make sure our "expected" values are close enough to pass these tests. + final QueryTable queryTable = getTable(size, random, + initColumnInfos( + new String[] {"charCol", "instantCol", "strCol"}, + new CharGenerator('@', '~', 0.01), + new UnsortedInstantGenerator(now, now.plus(Duration.ofHours(1)), 0.01), + new StringGenerator(100, 0.01))); + + Table expectedDistinctCounts = queryTable.aggAllBy(AggSpec.countDistinct()).update("charCol = (int) charCol", + "strCol = (int) strCol", "instantCol = (int) instantCol"); + Table expectedCharValues = queryTable.where("charCol != null") + .updateView("charCol=`` + charCol") + .countBy("Count", "charCol") + .sortDescending("Count", "charCol") + .head(100) + .groupBy() + .updateView("charCol = charCol.toArray()", "Count = Count.toArray()"); + Table expectedStrValues = queryTable.where("strCol != null") + .countBy("Count", "strCol") + .sortDescending("Count", "strCol") + .head(100) + .groupBy() + .updateView("strCol = strCol.toArray()", "Count = Count.toArray()"); + Table expectedMax = queryTable.maxBy(); + Table expectedMin = queryTable.minBy(); + Table nonNullCount = queryTable.update("charCol = charCol == null ? 0 : 1", "strCol = strCol == null ? 0 : 1", + "instantCol = instantCol == null ? 0 : 1").sumBy(); + + Table charStats = new CharacterChunkedStats(1000, 100) + .processChunks(queryTable.getRowSet(), queryTable.getColumnSource("charCol"), false); + Table instantStats = new DateTimeChunkedStats() + .processChunks(queryTable.getRowSet(), + ReinterpretUtils.instantToLongSource(queryTable.getColumnSource("instantCol")), false); + Table strStats = new ObjectChunkedStats(1000, 100) + .processChunks(queryTable.getRowSet(), queryTable.getColumnSource("strCol"), false); + + assertEquals(expectedDistinctCounts.getColumnSource("charCol").get(0), + charStats.getColumnSource("UNIQUE_VALUES").get(0)); + assertEquals(expectedDistinctCounts.getColumnSource("strCol").get(0), + strStats.getColumnSource("UNIQUE_VALUES").get(0)); + + // first validate that the counts are the same - the column stats order isn't actually stable, so check keys + // separately + assertArrayEquals((long[]) expectedCharValues.getColumnSource("Count").get(0), + (long[]) charStats.getColumnSource("UNIQUE_COUNTS").get(0)); + // now that we know the counts were correctly descending, force keys to be in the same order and compare those + Table sortedCharStats = charStats.ungroup("UNIQUE_COUNTS", "UNIQUE_KEYS") + .sortDescending("UNIQUE_COUNTS", "UNIQUE_KEYS") + .groupBy() + .updateView("UNIQUE_KEYS = UNIQUE_KEYS.toArray()"); + assertArrayEquals((String[]) expectedCharValues.getColumnSource("charCol").get(0), + (String[]) sortedCharStats.getColumnSource("UNIQUE_KEYS").get(0)); + + assertArrayEquals((long[]) expectedStrValues.getColumnSource("Count").get(0), + (long[]) strStats.getColumnSource("UNIQUE_COUNTS").get(0)); + Table sortedStrStats = strStats.ungroup("UNIQUE_COUNTS", "UNIQUE_KEYS") + .sortDescending("UNIQUE_COUNTS", "UNIQUE_KEYS") + .groupBy() + .updateView("UNIQUE_KEYS = UNIQUE_KEYS.toArray()"); + assertArrayEquals((String[]) expectedStrValues.getColumnSource("strCol").get(0), + (String[]) sortedStrStats.getColumnSource("UNIQUE_KEYS").get(0)); + + assertEquals(nonNullCount.getColumnSource("charCol").get(0), charStats.getColumnSource("COUNT").get(0)); + assertEquals(nonNullCount.getColumnSource("strCol").get(0), strStats.getColumnSource("COUNT").get(0)); + assertEquals(nonNullCount.getColumnSource("instantCol").get(0), instantStats.getColumnSource("COUNT").get(0)); + + assertEquals(expectedMin.getColumnSource("instantCol").get(0), instantStats.getColumnSource("MIN").get(0)); + assertEquals(expectedMax.getColumnSource("instantCol").get(0), instantStats.getColumnSource("MAX").get(0)); + + + // retest with smaller thresholds for items to collect + charStats = new CharacterChunkedStats(20, 10) + .processChunks(queryTable.getRowSet(), queryTable.getColumnSource("charCol"), false); + strStats = new ObjectChunkedStats(20, 10) + .processChunks(queryTable.getRowSet(), queryTable.getColumnSource("strCol"), false); + + assertEquals(expectedDistinctCounts.getColumnSource("charCol").get(0), + charStats.getColumnSource("UNIQUE_VALUES").get(0)); + assertEquals(expectedDistinctCounts.getColumnSource("strCol").get(0), + strStats.getColumnSource("UNIQUE_VALUES").get(0)); + + assertEquals(nonNullCount.getColumnSource("charCol").get(0), charStats.getColumnSource("COUNT").get(0)); + assertEquals(nonNullCount.getColumnSource("strCol").get(0), strStats.getColumnSource("COUNT").get(0)); + + assertFalse(charStats.hasColumns("UNIQUE_KEYS", "UNIQUE_COUNTS")); + assertFalse(strStats.hasColumns("UNIQUE_KEYS", "UNIQUE_COUNTS")); + } + + @Test + public void testNumericPrecision() { + final Table queryTable = TableTools.newTable( + TableTools.shortCol("shortCol", (short) (Short.MAX_VALUE - 1), (short) 1), + TableTools.intCol("intCol", Integer.MAX_VALUE - 1, 1), + TableTools.longCol("longCol", Long.MAX_VALUE - 1, 1), + TableTools.longCol("rollingLongCol", Long.MIN_VALUE + 1, 2)); + + final Table shortStats = getChunkedNumericalStats(queryTable, "shortCol"); + assertSame("shortStats Sum Precision", long.class, shortStats.getColumnSource("SUM").getType()); + assertSame("shortStats AbsSum Precision", long.class, shortStats.getColumnSource("SUM_ABS").getType()); + + final Table intStats = getChunkedNumericalStats(queryTable, "intCol"); + assertSame("intStats Sum Precision", long.class, intStats.getColumnSource("SUM").getType()); + assertSame("intStats AbsSum Precision", long.class, intStats.getColumnSource("SUM_ABS").getType()); + + final Table longStats = getChunkedNumericalStats(queryTable, "longCol"); + assertSame("longStats Sum Precision", long.class, longStats.getColumnSource("SUM").getType()); + assertSame("longStats AbsSum Precision", long.class, longStats.getColumnSource("SUM_ABS").getType()); + + // Sum can still be Long, but AbsSum should have rolled to Double + final Table rollingLongStats = getChunkedNumericalStats(queryTable, "rollingLongCol"); + assertSame("rollingLongStats Sum Precision", long.class, rollingLongStats.getColumnSource("SUM").getType()); + assertSame("rollingLongStats AbsSum Precision", double.class, + rollingLongStats.getColumnSource("SUM_ABS").getType()); + } + + @Test + public void testAccuracy() { + final int size = 1000; + final Random random = new Random(); + + final QueryTable queryTable = getTable(size, random, + initColumnInfos( + new String[] {"shortCol", "byteCol", "intCol", "longCol", "floatCol", "doubleCol", "bigIntCol", + "bigDecimalCol"}, + new ShortGenerator(QueryConstants.MIN_SHORT, QueryConstants.MAX_SHORT, 0.01), + new ByteGenerator(QueryConstants.MIN_BYTE, QueryConstants.MAX_BYTE, 0.01), + new IntGenerator(QueryConstants.MIN_INT / 2, QueryConstants.MAX_INT / 2, 0.01), + new LongGenerator(QueryConstants.MIN_LONG / 2, QueryConstants.MAX_LONG / 2, 0.01), + new FloatGenerator(QueryConstants.MIN_FINITE_FLOAT, Float.MAX_VALUE, 0.01), + new DoubleGenerator(QueryConstants.MIN_FINITE_DOUBLE, Double.MAX_VALUE, 0.01), + new BigIntegerGenerator(0.01), + new BigDecimalGenerator(0.01))); + + final Table stdDev = queryTable.aggAllBy(AggSpec.std()); + + final Table shortStats = getChunkedNumericalStats(queryTable, "shortCol"); + final Table byteStats = getChunkedNumericalStats(queryTable, "byteCol"); + final Table intStats = getChunkedNumericalStats(queryTable, "intCol"); + final Table longStats = getChunkedNumericalStats(queryTable, "longCol"); + final Table floatStats = getChunkedNumericalStats(queryTable, "floatCol"); + final Table doubleStats = getChunkedNumericalStats(queryTable, "doubleCol"); + final Table bigIntStats = getChunkedNumericalStats(queryTable, "bigIntCol"); + final Table bigDecimalStats = getChunkedNumericalStats(queryTable, "bigDecimalCol"); + + assertTrue("shortCol StdDev Accuracy", withinTolerance((Number) stdDev.getColumnSource("shortCol").get(0), + (Number) shortStats.getColumnSource("STD_DEV").get(0))); + assertTrue("byteCol StdDev Accuracy", withinTolerance((Number) stdDev.getColumnSource("byteCol").get(0), + (Number) byteStats.getColumnSource("STD_DEV").get(0))); + assertTrue("intCol StdDev Accuracy", withinTolerance((Number) stdDev.getColumnSource("intCol").get(0), + (Number) intStats.getColumnSource("STD_DEV").get(0))); + assertTrue("longCol StdDev Accuracy", withinTolerance((Number) stdDev.getColumnSource("longCol").get(0), + (Number) longStats.getColumnSource("STD_DEV").get(0))); + assertTrue("floatCol StdDev Accuracy", withinTolerance((Number) stdDev.getColumnSource("floatCol").get(0), + (Number) floatStats.getColumnSource("STD_DEV").get(0))); + assertTrue("doubleCol StdDev Accuracy", withinTolerance((Number) stdDev.getColumnSource("doubleCol").get(0), + (Number) doubleStats.getColumnSource("STD_DEV").get(0))); + assertTrue("bigIntCol StdDev Accuracy", withinTolerance((Number) stdDev.getColumnSource("bigIntCol").get(0), + (Number) bigIntStats.getColumnSource("STD_DEV").get(0))); + assertTrue("bigDecimalCol StdDev Accuracy", + withinTolerance((Number) stdDev.getColumnSource("bigDecimalCol").get(0), + (Number) bigDecimalStats.getColumnSource("STD_DEV").get(0))); + } + + private Table getChunkedNumericalStats(Table queryTable, String colName) { + ColumnSource colSource = queryTable.getColumnSource(colName); + return ChunkedNumericalStatsKernel.makeChunkedNumericalStats(colSource.getType()) + .processChunks(queryTable.getRowSet(), colSource, false); + } + + private static boolean withinTolerance(final Number expected, final Number actual) { + if (expected.equals(actual)) { + return true; + } + + final double expectedDouble = expected.doubleValue(); + final double actualDouble = actual.doubleValue(); + + final double epsilon = (Math.abs(expectedDouble - actualDouble)) / Math.min(expectedDouble, actualDouble); + double expectedTolerance = 1.0E-14; + return epsilon < expectedTolerance; + } +} diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/JsColumnStatistics.java b/web/client-api/src/main/java/io/deephaven/web/client/api/JsColumnStatistics.java index 7fc67848a58..552bbc6497a 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/JsColumnStatistics.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/JsColumnStatistics.java @@ -6,6 +6,7 @@ import com.vertispan.tsdefs.annotations.TsInterface; import com.vertispan.tsdefs.annotations.TsName; +import elemental2.core.JsArray; import elemental2.core.JsMap; import io.deephaven.web.shared.data.ColumnStatistics; import jsinterop.annotations.JsIgnore; @@ -26,9 +27,58 @@ public class JsColumnStatistics { public enum StatType { // Note that a null format means default to columns formatting - COUNT("COUNT", "long"), SIZE("SIZE", "long"), UNIQUE_VALUES("UNIQUE VALUES", "long"), SUM("SUM", null), SUM_ABS( - "SUM (ABS)", null), AVG("AVG", "double"), AVG_ABS("AVG (ABS)", "double"), MIN("MIN", - null), MIN_ABS("MIN (ABS)", null), MAX("MAX", null), MAX_ABS("MAX (ABS)", null); + /** + * The number of non-null values in the column. + */ + COUNT("COUNT", "long"), + /** + * The total number of values in the column. + */ + SIZE("SIZE", "long"), + /** + * The number of unique values in the column. + */ + UNIQUE_VALUES("UNIQUE VALUES", "long"), + /** + * The sum of all data in the column. + */ + SUM("SUM", null), + /** + * The sum of the absolute value of all data in the column. + */ + SUM_ABS("SUM (ABS)", null), + /** + * The average of all data in the column. + */ + AVG("AVG", "double"), + /** + * The average of the absolute value of all data in the column. + */ + AVG_ABS("AVG (ABS)", "double"), + /** + * The minimum value found in the column. + */ + MIN("MIN", null), + /** + * The minimum absolute value found in the column. + */ + MIN_ABS("MIN (ABS)", null), + /** + * The maximum value found in the column. + */ + MAX("MAX", null), + /** + * The maximum absolute value found in the column. + */ + MAX_ABS("MAX (ABS)", null), + /** + * The standard deviation of the values in the column. + */ + STD_DEV("STD DEV", "double"), + /** + * The sum of the square of all values in the column. + */ + SUM_SQRD("SUM (SQRD)", null); private final String displayName; private final String formatType; @@ -57,53 +107,43 @@ public String getFormatType() { private final JsMap uniqueValues; @JsIgnore - public JsColumnStatistics(ColumnStatistics statistics) { + public JsColumnStatistics(TableData data) { statisticsMap = new JsMap<>(); - statisticsMap.set(StatType.SIZE.getDisplayName(), (double) statistics.getSize()); - if (statistics.getType() == ColumnStatistics.ColumnType.NUMERIC) { - // Mimics io.deephaven.console.engine.GenerateNumericalStatsFunction.statsResultToString - if (statistics.getCount() > 0) { - statisticsMap.set(StatType.SUM.getDisplayName(), statistics.getSum()); - statisticsMap.set(StatType.SUM_ABS.getDisplayName(), statistics.getAbsSum()); - } - statisticsMap.set(StatType.COUNT.getDisplayName(), (double) statistics.getCount()); - if (statistics.getCount() > 0) { - statisticsMap.set(StatType.AVG.getDisplayName(), statistics.getSum() / (double) statistics.getCount()); - statisticsMap.set(StatType.AVG_ABS.getDisplayName(), - statistics.getAbsSum() / (double) statistics.getCount()); - statisticsMap.set(StatType.MIN.getDisplayName(), statistics.getMin()); - statisticsMap.set(StatType.MAX.getDisplayName(), statistics.getMax()); - statisticsMap.set(StatType.MIN_ABS.getDisplayName(), statistics.getAbsMin()); - statisticsMap.set(StatType.MAX_ABS.getDisplayName(), statistics.getAbsMax()); - } - } else if (statistics.getType() == ColumnStatistics.ColumnType.DATETIME) { - statisticsMap.set(StatType.COUNT.getDisplayName(), (double) statistics.getCount()); - if (statistics.getCount() > 0) { - statisticsMap.set(StatType.MIN.getDisplayName(), new DateWrapper(statistics.getMinDateTime())); - statisticsMap.set(StatType.MAX.getDisplayName(), new DateWrapper(statistics.getMaxDateTime())); + + TableData.Row r = data.get(0); + Column uniqueKeys = null; + Column uniqueCounts = null; + for (Column column : data.getColumns().asList()) { + if (column.getName().equals("UNIQUE_KEYS")) { + uniqueKeys = column; + continue; + } else if (column.getName().equals("UNIQUE_COUNTS")) { + uniqueCounts = column; + continue; } - } else { - statisticsMap.set(StatType.COUNT.getDisplayName(), (double) statistics.getCount()); - if (statistics.getType() == ColumnStatistics.ColumnType.COMPARABLE) { - statisticsMap.set(StatType.UNIQUE_VALUES.getDisplayName(), (double) statistics.getNumUnique()); + try { + StatType type = StatType.valueOf(column.getName()); + statisticsMap.set(type.getDisplayName(), r.get(column)); + } catch (IllegalArgumentException e) { + // ignore, can't be used as a generic statistic } } uniqueValues = new JsMap<>(); - if (statistics.getType() == ColumnStatistics.ColumnType.COMPARABLE) { - final String[] keys = statistics.getUniqueKeys(); - final long[] values = statistics.getUniqueValues(); - assert keys.length == values.length : "Table Statistics Unique Value Count does not have the same" + - "number of keys and values. Keys = " + keys.length + ", Values = " + values.length; - for (int i = 0; i < keys.length; i++) { - uniqueValues.set(keys[i], (double) values[i]); - } + if (uniqueCounts == null || uniqueKeys == null) { + return; + } + // TODO (deephaven-core#188) support for long[] values in flight data + JsArray keys = (JsArray) r.get(uniqueKeys); + JsArray counts = (JsArray) r.get(uniqueCounts); + for (int i = 0; i < keys.length; i++) { + uniqueValues.set(keys.getAt(i), counts.getAt(i).asNumber()); } } /** * Gets the type of formatting that should be used for given statistic. - * + *

* the format type for a statistic. A null return value means that the column formatting should be used. * * @param name the display name of the statistic @@ -116,7 +156,7 @@ public String getType(String name) { /** * Gets a map with the display name of statistics as keys and the numeric stat as a value. - * + *

* A map of each statistic's name to its value. * * @return Map of String and Object @@ -126,11 +166,10 @@ public JsMap getStatisticsMap() { return statisticsMap; } - /** - * Gets a map with the name of each unique value as key and the count a the value. A map of each unique value's name - * to the count of how many times it occurred in the column. This map will be empty for tables containing more than - * 19 unique values. + * Gets a map with the name of each unique value as key and the count as the value. A map of each unique value's + * name to the count of how many times it occurred in the column. This map will be empty for tables containing more + * than 19 unique values. * * @return Map of String double * 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 398c2915a3e..a10f5cf7808 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 @@ -14,12 +14,12 @@ import elemental2.promise.Promise; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.hierarchicaltable_pb.RollupRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.hierarchicaltable_pb.TreeRequest; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.partitionedtable_pb.PartitionByRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.partitionedtable_pb.PartitionByResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.AggregateRequest; 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.ColumnStatisticsRequest; 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.ExactJoinTablesRequest; @@ -36,13 +36,13 @@ 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.table_pb.runchartdownsamplerequest.ZoomRange; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb_service.ResponseStream; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.TypedTicket; import io.deephaven.web.client.api.barrage.def.ColumnDefinition; import io.deephaven.web.client.api.barrage.def.TableAttributesDefinition; 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.JsVariableType; import io.deephaven.web.client.api.filter.FilterCondition; import io.deephaven.web.client.api.input.JsInputTable; @@ -1433,14 +1433,50 @@ public Promise partitionBy(Object keys, @JsOptional Boolean * @param column * @return Promise of dh.ColumnStatistics */ - // TODO: #697: Column statistic support - // @JsMethod + @JsMethod public Promise getColumnStatistics(Column column) { - return Callbacks.promise(null, c -> { - // workerConnection.getServer().getColumnStatisticsForTable(state().getHandle(), column.getName(), c); - throw new UnsupportedOperationException("getColumnStatistics"); - }).then( - tableStatics -> Promise.resolve(new JsColumnStatistics(tableStatics))); + List toRelease = new ArrayList<>(); + return workerConnection.newState((c, state, metadata) -> { + ColumnStatisticsRequest req = new ColumnStatisticsRequest(); + req.setColumnName(column.getName()); + req.setSourceId(state().getHandle().makeTableReference()); + req.setResultId(state.getHandle().makeTicket()); + workerConnection.tableServiceClient().computeColumnStatistics(req, metadata, c::apply); + }, "get column statistics") + .refetch(this, workerConnection.metadata()) + .then(state -> { + // TODO (deephaven-core#188) don't drop these columns once we can decode them + JsArray dropCols = new JsArray<>(); + if (Arrays.stream(state.getColumns()).anyMatch(c -> c.getName().equals("UNIQUE_KEYS"))) { + dropCols.push("UNIQUE_KEYS"); + } + if (Arrays.stream(state.getColumns()).anyMatch(c -> c.getName().equals("UNIQUE_COUNTS"))) { + dropCols.push("UNIQUE_COUNTS"); + } + + if (dropCols.length > 0) { + toRelease.add(() -> workerConnection.releaseHandle(state.getHandle())); + return workerConnection.newState((c2, state2, metadata2) -> { + DropColumnsRequest drop = new DropColumnsRequest(); + drop.setColumnNamesList(dropCols); + drop.setSourceId(state.getHandle().makeTableReference()); + drop.setResultId(state2.getHandle().makeTicket()); + workerConnection.tableServiceClient().dropColumns(drop, metadata2, c2::apply); + }, "drop unreadable stats columns") + .refetch(this, workerConnection.metadata()) + .then(state2 -> { + JsTable table = new JsTable(workerConnection, state2); + toRelease.add(table::close); + table.setViewport(0, 0); + return table.getViewportData(); + }); + } + JsTable table = new JsTable(workerConnection, state); + toRelease.add(table::close); + table.setViewport(0, 0); + return table.getViewportData(); + }) + .then(tableData -> Promise.resolve(new JsColumnStatistics(tableData))); } private Literal objectToLiteral(String valueType, Object value) { diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/ColumnStatisticsRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/ColumnStatisticsRequest.java new file mode 100644 index 00000000000..eb962c7d1d1 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/ColumnStatisticsRequest.java @@ -0,0 +1,287 @@ +/** + * Copyright (c) 2016-2022 Deephaven Data Labs and Patent Pending + */ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_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.table_pb.ColumnStatisticsRequest", + namespace = JsPackage.GLOBAL) +public class ColumnStatisticsRequest { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ResultIdFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static ColumnStatisticsRequest.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 ColumnStatisticsRequest.ToObjectReturnType.ResultIdFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + ColumnStatisticsRequest.ToObjectReturnType.ResultIdFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + ColumnStatisticsRequest.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 SourceIdFieldType { + @JsOverlay + static ColumnStatisticsRequest.ToObjectReturnType.SourceIdFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getBatchOffset(); + + @JsProperty + Object getTicket(); + + @JsProperty + void setBatchOffset(double batchOffset); + + @JsProperty + void setTicket(Object ticket); + } + + @JsOverlay + static ColumnStatisticsRequest.ToObjectReturnType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + String getColumnName(); + + @JsProperty + ColumnStatisticsRequest.ToObjectReturnType.ResultIdFieldType getResultId(); + + @JsProperty + ColumnStatisticsRequest.ToObjectReturnType.SourceIdFieldType getSourceId(); + + @JsProperty + double getUniqueValueLimit(); + + @JsProperty + void setColumnName(String columnName); + + @JsProperty + void setResultId(ColumnStatisticsRequest.ToObjectReturnType.ResultIdFieldType resultId); + + @JsProperty + void setSourceId(ColumnStatisticsRequest.ToObjectReturnType.SourceIdFieldType sourceId); + + @JsProperty + void setUniqueValueLimit(double uniqueValueLimit); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType0 { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ResultIdFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static ColumnStatisticsRequest.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 ColumnStatisticsRequest.ToObjectReturnType0.ResultIdFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + ColumnStatisticsRequest.ToObjectReturnType0.ResultIdFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + ColumnStatisticsRequest.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 SourceIdFieldType { + @JsOverlay + static ColumnStatisticsRequest.ToObjectReturnType0.SourceIdFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getBatchOffset(); + + @JsProperty + Object getTicket(); + + @JsProperty + void setBatchOffset(double batchOffset); + + @JsProperty + void setTicket(Object ticket); + } + + @JsOverlay + static ColumnStatisticsRequest.ToObjectReturnType0 create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + String getColumnName(); + + @JsProperty + ColumnStatisticsRequest.ToObjectReturnType0.ResultIdFieldType getResultId(); + + @JsProperty + ColumnStatisticsRequest.ToObjectReturnType0.SourceIdFieldType getSourceId(); + + @JsProperty + double getUniqueValueLimit(); + + @JsProperty + void setColumnName(String columnName); + + @JsProperty + void setResultId(ColumnStatisticsRequest.ToObjectReturnType0.ResultIdFieldType resultId); + + @JsProperty + void setSourceId(ColumnStatisticsRequest.ToObjectReturnType0.SourceIdFieldType sourceId); + + @JsProperty + void setUniqueValueLimit(double uniqueValueLimit); + } + + public static native ColumnStatisticsRequest deserializeBinary(Uint8Array bytes); + + public static native ColumnStatisticsRequest deserializeBinaryFromReader( + ColumnStatisticsRequest message, Object reader); + + public static native void serializeBinaryToWriter(ColumnStatisticsRequest message, Object writer); + + public static native ColumnStatisticsRequest.ToObjectReturnType toObject( + boolean includeInstance, ColumnStatisticsRequest msg); + + public native void clearResultId(); + + public native void clearSourceId(); + + public native void clearUniqueValueLimit(); + + public native String getColumnName(); + + public native Ticket getResultId(); + + public native TableReference getSourceId(); + + public native int getUniqueValueLimit(); + + public native boolean hasResultId(); + + public native boolean hasSourceId(); + + public native boolean hasUniqueValueLimit(); + + public native Uint8Array serializeBinary(); + + public native void setColumnName(String value); + + public native void setResultId(); + + public native void setResultId(Ticket value); + + public native void setSourceId(); + + public native void setSourceId(TableReference value); + + public native void setUniqueValueLimit(int value); + + public native ColumnStatisticsRequest.ToObjectReturnType0 toObject(); + + public native ColumnStatisticsRequest.ToObjectReturnType0 toObject(boolean includeInstance); +} 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 cc2a34018e4..7599fc16339 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 @@ -279,6 +279,50 @@ static TableService.ComboAggregateType create() { void setService(Object service); } + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ComputeColumnStatisticsType { + @JsOverlay + static TableService.ComputeColumnStatisticsType 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 CreateInputTableType { @JsOverlay @@ -1737,6 +1781,7 @@ static TableService.WhereInType create() { public static TableService.AsOfJoinTablesType AsOfJoinTables; public static TableService.BatchType Batch; public static TableService.ComboAggregateType ComboAggregate; + public static TableService.ComputeColumnStatisticsType ComputeColumnStatistics; public static TableService.CreateInputTableType CreateInputTable; public static TableService.CrossJoinTablesType CrossJoinTables; public static TableService.DropColumnsType DropColumns; 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 4c026d33212..31a8f190524 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 @@ -9,6 +9,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.BatchTableRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ColumnStatisticsRequest; 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; @@ -48,6 +49,8 @@ import jsinterop.base.Js; import jsinterop.base.JsPropertyMap; +import javax.validation.constraints.NotNull; + @JsType( isNative = true, name = "dhinternal.io.deephaven.proto.table_pb_service.TableServiceClient", @@ -519,6 +522,100 @@ default boolean isComboAggregateMetadata_or_callbackFn() { } } + @JsFunction + public interface ComputeColumnStatisticsCallbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static TableServiceClient.ComputeColumnStatisticsCallbackFn.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.ComputeColumnStatisticsCallbackFn.P0Type p0, + ExportedTableCreationResponse p1); + } + + @JsFunction + public interface ComputeColumnStatisticsMetadata_or_callbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static TableServiceClient.ComputeColumnStatisticsMetadata_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.ComputeColumnStatisticsMetadata_or_callbackFn.P0Type p0, + ExportedTableCreationResponse p1); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ComputeColumnStatisticsMetadata_or_callbackUnionType { + @JsOverlay + static TableServiceClient.ComputeColumnStatisticsMetadata_or_callbackUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default BrowserHeaders asBrowserHeaders() { + return Js.cast(this); + } + + @JsOverlay + default TableServiceClient.ComputeColumnStatisticsMetadata_or_callbackFn asComputeColumnStatisticsMetadata_or_callbackFn() { + return Js.cast(this); + } + + @JsOverlay + default boolean isBrowserHeaders() { + return (Object) this instanceof BrowserHeaders; + } + + @JsOverlay + default boolean isComputeColumnStatisticsMetadata_or_callbackFn() { + return (Object) this instanceof TableServiceClient.ComputeColumnStatisticsMetadata_or_callbackFn; + } + } + @JsFunction public interface CreateInputTableCallbackFn { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) @@ -3752,6 +3849,58 @@ public native UnaryResponse comboAggregate( ComboAggregateRequest requestMessage, TableServiceClient.ComboAggregateMetadata_or_callbackUnionType metadata_or_callback); + @JsOverlay + public final UnaryResponse computeColumnStatistics( + ColumnStatisticsRequest requestMessage, + BrowserHeaders metadata_or_callback, + TableServiceClient.ComputeColumnStatisticsCallbackFn callback) { + return computeColumnStatistics( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse computeColumnStatistics( + ColumnStatisticsRequest requestMessage, BrowserHeaders metadata_or_callback) { + return computeColumnStatistics( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + @JsOverlay + public final UnaryResponse computeColumnStatistics( + ColumnStatisticsRequest requestMessage, + TableServiceClient.ComputeColumnStatisticsMetadata_or_callbackFn metadata_or_callback, + TableServiceClient.ComputeColumnStatisticsCallbackFn callback) { + return computeColumnStatistics( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse computeColumnStatistics( + ColumnStatisticsRequest requestMessage, + TableServiceClient.ComputeColumnStatisticsMetadata_or_callbackFn metadata_or_callback) { + return computeColumnStatistics( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + public native UnaryResponse computeColumnStatistics( + ColumnStatisticsRequest requestMessage, + TableServiceClient.ComputeColumnStatisticsMetadata_or_callbackUnionType metadata_or_callback, + TableServiceClient.ComputeColumnStatisticsCallbackFn callback); + + public native UnaryResponse computeColumnStatistics( + ColumnStatisticsRequest requestMessage, + TableServiceClient.ComputeColumnStatisticsMetadata_or_callbackUnionType metadata_or_callback); + @JsOverlay public final UnaryResponse createInputTable( CreateInputTableRequest requestMessage,