From 4c30c15737ba57f2e3a410cee8d7110779c6fb8e Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 30 Nov 2021 10:25:55 -0800 Subject: [PATCH 01/20] Introduce Aggregation keys Partial #1617 --- .../doc/io/deephaven/api/agg/AbsSum.json | 10 - .../doc/io/deephaven/api/agg/Aggregation.json | 41 +- .../api/agg/Aggregation/Visitor.json | 2 +- .../api/agg/AggregationFinisher.json | 28 -- .../api/agg/AggregationOptimizer.json | 11 + .../deephaven/api/agg/AggregationOutputs.json | 2 +- .../doc/io/deephaven/api/agg/Avg.json | 10 - .../io/deephaven/api/agg/CountDistinct.json | 12 - .../doc/io/deephaven/api/agg/Distinct.json | 12 - .../doc/io/deephaven/api/agg/First.json | 10 - .../doc/io/deephaven/api/agg/Group.json | 10 - .../deephaven/api/agg/KeyedAggregation.json | 12 + .../deephaven/api/agg/KeyedAggregations.json | 12 + .../api/agg/KeyedAggregations/Builder.json | 11 + .../doc/io/deephaven/api/agg/Last.json | 10 - .../doc/io/deephaven/api/agg/Max.json | 10 - .../doc/io/deephaven/api/agg/Med.json | 12 - .../doc/io/deephaven/api/agg/Min.json | 10 - .../doc/io/deephaven/api/agg/Multi.json | 10 - .../io/deephaven/api/agg/Multi/Builder.json | 10 - .../doc/io/deephaven/api/agg/Pair.json | 2 +- .../doc/io/deephaven/api/agg/Pct.json | 13 - .../api/agg/SortedFirst/Builder.json | 11 - .../deephaven/api/agg/SortedLast/Builder.json | 11 - .../doc/io/deephaven/api/agg/Std.json | 10 - .../doc/io/deephaven/api/agg/Sum.json | 11 - .../doc/io/deephaven/api/agg/Unique.json | 12 - .../doc/io/deephaven/api/agg/Var.json | 10 - .../doc/io/deephaven/api/agg/WAvg.json | 11 - .../doc/io/deephaven/api/agg/WSum.json | 11 - .../doc/io/deephaven/api/agg/key/Key.json | 10 + .../io/deephaven/api/agg/key/Key/Visitor.json | 8 + .../io/deephaven/api/agg/key/KeyAbsSum.json | 9 + .../doc/io/deephaven/api/agg/key/KeyAvg.json | 9 + .../doc/io/deephaven/api/agg/key/KeyBase.json | 8 + .../api/agg/key/KeyCountDistinct.json | 10 + .../io/deephaven/api/agg/key/KeyDistinct.json | 10 + .../deephaven/api/agg/key/KeyEmptyBase.json | 8 + .../io/deephaven/api/agg/key/KeyFirst.json | 9 + .../io/deephaven/api/agg/key/KeyGroup.json | 9 + .../doc/io/deephaven/api/agg/key/KeyLast.json | 9 + .../doc/io/deephaven/api/agg/key/KeyMax.json | 9 + .../io/deephaven/api/agg/key/KeyMedian.json | 10 + .../doc/io/deephaven/api/agg/key/KeyMin.json | 9 + .../doc/io/deephaven/api/agg/key/KeyPct.json | 12 + .../KeySortedFirst.json} | 9 +- .../api/agg/key/KeySortedFirst/Builder.json | 10 + .../KeySortedLast.json} | 9 +- .../api/agg/key/KeySortedLast/Builder.json | 10 + .../doc/io/deephaven/api/agg/key/KeyStd.json | 9 + .../doc/io/deephaven/api/agg/key/KeySum.json | 9 + .../io/deephaven/api/agg/key/KeyUnique.json | 10 + .../doc/io/deephaven/api/agg/key/KeyVar.json | 9 + .../doc/io/deephaven/api/agg/key/KeyWAvg.json | 10 + .../doc/io/deephaven/api/agg/key/KeyWSum.json | 10 + .../AggregationElement.json | 3 +- .../impl/select/Formula/FillContext.json | 6 + .../table/impl/select/Formula/GetContext.json | 6 + .../deephaven/qst/table/AggregationTable.json | 2 - .../io/deephaven/qst/table/ByTableBase.json | 3 +- .../qst/table/FullAggregationTable.json | 10 + .../table/FullAggregationTable/Builder.json | 12 + .../deephaven/qst/table/ParentsVisitor.json | 2 +- .../qst/table/SingleAggregationTable.json | 10 + .../table/SingleAggregationTable/Builder.json | 12 + .../doc/io/deephaven/qst/table/TableBase.json | 2 +- .../qst/table/TableSpec/Visitor.json | 2 +- .../qst/table/TableVisitorGeneric.json | 2 +- .../impl/by/AggregationAdapterOptimized.java | 346 ---------------- .../impl/by/AggregationAdapterOrdered.java | 143 ------- .../impl/by/AggregationElementAdapter.java | 46 +++ .../table/impl/by/AggregationFactory.java | 60 ++- .../table/impl/by/AggregationSpecAdapter.java | 136 +++++++ .../engine/table/impl/QueryTableTest.java | 8 +- .../parquet/table/ParquetTableWriter.java | 7 +- .../io/deephaven/client/examples/Sum.java | 3 +- .../client/impl/BatchTableRequestBuilder.java | 375 ++++++++++-------- .../io/deephaven/graphviz/LabelBuilder.java | 177 ++++++++- .../io/deephaven/qst/TableAdapterImpl.java | 122 +++++- .../deephaven/qst/table/AggregationTable.java | 19 +- .../io/deephaven/qst/table/ByTableBase.java | 14 + .../io/deephaven/qst/table/GroupByTable.java | 42 -- .../deephaven/qst/table/ParentsVisitor.java | 4 +- .../qst/table/SingleAggregationTable.java | 26 ++ .../io/deephaven/qst/table/TableBase.java | 36 +- .../io/deephaven/qst/table/TableSpec.java | 4 +- .../qst/table/TableVisitorGeneric.java | 4 +- .../java/io/deephaven/api/agg/AbsSum.java | 27 -- .../io/deephaven/api/agg/Aggregation.java | 265 +++++++------ .../api/agg/AggregationFinisher.java | 180 --------- .../api/agg/AggregationOptimizer.java | 66 +++ .../deephaven/api/agg/AggregationOutputs.java | 102 +---- .../main/java/io/deephaven/api/agg/Avg.java | 27 -- .../main/java/io/deephaven/api/agg/Count.java | 4 +- .../io/deephaven/api/agg/CountDistinct.java | 35 -- .../java/io/deephaven/api/agg/Distinct.java | 35 -- .../main/java/io/deephaven/api/agg/First.java | 27 -- .../main/java/io/deephaven/api/agg/Group.java | 27 -- .../deephaven/api/agg/KeyedAggregation.java | 30 ++ .../deephaven/api/agg/KeyedAggregations.java | 51 +++ .../main/java/io/deephaven/api/agg/Last.java | 27 -- .../main/java/io/deephaven/api/agg/Max.java | 27 -- .../main/java/io/deephaven/api/agg/Med.java | 35 -- .../main/java/io/deephaven/api/agg/Min.java | 27 -- .../main/java/io/deephaven/api/agg/Multi.java | 49 --- .../main/java/io/deephaven/api/agg/Pair.java | 4 +- .../main/java/io/deephaven/api/agg/Std.java | 27 -- .../main/java/io/deephaven/api/agg/Sum.java | 31 -- .../java/io/deephaven/api/agg/Unique.java | 35 -- .../main/java/io/deephaven/api/agg/Var.java | 27 -- .../java/io/deephaven/api/agg/key/Key.java | 61 +++ .../io/deephaven/api/agg/key/KeyAbsSum.java | 19 + .../java/io/deephaven/api/agg/key/KeyAvg.java | 19 + .../io/deephaven/api/agg/key/KeyBase.java | 25 ++ .../api/agg/key/KeyCountDistinct.java | 29 ++ .../io/deephaven/api/agg/key/KeyDistinct.java | 31 ++ .../deephaven/api/agg/key/KeyEmptyBase.java | 12 + .../io/deephaven/api/agg/key/KeyFirst.java | 19 + .../io/deephaven/api/agg/key/KeyGroup.java | 19 + .../io/deephaven/api/agg/key/KeyLast.java | 19 + .../java/io/deephaven/api/agg/key/KeyMax.java | 19 + .../io/deephaven/api/agg/key/KeyMedian.java | 31 ++ .../java/io/deephaven/api/agg/key/KeyMin.java | 19 + .../api/agg/{Pct.java => key/KeyPct.java} | 18 +- .../KeySortedFirst.java} | 18 +- .../KeySortedLast.java} | 18 +- .../java/io/deephaven/api/agg/key/KeyStd.java | 19 + .../java/io/deephaven/api/agg/key/KeySum.java | 19 + .../io/deephaven/api/agg/key/KeyUnique.java | 31 ++ .../java/io/deephaven/api/agg/key/KeyVar.java | 19 + .../api/agg/{WAvg.java => key/KeyWAvg.java} | 13 +- .../api/agg/{WSum.java => key/KeyWSum.java} | 13 +- 132 files changed, 1899 insertions(+), 1981 deletions(-) delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/AbsSum.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationFinisher.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationOptimizer.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Avg.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/CountDistinct.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Distinct.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/First.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Group.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregation.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregations.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregations/Builder.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Last.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Max.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Med.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Min.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Multi.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Multi/Builder.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Pct.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedFirst/Builder.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedLast/Builder.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Std.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Sum.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Unique.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/Var.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/WAvg.json delete mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/WSum.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key/Visitor.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyAbsSum.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyAvg.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyBase.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyCountDistinct.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyDistinct.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyEmptyBase.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyFirst.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyGroup.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyLast.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMax.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMedian.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMin.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyPct.json rename Integrations/python/deephaven/doc/io/deephaven/api/agg/{SortedFirst.json => key/KeySortedFirst.json} (50%) create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedFirst/Builder.json rename Integrations/python/deephaven/doc/io/deephaven/api/agg/{SortedLast.json => key/KeySortedLast.json} (50%) create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedLast/Builder.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyStd.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySum.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyUnique.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyVar.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyWAvg.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyWSum.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/select/Formula/FillContext.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/select/Formula/GetContext.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/qst/table/FullAggregationTable.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/qst/table/FullAggregationTable/Builder.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/qst/table/SingleAggregationTable.json create mode 100644 Integrations/python/deephaven/doc/io/deephaven/qst/table/SingleAggregationTable/Builder.json delete mode 100644 engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationAdapterOptimized.java delete mode 100644 engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationAdapterOrdered.java create mode 100644 engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java create mode 100644 engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java delete mode 100644 qst/src/main/java/io/deephaven/qst/table/GroupByTable.java create mode 100644 qst/src/main/java/io/deephaven/qst/table/SingleAggregationTable.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/AbsSum.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/AggregationFinisher.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Avg.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/CountDistinct.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Distinct.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/First.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Group.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/KeyedAggregation.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/KeyedAggregations.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Last.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Max.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Med.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Min.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Multi.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Std.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Sum.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Unique.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/Var.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/Key.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyAbsSum.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyAvg.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyCountDistinct.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyDistinct.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyEmptyBase.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyFirst.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyGroup.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyLast.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyMax.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyMin.java rename table-api/src/main/java/io/deephaven/api/agg/{Pct.java => key/KeyPct.java} (56%) rename table-api/src/main/java/io/deephaven/api/agg/{SortedFirst.java => key/KeySortedFirst.java} (78%) rename table-api/src/main/java/io/deephaven/api/agg/{SortedLast.java => key/KeySortedLast.java} (79%) create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyStd.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeySum.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyUnique.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyVar.java rename table-api/src/main/java/io/deephaven/api/agg/{WAvg.java => key/KeyWAvg.java} (61%) rename table-api/src/main/java/io/deephaven/api/agg/{WSum.java => key/KeyWSum.java} (61%) diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/AbsSum.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/AbsSum.json deleted file mode 100644 index cf978378f57..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/AbsSum.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.AbsSum", - "methods": { - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.AbsSum\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.AbsSum", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.AbsSum", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Aggregation.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Aggregation.json index e33d466adec..ca8d9e79dd0 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Aggregation.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Aggregation.json @@ -1,26 +1,27 @@ { "className": "io.deephaven.api.agg.Aggregation", "methods": { - "AggAbsSum": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.AbsSum\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggAvg": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Avg\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggCount": ":param resultColumn: java.lang.String\n:return: io.deephaven.api.agg.Count", - "AggCountDistinct": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.CountDistinct\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param countNulls: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.CountDistinct\n \n*Overload 4* \n :param countNulls: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggDistinct": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Distinct\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param includeNulls: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Distinct\n \n*Overload 4* \n :param includeNulls: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggFirst": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.First\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggGroup": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Group\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggLast": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Last\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggMax": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Max\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggMed": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Med\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param average: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Med\n \n*Overload 4* \n :param average: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggMin": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Min\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggPct": "*Overload 1* \n :param percentile: double\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Pct\n \n*Overload 2* \n :param percentile: double\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param percentile: double\n :param average: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Pct\n \n*Overload 4* \n :param percentile: double\n :param average: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggSortedFirst": "*Overload 1* \n :param sortedColumn: java.lang.String\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.SortedFirst\n \n*Overload 2* \n :param sortedColumn: java.lang.String\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param sortedColumns: java.util.Collection\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.SortedFirst\n \n*Overload 4* \n :param sortedColumns: java.util.Collection\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggSortedLast": "*Overload 1* \n :param sortedColumn: java.lang.String\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.SortedLast\n \n*Overload 2* \n :param sortedColumn: java.lang.String\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param sortedColumns: java.util.Collection\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.SortedLast\n \n*Overload 4* \n :param sortedColumns: java.util.Collection\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggStd": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Std\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggSum": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Sum\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggUnique": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Unique\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param includeNulls: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Unique\n \n*Overload 4* \n :param includeNulls: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggVar": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Var\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggWAvg": "*Overload 1* \n :param weightColumn: java.lang.String\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.WAvg\n \n*Overload 2* \n :param weightColumn: java.lang.String\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "AggWSum": "*Overload 1* \n :param weightColumn: java.lang.String\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.WSum\n \n*Overload 2* \n :param weightColumn: java.lang.String\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggAbsSum": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggAvg": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggCount": ":param resultColumn: java.lang.String\n:return: io.deephaven.api.agg.Aggregation", + "AggCountDistinct": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param countNulls: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 4* \n :param countNulls: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggDistinct": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param includeNulls: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 4* \n :param includeNulls: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggFirst": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggGroup": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggLast": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggMax": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggMed": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param average: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 4* \n :param average: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggMin": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggPct": "*Overload 1* \n :param percentile: double\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param percentile: double\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param percentile: double\n :param average: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 4* \n :param percentile: double\n :param average: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggSortedFirst": "*Overload 1* \n :param sortedColumn: java.lang.String\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param sortedColumn: java.lang.String\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param sortedColumns: java.util.Collection\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 4* \n :param sortedColumns: java.util.Collection\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggSortedLast": "*Overload 1* \n :param sortedColumn: java.lang.String\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param sortedColumn: java.lang.String\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param sortedColumns: java.util.Collection\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 4* \n :param sortedColumns: java.util.Collection\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggStd": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggSum": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggUnique": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param includeNulls: boolean\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 4* \n :param includeNulls: boolean\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggVar": "*Overload 1* \n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggWAvg": "*Overload 1* \n :param weightColumn: java.lang.String\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param weightColumn: java.lang.String\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "AggWSum": "*Overload 1* \n :param weightColumn: java.lang.String\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 2* \n :param weightColumn: java.lang.String\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", + "of": "*Overload 1* \n :param key: io.deephaven.api.agg.key.Key\n :param pair: java.lang.String\n :return: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 2* \n :param key: io.deephaven.api.agg.key.Key\n :param pairs: java.lang.String...\n :return: io.deephaven.api.agg.KeyedAggregations", "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" }, "path": "io.deephaven.api.agg.Aggregation", diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Aggregation/Visitor.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Aggregation/Visitor.json index b5d849a7787..cb9b4c0c907 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Aggregation/Visitor.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Aggregation/Visitor.json @@ -1,7 +1,7 @@ { "className": "io.deephaven.api.agg.Aggregation$Visitor", "methods": { - "visit": "*Overload 1* \n :param absSum: io.deephaven.api.agg.AbsSum\n \n*Overload 2* \n :param group: io.deephaven.api.agg.Group\n \n*Overload 3* \n :param avg: io.deephaven.api.agg.Avg\n \n*Overload 4* \n :param count: io.deephaven.api.agg.Count\n \n*Overload 5* \n :param countDistinct: io.deephaven.api.agg.CountDistinct\n \n*Overload 6* \n :param distinct: io.deephaven.api.agg.Distinct\n \n*Overload 7* \n :param first: io.deephaven.api.agg.First\n \n*Overload 8* \n :param last: io.deephaven.api.agg.Last\n \n*Overload 9* \n :param max: io.deephaven.api.agg.Max\n \n*Overload 10* \n :param med: io.deephaven.api.agg.Med\n \n*Overload 11* \n :param min: io.deephaven.api.agg.Min\n \n*Overload 12* \n :param multi: io.deephaven.api.agg.Multi\n \n*Overload 13* \n :param pct: io.deephaven.api.agg.Pct\n \n*Overload 14* \n :param sortedFirst: io.deephaven.api.agg.SortedFirst\n \n*Overload 15* \n :param sortedLast: io.deephaven.api.agg.SortedLast\n \n*Overload 16* \n :param std: io.deephaven.api.agg.Std\n \n*Overload 17* \n :param sum: io.deephaven.api.agg.Sum\n \n*Overload 18* \n :param unique: io.deephaven.api.agg.Unique\n \n*Overload 19* \n :param var: io.deephaven.api.agg.Var\n \n*Overload 20* \n :param wAvg: io.deephaven.api.agg.WAvg\n \n*Overload 21* \n :param wSum: io.deephaven.api.agg.WSum" + "visit": "*Overload 1* \n :param count: io.deephaven.api.agg.Count\n \n*Overload 2* \n :param keyedAgg: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 3* \n :param keyedAggs: io.deephaven.api.agg.KeyedAggregations" }, "path": "io.deephaven.api.agg.Aggregation.Visitor", "typeName": "interface" diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationFinisher.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationFinisher.json deleted file mode 100644 index b028e745ba6..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationFinisher.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "className": "io.deephaven.api.agg.AggregationFinisher", - "methods": { - "absSum": ":return: io.deephaven.api.agg.AggregationFinisher", - "avg": ":return: io.deephaven.api.agg.AggregationFinisher", - "countDistinct": "*Overload 1* \n :return: io.deephaven.api.agg.AggregationFinisher\n \n*Overload 2* \n :param countNulls: boolean\n :return: io.deephaven.api.agg.AggregationFinisher", - "distinct": "*Overload 1* \n :return: io.deephaven.api.agg.AggregationFinisher\n \n*Overload 2* \n :param includeNulls: boolean\n :return: io.deephaven.api.agg.AggregationFinisher", - "first": ":return: io.deephaven.api.agg.AggregationFinisher", - "function": ":return: java.util.function.Function", - "group": ":return: io.deephaven.api.agg.AggregationFinisher", - "last": ":return: io.deephaven.api.agg.AggregationFinisher", - "max": ":return: io.deephaven.api.agg.AggregationFinisher", - "med": "*Overload 1* \n :return: io.deephaven.api.agg.AggregationFinisher\n \n*Overload 2* \n :param average: boolean\n :return: io.deephaven.api.agg.AggregationFinisher", - "min": ":return: io.deephaven.api.agg.AggregationFinisher", - "multiOf": ":param arguments: java.lang.String...\n:return: io.deephaven.api.agg.Multi", - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: AggregationFinisher.AGG\n \n*Overload 2* \n :param pairs: io.deephaven.api.agg.Pair...\n :return: io.deephaven.api.agg.Multi\n \n*Overload 3* \n :param arg: java.lang.String\n :return: AggregationFinisher.AGG\n \n*Overload 4* \n :param arguments: java.lang.String...\n :return: io.deephaven.api.agg.Aggregation", - "pct": "*Overload 1* \n :param percentile: double\n :return: io.deephaven.api.agg.AggregationFinisher\n \n*Overload 2* \n :param percentile: double\n :param average: boolean\n :return: io.deephaven.api.agg.AggregationFinisher", - "std": ":return: io.deephaven.api.agg.AggregationFinisher", - "sum": ":return: io.deephaven.api.agg.AggregationFinisher", - "unique": "*Overload 1* \n :return: io.deephaven.api.agg.AggregationFinisher\n \n*Overload 2* \n :param includeNulls: boolean\n :return: io.deephaven.api.agg.AggregationFinisher", - "var": ":return: io.deephaven.api.agg.AggregationFinisher", - "wAvg": ":param weightColumn: io.deephaven.api.ColumnName\n:return: io.deephaven.api.agg.AggregationFinisher", - "wSum": ":param weightColumn: io.deephaven.api.ColumnName\n:return: io.deephaven.api.agg.AggregationFinisher" - }, - "path": "io.deephaven.api.agg.AggregationFinisher", - "text": "The aggregation finisher is a helper to aid in building aggregations whose construction can be finished by a\n Pair. A vararg overload is provided to build a Multi, of(Pair...), which can be useful to\n reduce the syntax required to build multiple aggregations of the same basic type. Helpers are provided that translate\n the string-equivalents via Pair.parse(String).\n\n \n Not all aggregations may be suitable for construction in this style.", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationOptimizer.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationOptimizer.json new file mode 100644 index 00000000000..016809ac705 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationOptimizer.json @@ -0,0 +1,11 @@ +{ + "className": "io.deephaven.api.agg.AggregationOptimizer", + "methods": { + "build": ":return: java.util.List", + "of": "Optimizes a collection of aggregations by grouping like-keyed aggregations together. The\n input order will be preserved based on the key-encountered order.\n\n:param aggregations: (java.util.Collection) - the aggregations\n:return: (java.util.List) the optimized aggregations", + "visit": "*Overload 1* \n :param count: io.deephaven.api.agg.Count\n \n*Overload 2* \n :param keyedAgg: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 3* \n :param keyedAggs: io.deephaven.api.agg.KeyedAggregations" + }, + "path": "io.deephaven.api.agg.AggregationOptimizer", + "text": "Optimizes a collection of aggregations by grouping like-keyed aggregations together.", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationOutputs.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationOutputs.json index 1b8b7e20d72..002532d97b5 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationOutputs.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/AggregationOutputs.json @@ -2,7 +2,7 @@ "className": "io.deephaven.api.agg.AggregationOutputs", "methods": { "of": "*Overload 1* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :return: java.util.stream.Stream\n \n*Overload 2* \n :param aggregations: java.util.Collection\n :return: java.util.stream.Stream", - "visit": "*Overload 1* \n :param absSum: io.deephaven.api.agg.AbsSum\n \n*Overload 2* \n :param group: io.deephaven.api.agg.Group\n \n*Overload 3* \n :param avg: io.deephaven.api.agg.Avg\n \n*Overload 4* \n :param count: io.deephaven.api.agg.Count\n \n*Overload 5* \n :param countDistinct: io.deephaven.api.agg.CountDistinct\n \n*Overload 6* \n :param distinct: io.deephaven.api.agg.Distinct\n \n*Overload 7* \n :param first: io.deephaven.api.agg.First\n \n*Overload 8* \n :param last: io.deephaven.api.agg.Last\n \n*Overload 9* \n :param max: io.deephaven.api.agg.Max\n \n*Overload 10* \n :param med: io.deephaven.api.agg.Med\n \n*Overload 11* \n :param min: io.deephaven.api.agg.Min\n \n*Overload 12* \n :param multi: io.deephaven.api.agg.Multi\n \n*Overload 13* \n :param pct: io.deephaven.api.agg.Pct\n \n*Overload 14* \n :param sortedFirst: io.deephaven.api.agg.SortedFirst\n \n*Overload 15* \n :param sortedLast: io.deephaven.api.agg.SortedLast\n \n*Overload 16* \n :param std: io.deephaven.api.agg.Std\n \n*Overload 17* \n :param sum: io.deephaven.api.agg.Sum\n \n*Overload 18* \n :param unique: io.deephaven.api.agg.Unique\n \n*Overload 19* \n :param var: io.deephaven.api.agg.Var\n \n*Overload 20* \n :param wAvg: io.deephaven.api.agg.WAvg\n \n*Overload 21* \n :param wSum: io.deephaven.api.agg.WSum" + "visit": "*Overload 1* \n :param count: io.deephaven.api.agg.Count\n \n*Overload 2* \n :param keyedAgg: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 3* \n :param keyedAggs: io.deephaven.api.agg.KeyedAggregations" }, "path": "io.deephaven.api.agg.AggregationOutputs", "text": "A visitor to get the ordered output column names for aggregations.", diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Avg.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Avg.json deleted file mode 100644 index 5f4fb8cc9b9..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Avg.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Avg", - "methods": { - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Avg\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Avg", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.Avg", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/CountDistinct.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/CountDistinct.json deleted file mode 100644 index e4e85de139e..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/CountDistinct.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "className": "io.deephaven.api.agg.CountDistinct", - "methods": { - "countNulls": ":return: boolean", - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.CountDistinct\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.CountDistinct", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", - "withNulls": ":return: io.deephaven.api.agg.CountDistinct" - }, - "path": "io.deephaven.api.agg.CountDistinct", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Distinct.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Distinct.json deleted file mode 100644 index 9bdf8e4550e..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Distinct.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Distinct", - "methods": { - "includeNulls": ":return: boolean", - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Distinct\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Distinct", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", - "withNulls": ":return: io.deephaven.api.agg.Distinct" - }, - "path": "io.deephaven.api.agg.Distinct", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/First.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/First.json deleted file mode 100644 index f7862f2eba3..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/First.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.First", - "methods": { - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.First\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.First", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.First", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Group.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Group.json deleted file mode 100644 index c328c6e92e0..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Group.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Group", - "methods": { - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Group\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Group", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.Group", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregation.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregation.json new file mode 100644 index 00000000000..58c2bc2cde0 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregation.json @@ -0,0 +1,12 @@ +{ + "className": "io.deephaven.api.agg.KeyedAggregation", + "methods": { + "key": ":return: io.deephaven.api.agg.key.Key", + "of": ":param key: io.deephaven.api.agg.key.Key\n:param pair: io.deephaven.api.agg.Pair\n:return: io.deephaven.api.agg.KeyedAggregation", + "pair": ":return: io.deephaven.api.agg.Pair", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.KeyedAggregation", + "text": "A keyed aggregation is an Aggregation that is composed of a key and a pair.", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregations.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregations.json new file mode 100644 index 00000000000..6bb70ca5026 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregations.json @@ -0,0 +1,12 @@ +{ + "className": "io.deephaven.api.agg.KeyedAggregations", + "methods": { + "builder": ":return: io.deephaven.api.agg.KeyedAggregations.Builder", + "key": ":return: io.deephaven.api.agg.key.Key", + "pairs": ":return: java.util.List", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.KeyedAggregations", + "text": "Keyed aggregations is an Aggregation that is composed of a key and multiple pairs.", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregations/Builder.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregations/Builder.json new file mode 100644 index 00000000000..d7b7a72b4ea --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/KeyedAggregations/Builder.json @@ -0,0 +1,11 @@ +{ + "className": "io.deephaven.api.agg.KeyedAggregations$Builder", + "methods": { + "addAllPairs": ":param elements: java.lang.Iterable\n:return: io.deephaven.api.agg.KeyedAggregations.Builder", + "addPairs": "*Overload 1* \n :param element: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.KeyedAggregations.Builder\n \n*Overload 2* \n :param elements: io.deephaven.api.agg.Pair...\n :return: io.deephaven.api.agg.KeyedAggregations.Builder", + "build": ":return: io.deephaven.api.agg.KeyedAggregations", + "key": ":param key: io.deephaven.api.agg.key.Key\n:return: io.deephaven.api.agg.KeyedAggregations.Builder" + }, + "path": "io.deephaven.api.agg.KeyedAggregations.Builder", + "typeName": "interface" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Last.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Last.json deleted file mode 100644 index 4d782f64d94..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Last.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Last", - "methods": { - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Last\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Last", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.Last", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Max.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Max.json deleted file mode 100644 index 9c10232f11f..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Max.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Max", - "methods": { - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Max\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Max", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.Max", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Med.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Med.json deleted file mode 100644 index 284d8653151..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Med.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Med", - "methods": { - "averageMedian": ":return: boolean", - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Med\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Med", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", - "withoutAverage": ":return: io.deephaven.api.agg.Med" - }, - "path": "io.deephaven.api.agg.Med", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Min.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Min.json deleted file mode 100644 index 0dd47892cd3..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Min.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Min", - "methods": { - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Min\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Min", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.Min", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Multi.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Multi.json deleted file mode 100644 index 837b27774e5..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Multi.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Multi", - "methods": { - "aggregations": ":return: java.util.List", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.Multi", - "text": "An aggregation that is a list of other aggregations. Useful as a helper when returning an aggregation constructed via\n a varargs parameter.", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Multi/Builder.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Multi/Builder.json deleted file mode 100644 index f894dd0f569..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Multi/Builder.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Multi$Builder", - "methods": { - "addAggregations": "*Overload 1* \n :param element: Multi.Builder.AGG\n :return: io.deephaven.api.agg.Multi.Builder\n \n*Overload 2* \n :param elements: Multi.Builder.AGG...\n :return: io.deephaven.api.agg.Multi.Builder", - "addAllAggregations": ":param elements: java.lang.Iterable\n:return: io.deephaven.api.agg.Multi.Builder", - "build": ":return: io.deephaven.api.agg.Multi" - }, - "path": "io.deephaven.api.agg.Multi.Builder", - "typeName": "interface" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Pair.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Pair.json index 06983266b49..9ac78c6abd5 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Pair.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Pair.json @@ -7,6 +7,6 @@ "parse": ":param x: java.lang.String\n:return: io.deephaven.api.agg.Pair" }, "path": "io.deephaven.api.agg.Pair", - "text": "An aggregation pair represents a input and output column for some\n aggregations. Aggregations that don't have a one-to-one input/output mapping will not need an agg\n pair.", + "text": "A pair represents an input and an output column for a KeyedAggregation.", "typeName": "interface" } \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Pct.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Pct.json deleted file mode 100644 index 3ab2997115f..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Pct.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Pct", - "methods": { - "averageMedian": ":return: boolean", - "of": ":param percentile: double\n:param pair: io.deephaven.api.agg.Pair\n:return: io.deephaven.api.agg.Pct", - "pair": ":return: io.deephaven.api.agg.Pair", - "percentile": ":return: double", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", - "withAverage": ":return: io.deephaven.api.agg.Pct" - }, - "path": "io.deephaven.api.agg.Pct", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedFirst/Builder.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedFirst/Builder.json deleted file mode 100644 index 749169621e0..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedFirst/Builder.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "className": "io.deephaven.api.agg.SortedFirst$Builder", - "methods": { - "addAllColumns": ":param elements: java.lang.Iterable\n:return: io.deephaven.api.agg.SortedFirst.Builder", - "addColumns": "*Overload 1* \n :param element: io.deephaven.api.SortColumn\n :return: io.deephaven.api.agg.SortedFirst.Builder\n \n*Overload 2* \n :param elements: io.deephaven.api.SortColumn...\n :return: io.deephaven.api.agg.SortedFirst.Builder", - "build": ":return: io.deephaven.api.agg.SortedFirst", - "pair": ":param pair: io.deephaven.api.agg.Pair\n:return: io.deephaven.api.agg.SortedFirst.Builder" - }, - "path": "io.deephaven.api.agg.SortedFirst.Builder", - "typeName": "interface" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedLast/Builder.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedLast/Builder.json deleted file mode 100644 index e36fb55c6d5..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedLast/Builder.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "className": "io.deephaven.api.agg.SortedLast$Builder", - "methods": { - "addAllColumns": ":param elements: java.lang.Iterable\n:return: io.deephaven.api.agg.SortedLast.Builder", - "addColumns": "*Overload 1* \n :param element: io.deephaven.api.SortColumn\n :return: io.deephaven.api.agg.SortedLast.Builder\n \n*Overload 2* \n :param elements: io.deephaven.api.SortColumn...\n :return: io.deephaven.api.agg.SortedLast.Builder", - "build": ":return: io.deephaven.api.agg.SortedLast", - "pair": ":param pair: io.deephaven.api.agg.Pair\n:return: io.deephaven.api.agg.SortedLast.Builder" - }, - "path": "io.deephaven.api.agg.SortedLast.Builder", - "typeName": "interface" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Std.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Std.json deleted file mode 100644 index 380b2f90106..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Std.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Std", - "methods": { - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Std\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Std", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.Std", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Sum.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Sum.json deleted file mode 100644 index 120c90f8463..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Sum.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Sum", - "methods": { - "abs": ":return: io.deephaven.api.agg.AbsSum", - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Sum\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Sum", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.Sum", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Unique.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Unique.json deleted file mode 100644 index b79c5ec2dfe..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Unique.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Unique", - "methods": { - "includeNulls": ":return: boolean", - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Unique\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Unique", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", - "withNulls": ":return: io.deephaven.api.agg.Unique" - }, - "path": "io.deephaven.api.agg.Unique", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Var.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/Var.json deleted file mode 100644 index a84080f8996..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/Var.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "className": "io.deephaven.api.agg.Var", - "methods": { - "of": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.Var\n \n*Overload 2* \n :param x: java.lang.String\n :return: io.deephaven.api.agg.Var", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" - }, - "path": "io.deephaven.api.agg.Var", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/WAvg.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/WAvg.json deleted file mode 100644 index 2bfde9083de..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/WAvg.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "className": "io.deephaven.api.agg.WAvg", - "methods": { - "of": ":param weight: io.deephaven.api.ColumnName\n:param addition: io.deephaven.api.agg.Pair\n:return: io.deephaven.api.agg.WAvg", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", - "weight": ":return: io.deephaven.api.ColumnName" - }, - "path": "io.deephaven.api.agg.WAvg", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/WSum.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/WSum.json deleted file mode 100644 index 344ac5b10b3..00000000000 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/WSum.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "className": "io.deephaven.api.agg.WSum", - "methods": { - "of": ":param weight: io.deephaven.api.ColumnName\n:param addition: io.deephaven.api.agg.Pair\n:return: io.deephaven.api.agg.WSum", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", - "weight": ":return: io.deephaven.api.ColumnName" - }, - "path": "io.deephaven.api.agg.WSum", - "typeName": "class" -} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key.json new file mode 100644 index 00000000000..667e040f961 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.api.agg.key.Key", + "methods": { + "aggregation": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 2* \n :param pairs: io.deephaven.api.agg.Pair...\n :return: io.deephaven.api.agg.KeyedAggregations\n \n*Overload 3* \n :param pairs: java.util.Collection\n :return: io.deephaven.api.agg.KeyedAggregations", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.Key", + "text": "A key represents the configurable options for KeyedAggregation, except for the input/output Pair.", + "typeName": "interface" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key/Visitor.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key/Visitor.json new file mode 100644 index 00000000000..5d758bf4db3 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key/Visitor.json @@ -0,0 +1,8 @@ +{ + "className": "io.deephaven.api.agg.key.Key$Visitor", + "methods": { + "visit": "*Overload 1* \n :param absSum: io.deephaven.api.agg.key.KeyAbsSum\n \n*Overload 2* \n :param countDistinct: io.deephaven.api.agg.key.KeyCountDistinct\n \n*Overload 3* \n :param distinct: io.deephaven.api.agg.key.KeyDistinct\n \n*Overload 4* \n :param group: io.deephaven.api.agg.key.KeyGroup\n \n*Overload 5* \n :param avg: io.deephaven.api.agg.key.KeyAvg\n \n*Overload 6* \n :param first: io.deephaven.api.agg.key.KeyFirst\n \n*Overload 7* \n :param last: io.deephaven.api.agg.key.KeyLast\n \n*Overload 8* \n :param max: io.deephaven.api.agg.key.KeyMax\n \n*Overload 9* \n :param median: io.deephaven.api.agg.key.KeyMedian\n \n*Overload 10* \n :param min: io.deephaven.api.agg.key.KeyMin\n \n*Overload 11* \n :param pct: io.deephaven.api.agg.key.KeyPct\n \n*Overload 12* \n :param sortedFirst: io.deephaven.api.agg.key.KeySortedFirst\n \n*Overload 13* \n :param sortedLast: io.deephaven.api.agg.key.KeySortedLast\n \n*Overload 14* \n :param std: io.deephaven.api.agg.key.KeyStd\n \n*Overload 15* \n :param sum: io.deephaven.api.agg.key.KeySum\n \n*Overload 16* \n :param unique: io.deephaven.api.agg.key.KeyUnique\n \n*Overload 17* \n :param wAvg: io.deephaven.api.agg.key.KeyWAvg\n \n*Overload 18* \n :param wSum: io.deephaven.api.agg.key.KeyWSum\n \n*Overload 19* \n :param var: io.deephaven.api.agg.key.KeyVar" + }, + "path": "io.deephaven.api.agg.key.Key.Visitor", + "typeName": "interface" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyAbsSum.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyAbsSum.json new file mode 100644 index 00000000000..0bcf1b3a702 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyAbsSum.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeyAbsSum", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeyAbsSum", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyAbsSum", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyAvg.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyAvg.json new file mode 100644 index 00000000000..cd1f9066716 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyAvg.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeyAvg", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeyAvg", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyAvg", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyBase.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyBase.json new file mode 100644 index 00000000000..bd88c841043 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyBase.json @@ -0,0 +1,8 @@ +{ + "className": "io.deephaven.api.agg.key.KeyBase", + "methods": { + "aggregation": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 2* \n :param pairs: io.deephaven.api.agg.Pair...\n :return: io.deephaven.api.agg.KeyedAggregations\n \n*Overload 3* \n :param pairs: java.util.Collection\n :return: io.deephaven.api.agg.KeyedAggregations" + }, + "path": "io.deephaven.api.agg.key.KeyBase", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyCountDistinct.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyCountDistinct.json new file mode 100644 index 00000000000..11c066c25bd --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyCountDistinct.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.api.agg.key.KeyCountDistinct", + "methods": { + "countNulls": ":return: boolean", + "of": "*Overload 1* \n :return: io.deephaven.api.agg.key.KeyCountDistinct\n \n*Overload 2* \n :param countNulls: boolean\n :return: io.deephaven.api.agg.key.KeyCountDistinct", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyCountDistinct", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyDistinct.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyDistinct.json new file mode 100644 index 00000000000..0132f8593a9 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyDistinct.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.api.agg.key.KeyDistinct", + "methods": { + "includeNulls": ":return: boolean", + "of": "*Overload 1* \n :return: io.deephaven.api.agg.key.KeyDistinct\n \n*Overload 2* \n :param includeNulls: boolean\n :return: io.deephaven.api.agg.key.KeyDistinct", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyDistinct", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyEmptyBase.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyEmptyBase.json new file mode 100644 index 00000000000..98e38ac3193 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyEmptyBase.json @@ -0,0 +1,8 @@ +{ + "className": "io.deephaven.api.agg.key.KeyEmptyBase", + "methods": { + "hashCode": ":return: int" + }, + "path": "io.deephaven.api.agg.key.KeyEmptyBase", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyFirst.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyFirst.json new file mode 100644 index 00000000000..9ddbc573a0a --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyFirst.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeyFirst", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeyFirst", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyFirst", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyGroup.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyGroup.json new file mode 100644 index 00000000000..6ee2d9a6639 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyGroup.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeyGroup", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeyGroup", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyGroup", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyLast.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyLast.json new file mode 100644 index 00000000000..73c27c2a1ef --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyLast.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeyLast", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeyLast", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyLast", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMax.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMax.json new file mode 100644 index 00000000000..f3972566421 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMax.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeyMax", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeyMax", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyMax", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMedian.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMedian.json new file mode 100644 index 00000000000..1f62edbc754 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMedian.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.api.agg.key.KeyMedian", + "methods": { + "averageMedian": ":return: boolean", + "of": "*Overload 1* \n :return: io.deephaven.api.agg.key.KeyMedian\n \n*Overload 2* \n :param averageMedian: boolean\n :return: io.deephaven.api.agg.key.KeyMedian", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyMedian", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMin.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMin.json new file mode 100644 index 00000000000..d67540a9780 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyMin.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeyMin", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeyMin", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyMin", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyPct.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyPct.json new file mode 100644 index 00000000000..f1572bfc4a8 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyPct.json @@ -0,0 +1,12 @@ +{ + "className": "io.deephaven.api.agg.key.KeyPct", + "methods": { + "averageMedian": ":return: boolean", + "of": "*Overload 1* \n :param percentile: double\n :return: io.deephaven.api.agg.key.KeyPct\n \n*Overload 2* \n :param percentile: double\n :param averageMedian: boolean\n :return: io.deephaven.api.agg.key.KeyPct", + "percentile": ":return: double", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", + "withAverage": ":return: io.deephaven.api.agg.key.KeyPct" + }, + "path": "io.deephaven.api.agg.key.KeyPct", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedFirst.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedFirst.json similarity index 50% rename from Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedFirst.json rename to Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedFirst.json index 039c3fd4338..5bc520dd463 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedFirst.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedFirst.json @@ -1,12 +1,11 @@ { - "className": "io.deephaven.api.agg.SortedFirst", + "className": "io.deephaven.api.agg.key.KeySortedFirst", "methods": { - "builder": ":return: io.deephaven.api.agg.SortedFirst.Builder", + "builder": ":return: io.deephaven.api.agg.key.KeySortedFirst.Builder", "columns": ":return: java.util.List", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" }, - "path": "io.deephaven.api.agg.SortedFirst", + "path": "io.deephaven.api.agg.key.KeySortedFirst", "text": "Note: the sorted-first aggregation only supports SortColumn.Order.ASCENDING columns at the moment.", "typeName": "class" } \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedFirst/Builder.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedFirst/Builder.json new file mode 100644 index 00000000000..243dd1f532f --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedFirst/Builder.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.api.agg.key.KeySortedFirst$Builder", + "methods": { + "addAllColumns": ":param elements: java.lang.Iterable\n:return: io.deephaven.api.agg.key.KeySortedFirst.Builder", + "addColumns": "*Overload 1* \n :param element: io.deephaven.api.SortColumn\n :return: io.deephaven.api.agg.key.KeySortedFirst.Builder\n \n*Overload 2* \n :param elements: io.deephaven.api.SortColumn...\n :return: io.deephaven.api.agg.key.KeySortedFirst.Builder", + "build": ":return: io.deephaven.api.agg.key.KeySortedFirst" + }, + "path": "io.deephaven.api.agg.key.KeySortedFirst.Builder", + "typeName": "interface" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedLast.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedLast.json similarity index 50% rename from Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedLast.json rename to Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedLast.json index 497bba94acf..d1660af527b 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/SortedLast.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedLast.json @@ -1,12 +1,11 @@ { - "className": "io.deephaven.api.agg.SortedLast", + "className": "io.deephaven.api.agg.key.KeySortedLast", "methods": { - "builder": ":return: io.deephaven.api.agg.SortedLast.Builder", + "builder": ":return: io.deephaven.api.agg.key.KeySortedLast.Builder", "columns": ":return: java.util.List", - "pair": ":return: io.deephaven.api.agg.Pair", - "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" }, - "path": "io.deephaven.api.agg.SortedLast", + "path": "io.deephaven.api.agg.key.KeySortedLast", "text": "Note: the sorted-last aggregation only supports SortColumn.Order.ASCENDING columns at the moment.", "typeName": "class" } \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedLast/Builder.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedLast/Builder.json new file mode 100644 index 00000000000..5261eaae815 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySortedLast/Builder.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.api.agg.key.KeySortedLast$Builder", + "methods": { + "addAllColumns": ":param elements: java.lang.Iterable\n:return: io.deephaven.api.agg.key.KeySortedLast.Builder", + "addColumns": "*Overload 1* \n :param element: io.deephaven.api.SortColumn\n :return: io.deephaven.api.agg.key.KeySortedLast.Builder\n \n*Overload 2* \n :param elements: io.deephaven.api.SortColumn...\n :return: io.deephaven.api.agg.key.KeySortedLast.Builder", + "build": ":return: io.deephaven.api.agg.key.KeySortedLast" + }, + "path": "io.deephaven.api.agg.key.KeySortedLast.Builder", + "typeName": "interface" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyStd.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyStd.json new file mode 100644 index 00000000000..16874dbd7a9 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyStd.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeyStd", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeyStd", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyStd", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySum.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySum.json new file mode 100644 index 00000000000..bc6ef57c3df --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeySum.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeySum", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeySum", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeySum", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyUnique.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyUnique.json new file mode 100644 index 00000000000..9a3d400767b --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyUnique.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.api.agg.key.KeyUnique", + "methods": { + "includeNulls": ":return: boolean", + "of": "*Overload 1* \n :return: io.deephaven.api.agg.key.KeyUnique\n \n*Overload 2* \n :param includeNulls: boolean\n :return: io.deephaven.api.agg.key.KeyUnique", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyUnique", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyVar.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyVar.json new file mode 100644 index 00000000000..1c418abc694 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyVar.json @@ -0,0 +1,9 @@ +{ + "className": "io.deephaven.api.agg.key.KeyVar", + "methods": { + "of": ":return: io.deephaven.api.agg.key.KeyVar", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.api.agg.key.KeyVar", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyWAvg.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyWAvg.json new file mode 100644 index 00000000000..6aff2fa9b71 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyWAvg.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.api.agg.key.KeyWAvg", + "methods": { + "of": ":param weight: io.deephaven.api.ColumnName\n:return: io.deephaven.api.agg.key.KeyWAvg", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", + "weight": ":return: io.deephaven.api.ColumnName" + }, + "path": "io.deephaven.api.agg.key.KeyWAvg", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyWSum.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyWSum.json new file mode 100644 index 00000000000..ab8b42d7be7 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyWSum.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.api.agg.key.KeyWSum", + "methods": { + "of": ":param weight: io.deephaven.api.ColumnName\n:return: io.deephaven.api.agg.key.KeyWSum", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V", + "weight": ":return: io.deephaven.api.ColumnName" + }, + "path": "io.deephaven.api.agg.key.KeyWSum", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationFactory/AggregationElement.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationFactory/AggregationElement.json index c30a10a95be..d26ab32cd07 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationFactory/AggregationElement.json +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationFactory/AggregationElement.json @@ -1,12 +1,13 @@ { "className": "io.deephaven.engine.table.impl.by.AggregationFactory$AggregationElement", "methods": { - "convert": "**Incompatible overloads text - text from the first overload:**\n\nConverts and the aggregations, only collapsing multi aggregations into single\n elements, leaving singular aggregations as they are.\n\n \n Note: The results will preserve the intended order of the inputs.\n\n*Overload 1* \n :param aggregation: (io.deephaven.api.agg.Aggregation) - The aggregation\n :return: (java.util.List) A list of aggregation elements\n \n*Overload 2* \n :param aggregations: (java.util.Collection) - The aggregation\n :return: (java.util.List) A list of aggregation elements", + "convert": "Converts and the aggregations, only collapsing multi aggregations into single\n elements, leaving singular aggregations as they are.\n\n \n Note: The results will preserve the intended order of the inputs.\n\n:param aggregations: (java.util.Collection) - The aggregation\n:return: (java.util.List) A list of aggregation elements", "forRollup": ":return: io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement", "getMemoKey": ":return: io.deephaven.engine.table.impl.by.AggregationMemoKey", "getResultPairs": ":return: io.deephaven.engine.table.MatchPair[]", "getSourceColumns": ":return: java.lang.String[]", "getSpec": ":return: io.deephaven.engine.table.impl.by.AggregationSpec", + "of": "Converts an Aggregation to an AggregationFactory.AggregationElement.\n\n:param aggregation: (io.deephaven.api.agg.Aggregation) - The aggregation\n:return: (io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement) The aggregation element", "optimizeAndConvert": "Converts and optimizes the aggregations, collapsing relevant aggregations into single\n elements where applicable.\n\n \n Note: due to the optimization, the aggregation elements may not be in the same order as specified in\n aggregations.\n\n:param aggregations: (java.util.Collection) - The aggregation\n:return: (java.util.List) A list of aggregation elements" }, "path": "io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement", diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/select/Formula/FillContext.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/select/Formula/FillContext.json new file mode 100644 index 00000000000..da98fc5092c --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/select/Formula/FillContext.json @@ -0,0 +1,6 @@ +{ + "className": "io.deephaven.engine.table.impl.select.Formula$FillContext", + "methods": {}, + "path": "io.deephaven.engine.table.impl.select.Formula.FillContext", + "typeName": "interface" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/select/Formula/GetContext.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/select/Formula/GetContext.json new file mode 100644 index 00000000000..0c58fd46608 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/select/Formula/GetContext.json @@ -0,0 +1,6 @@ +{ + "className": "io.deephaven.engine.table.impl.select.Formula$GetContext", + "methods": {}, + "path": "io.deephaven.engine.table.impl.select.Formula.GetContext", + "typeName": "interface" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/AggregationTable.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/AggregationTable.json index 72b26008994..98163d69bc7 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/qst/table/AggregationTable.json +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/AggregationTable.json @@ -3,8 +3,6 @@ "methods": { "aggregations": ":return: java.util.List", "builder": ":return: io.deephaven.qst.table.AggregationTable.Builder", - "columns": ":return: java.util.List", - "parent": ":return: io.deephaven.qst.table.TableSpec", "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" }, "path": "io.deephaven.qst.table.AggregationTable", diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/ByTableBase.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/ByTableBase.json index dae21ce744a..2e8b4802418 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/qst/table/ByTableBase.json +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/ByTableBase.json @@ -1,7 +1,8 @@ { "className": "io.deephaven.qst.table.ByTableBase", "methods": { - "columns": ":return: java.util.List" + "columns": ":return: java.util.List", + "parent": ":return: io.deephaven.qst.table.TableSpec" }, "path": "io.deephaven.qst.table.ByTableBase", "typeName": "class" diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/FullAggregationTable.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/FullAggregationTable.json new file mode 100644 index 00000000000..32c304f55a6 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/FullAggregationTable.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.qst.table.FullAggregationTable", + "methods": { + "builder": ":return: io.deephaven.qst.table.FullAggregationTable.Builder", + "key": ":return: io.deephaven.api.agg.key.Key", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.qst.table.FullAggregationTable", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/FullAggregationTable/Builder.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/FullAggregationTable/Builder.json new file mode 100644 index 00000000000..535d4a7b1f3 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/FullAggregationTable/Builder.json @@ -0,0 +1,12 @@ +{ + "className": "io.deephaven.qst.table.FullAggregationTable$Builder", + "methods": { + "addAllColumns": ":param elements: java.lang.Iterable\n:return: io.deephaven.qst.table.FullAggregationTable.Builder", + "addColumns": "*Overload 1* \n :param element: io.deephaven.api.Selectable\n :return: io.deephaven.qst.table.FullAggregationTable.Builder\n \n*Overload 2* \n :param elements: io.deephaven.api.Selectable...\n :return: io.deephaven.qst.table.FullAggregationTable.Builder", + "build": ":return: io.deephaven.qst.table.FullAggregationTable", + "key": ":param key: io.deephaven.api.agg.key.Key\n:return: io.deephaven.qst.table.FullAggregationTable.Builder", + "parent": ":param parent: io.deephaven.qst.table.TableSpec\n:return: io.deephaven.qst.table.FullAggregationTable.Builder" + }, + "path": "io.deephaven.qst.table.FullAggregationTable.Builder", + "typeName": "interface" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/ParentsVisitor.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/ParentsVisitor.json index f31aa54ec25..a99c7287cd6 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/qst/table/ParentsVisitor.json +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/ParentsVisitor.json @@ -8,7 +8,7 @@ "postOrderWalk": "**Incompatible overloads text - text from the first overload:**\n\nInvoke the consumer for each table in the de-duplicated, post-order walk from tables.\n\n \n Post-order means that for any given table, the table's dependencies will come before the table itself. There may\n be multiple valid post-orderings; callers should not rely on a specific post-ordering.\n\n*Overload 1* \n :param tables: (java.lang.Iterable) - the tables\n :param consumer: (java.util.function.Consumer) - the consumer\n \n*Overload 2* \n :param tables: (java.lang.Iterable) - the tables\n :param visitor: (io.deephaven.qst.table.TableSpec.Visitor) - the visitor", "reachable": "Create a reachable set from tables, including tables. May be in any order.\n\n:param tables: (java.lang.Iterable) - the tables\n:return: (java.util.Set) the reachable set", "search": "Performs a search for a table that satisfies searchPredicate. Will follow the dependencies of\n initialInputs. Tables that match excludePaths will not be returned, and will not have its\n dependencies added to the search.\n\n \n Note: a dependency of a table that matches excludePaths will be returned if there is any path to that\n dependency that doesn't go through excludePaths.\n\n:param initialInputs: java.lang.Iterable\n:param excludePaths: java.util.function.Predicate\n:param searchPredicate: java.util.function.Predicate\n:return: java.util.Optional", - "visit": "*Overload 1* \n :param emptyTable: io.deephaven.qst.table.EmptyTable\n \n*Overload 2* \n :param newTable: io.deephaven.qst.table.NewTable\n \n*Overload 3* \n :param timeTable: io.deephaven.qst.table.TimeTable\n \n*Overload 4* \n :param mergeTable: io.deephaven.qst.table.MergeTable\n \n*Overload 5* \n :param headTable: io.deephaven.qst.table.HeadTable\n \n*Overload 6* \n :param tailTable: io.deephaven.qst.table.TailTable\n \n*Overload 7* \n :param reverseTable: io.deephaven.qst.table.ReverseTable\n \n*Overload 8* \n :param sortTable: io.deephaven.qst.table.SortTable\n \n*Overload 9* \n :param snapshotTable: io.deephaven.qst.table.SnapshotTable\n \n*Overload 10* \n :param whereTable: io.deephaven.qst.table.WhereTable\n \n*Overload 11* \n :param whereInTable: io.deephaven.qst.table.WhereInTable\n \n*Overload 12* \n :param whereNotInTable: io.deephaven.qst.table.WhereNotInTable\n \n*Overload 13* \n :param naturalJoinTable: io.deephaven.qst.table.NaturalJoinTable\n \n*Overload 14* \n :param exactJoinTable: io.deephaven.qst.table.ExactJoinTable\n \n*Overload 15* \n :param joinTable: io.deephaven.qst.table.JoinTable\n \n*Overload 16* \n :param leftJoinTable: io.deephaven.qst.table.LeftJoinTable\n \n*Overload 17* \n :param aj: io.deephaven.qst.table.AsOfJoinTable\n \n*Overload 18* \n :param raj: io.deephaven.qst.table.ReverseAsOfJoinTable\n \n*Overload 19* \n :param viewTable: io.deephaven.qst.table.ViewTable\n \n*Overload 20* \n :param selectTable: io.deephaven.qst.table.SelectTable\n \n*Overload 21* \n :param updateViewTable: io.deephaven.qst.table.UpdateViewTable\n \n*Overload 22* \n :param updateTable: io.deephaven.qst.table.UpdateTable\n \n*Overload 23* \n :param groupByTable: io.deephaven.qst.table.GroupByTable\n \n*Overload 24* \n :param aggregationTable: io.deephaven.qst.table.AggregationTable\n \n*Overload 25* \n :param ticketTable: io.deephaven.qst.table.TicketTable\n \n*Overload 26* \n :param inputTable: io.deephaven.qst.table.InputTable" + "visit": "*Overload 1* \n :param emptyTable: io.deephaven.qst.table.EmptyTable\n \n*Overload 2* \n :param newTable: io.deephaven.qst.table.NewTable\n \n*Overload 3* \n :param timeTable: io.deephaven.qst.table.TimeTable\n \n*Overload 4* \n :param mergeTable: io.deephaven.qst.table.MergeTable\n \n*Overload 5* \n :param headTable: io.deephaven.qst.table.HeadTable\n \n*Overload 6* \n :param tailTable: io.deephaven.qst.table.TailTable\n \n*Overload 7* \n :param reverseTable: io.deephaven.qst.table.ReverseTable\n \n*Overload 8* \n :param sortTable: io.deephaven.qst.table.SortTable\n \n*Overload 9* \n :param snapshotTable: io.deephaven.qst.table.SnapshotTable\n \n*Overload 10* \n :param whereTable: io.deephaven.qst.table.WhereTable\n \n*Overload 11* \n :param whereInTable: io.deephaven.qst.table.WhereInTable\n \n*Overload 12* \n :param whereNotInTable: io.deephaven.qst.table.WhereNotInTable\n \n*Overload 13* \n :param naturalJoinTable: io.deephaven.qst.table.NaturalJoinTable\n \n*Overload 14* \n :param exactJoinTable: io.deephaven.qst.table.ExactJoinTable\n \n*Overload 15* \n :param joinTable: io.deephaven.qst.table.JoinTable\n \n*Overload 16* \n :param leftJoinTable: io.deephaven.qst.table.LeftJoinTable\n \n*Overload 17* \n :param aj: io.deephaven.qst.table.AsOfJoinTable\n \n*Overload 18* \n :param raj: io.deephaven.qst.table.ReverseAsOfJoinTable\n \n*Overload 19* \n :param viewTable: io.deephaven.qst.table.ViewTable\n \n*Overload 20* \n :param selectTable: io.deephaven.qst.table.SelectTable\n \n*Overload 21* \n :param updateViewTable: io.deephaven.qst.table.UpdateViewTable\n \n*Overload 22* \n :param updateTable: io.deephaven.qst.table.UpdateTable\n \n*Overload 23* \n :param singleAggregationTable: io.deephaven.qst.table.SingleAggregationTable\n \n*Overload 24* \n :param aggregationTable: io.deephaven.qst.table.AggregationTable\n \n*Overload 25* \n :param ticketTable: io.deephaven.qst.table.TicketTable\n \n*Overload 26* \n :param inputTable: io.deephaven.qst.table.InputTable" }, "path": "io.deephaven.qst.table.ParentsVisitor", "text": "A visitor that returns the parent tables (if any) of the given table.", diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/SingleAggregationTable.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/SingleAggregationTable.json new file mode 100644 index 00000000000..922997dff05 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/SingleAggregationTable.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.qst.table.SingleAggregationTable", + "methods": { + "builder": ":return: io.deephaven.qst.table.SingleAggregationTable.Builder", + "key": ":return: io.deephaven.api.agg.key.Key", + "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" + }, + "path": "io.deephaven.qst.table.SingleAggregationTable", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/SingleAggregationTable/Builder.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/SingleAggregationTable/Builder.json new file mode 100644 index 00000000000..cfa1548f4df --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/SingleAggregationTable/Builder.json @@ -0,0 +1,12 @@ +{ + "className": "io.deephaven.qst.table.SingleAggregationTable$Builder", + "methods": { + "addAllColumns": ":param elements: java.lang.Iterable\n:return: io.deephaven.qst.table.SingleAggregationTable.Builder", + "addColumns": "*Overload 1* \n :param element: io.deephaven.api.Selectable\n :return: io.deephaven.qst.table.SingleAggregationTable.Builder\n \n*Overload 2* \n :param elements: io.deephaven.api.Selectable...\n :return: io.deephaven.qst.table.SingleAggregationTable.Builder", + "build": ":return: io.deephaven.qst.table.SingleAggregationTable", + "key": ":param key: io.deephaven.api.agg.key.Key\n:return: io.deephaven.qst.table.SingleAggregationTable.Builder", + "parent": ":param parent: io.deephaven.qst.table.TableSpec\n:return: io.deephaven.qst.table.SingleAggregationTable.Builder" + }, + "path": "io.deephaven.qst.table.SingleAggregationTable.Builder", + "typeName": "interface" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableBase.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableBase.json index e02b5cb803a..bf8e67067fb 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableBase.json +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableBase.json @@ -4,7 +4,7 @@ "aggBy": "*Overload 1* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 2* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 3* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 4* \n :param aggregations: java.util.Collection\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 5* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 6* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.qst.table.AggregationTable", "aj": "**Incompatible overloads text - text from the first overload:**\n\nPerform an as-of join with the rightTable.\n\n \n Delegates to TableOperations.aj(Object, Collection, Collection, AsOfJoinRule).\n\n*Overload 1* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :return: (io.deephaven.qst.table.AsOfJoinTable) a new table joined according to the specification in columnsToMatch\n \n*Overload 2* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n :return: (io.deephaven.qst.table.AsOfJoinTable) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 3* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (io.deephaven.qst.table.AsOfJoinTable) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 4* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :param asOfJoinRule: (io.deephaven.api.AsOfJoinRule) - The binary search operator for the last match pair.\n :return: (io.deephaven.qst.table.AsOfJoinTable) a new table joined according to the specification in columnsToMatch and columnsToAdd", "exactJoin": "**Incompatible overloads text - text from the first overload:**\n\nPerform an exact-join with the rightTable.\n\n \n Delegates to TableOperations.exactJoin(Object, Collection, Collection).\n\n*Overload 1* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (io.deephaven.qst.table.ExactJoinTable) the exact-joined table\n \n*Overload 2* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :return: (io.deephaven.qst.table.ExactJoinTable) the exact-joined table\n \n*Overload 3* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the right side that need to be added to the left\n side as a result of the match.\n :return: (io.deephaven.qst.table.ExactJoinTable) the exact-joined table", - "groupBy": "*Overload 1* \n :return: io.deephaven.qst.table.GroupByTable\n \n*Overload 2* \n :param groupByColumns: java.lang.String...\n :return: io.deephaven.qst.table.GroupByTable\n \n*Overload 3* \n :param groupByColumns: java.util.Collection\n :return: io.deephaven.qst.table.GroupByTable", + "groupBy": "*Overload 1* \n :return: io.deephaven.qst.table.SingleAggregationTable\n \n*Overload 2* \n :param groupByColumns: java.lang.String...\n :return: io.deephaven.qst.table.SingleAggregationTable\n \n*Overload 3* \n :param groupByColumns: java.util.Collection\n :return: io.deephaven.qst.table.SingleAggregationTable", "head": ":param size: long\n:return: io.deephaven.qst.table.HeadTable", "join": "**Incompatible overloads text - text from the first overload:**\n\nPerform a cross join with the rightTable.\n\n \n Delegates to TableOperations.join(Object, Collection, Collection, int).\n\n*Overload 1* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (io.deephaven.qst.table.JoinTable) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 2* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :param reserveBits: (int) - The number of bits to reserve for rightTable groups.\n :return: (io.deephaven.qst.table.JoinTable) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 3* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :return: (io.deephaven.qst.table.JoinTable) a new table joined according to the specification in columnsToMatch and includes all non-key-columns from\n the right table\n \n*Overload 4* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the right side that need to be added to the left\n side as a result of the match.\n :return: (io.deephaven.qst.table.JoinTable) a new table joined according to the specification in columnsToMatch and columnsToAdd", "leftJoin": "**Incompatible overloads text - text from the first overload:**\n\nPerform a left-join with the rightTable.\n\n \n Delegates to TableOperations.leftJoin(Object, Collection, Collection).\n\n*Overload 1* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :return: (io.deephaven.qst.table.LeftJoinTable) the left-joined table\n \n*Overload 2* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the right side that need to be added to the left\n side as a result of the match.\n :return: (io.deephaven.qst.table.LeftJoinTable) the left-joined table\n \n*Overload 3* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (io.deephaven.qst.table.LeftJoinTable) a table that has one column for each original table's columns, and one column corresponding to each\n column listed in columnsToAdd. If columnsToAdd.isEmpty() one column corresponding to each column\n of the input table (right table) columns whose names don't overlap with the name of a column from the\n source table is added. The new columns (those corresponding to the input table) contain an aggregation of\n all values from the left side that match the join criteria.", diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableSpec/Visitor.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableSpec/Visitor.json index 6620f97466b..c02a86a349c 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableSpec/Visitor.json +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableSpec/Visitor.json @@ -1,7 +1,7 @@ { "className": "io.deephaven.qst.table.TableSpec$Visitor", "methods": { - "visit": "*Overload 1* \n :param emptyTable: io.deephaven.qst.table.EmptyTable\n \n*Overload 2* \n :param newTable: io.deephaven.qst.table.NewTable\n \n*Overload 3* \n :param timeTable: io.deephaven.qst.table.TimeTable\n \n*Overload 4* \n :param mergeTable: io.deephaven.qst.table.MergeTable\n \n*Overload 5* \n :param headTable: io.deephaven.qst.table.HeadTable\n \n*Overload 6* \n :param tailTable: io.deephaven.qst.table.TailTable\n \n*Overload 7* \n :param reverseTable: io.deephaven.qst.table.ReverseTable\n \n*Overload 8* \n :param sortTable: io.deephaven.qst.table.SortTable\n \n*Overload 9* \n :param snapshotTable: io.deephaven.qst.table.SnapshotTable\n \n*Overload 10* \n :param whereTable: io.deephaven.qst.table.WhereTable\n \n*Overload 11* \n :param whereInTable: io.deephaven.qst.table.WhereInTable\n \n*Overload 12* \n :param whereNotInTable: io.deephaven.qst.table.WhereNotInTable\n \n*Overload 13* \n :param naturalJoinTable: io.deephaven.qst.table.NaturalJoinTable\n \n*Overload 14* \n :param exactJoinTable: io.deephaven.qst.table.ExactJoinTable\n \n*Overload 15* \n :param joinTable: io.deephaven.qst.table.JoinTable\n \n*Overload 16* \n :param leftJoinTable: io.deephaven.qst.table.LeftJoinTable\n \n*Overload 17* \n :param aj: io.deephaven.qst.table.AsOfJoinTable\n \n*Overload 18* \n :param raj: io.deephaven.qst.table.ReverseAsOfJoinTable\n \n*Overload 19* \n :param viewTable: io.deephaven.qst.table.ViewTable\n \n*Overload 20* \n :param selectTable: io.deephaven.qst.table.SelectTable\n \n*Overload 21* \n :param updateViewTable: io.deephaven.qst.table.UpdateViewTable\n \n*Overload 22* \n :param updateTable: io.deephaven.qst.table.UpdateTable\n \n*Overload 23* \n :param groupByTable: io.deephaven.qst.table.GroupByTable\n \n*Overload 24* \n :param aggregationTable: io.deephaven.qst.table.AggregationTable\n \n*Overload 25* \n :param ticketTable: io.deephaven.qst.table.TicketTable\n \n*Overload 26* \n :param inputTable: io.deephaven.qst.table.InputTable" + "visit": "*Overload 1* \n :param emptyTable: io.deephaven.qst.table.EmptyTable\n \n*Overload 2* \n :param newTable: io.deephaven.qst.table.NewTable\n \n*Overload 3* \n :param timeTable: io.deephaven.qst.table.TimeTable\n \n*Overload 4* \n :param mergeTable: io.deephaven.qst.table.MergeTable\n \n*Overload 5* \n :param headTable: io.deephaven.qst.table.HeadTable\n \n*Overload 6* \n :param tailTable: io.deephaven.qst.table.TailTable\n \n*Overload 7* \n :param reverseTable: io.deephaven.qst.table.ReverseTable\n \n*Overload 8* \n :param sortTable: io.deephaven.qst.table.SortTable\n \n*Overload 9* \n :param snapshotTable: io.deephaven.qst.table.SnapshotTable\n \n*Overload 10* \n :param whereTable: io.deephaven.qst.table.WhereTable\n \n*Overload 11* \n :param whereInTable: io.deephaven.qst.table.WhereInTable\n \n*Overload 12* \n :param whereNotInTable: io.deephaven.qst.table.WhereNotInTable\n \n*Overload 13* \n :param naturalJoinTable: io.deephaven.qst.table.NaturalJoinTable\n \n*Overload 14* \n :param exactJoinTable: io.deephaven.qst.table.ExactJoinTable\n \n*Overload 15* \n :param joinTable: io.deephaven.qst.table.JoinTable\n \n*Overload 16* \n :param leftJoinTable: io.deephaven.qst.table.LeftJoinTable\n \n*Overload 17* \n :param aj: io.deephaven.qst.table.AsOfJoinTable\n \n*Overload 18* \n :param raj: io.deephaven.qst.table.ReverseAsOfJoinTable\n \n*Overload 19* \n :param viewTable: io.deephaven.qst.table.ViewTable\n \n*Overload 20* \n :param selectTable: io.deephaven.qst.table.SelectTable\n \n*Overload 21* \n :param updateViewTable: io.deephaven.qst.table.UpdateViewTable\n \n*Overload 22* \n :param updateTable: io.deephaven.qst.table.UpdateTable\n \n*Overload 23* \n :param aggregationTable: io.deephaven.qst.table.AggregationTable\n \n*Overload 24* \n :param singleAggregationTable: io.deephaven.qst.table.SingleAggregationTable\n \n*Overload 25* \n :param ticketTable: io.deephaven.qst.table.TicketTable\n \n*Overload 26* \n :param inputTable: io.deephaven.qst.table.InputTable" }, "path": "io.deephaven.qst.table.TableSpec.Visitor", "typeName": "interface" diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableVisitorGeneric.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableVisitorGeneric.json index a933ffb5fbd..f7cebb4dbaf 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableVisitorGeneric.json +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableVisitorGeneric.json @@ -2,7 +2,7 @@ "className": "io.deephaven.qst.table.TableVisitorGeneric", "methods": { "accept": ":param t: io.deephaven.qst.table.TableSpec", - "visit": "*Overload 1* \n :param emptyTable: io.deephaven.qst.table.EmptyTable\n \n*Overload 2* \n :param newTable: io.deephaven.qst.table.NewTable\n \n*Overload 3* \n :param timeTable: io.deephaven.qst.table.TimeTable\n \n*Overload 4* \n :param mergeTable: io.deephaven.qst.table.MergeTable\n \n*Overload 5* \n :param headTable: io.deephaven.qst.table.HeadTable\n \n*Overload 6* \n :param tailTable: io.deephaven.qst.table.TailTable\n \n*Overload 7* \n :param reverseTable: io.deephaven.qst.table.ReverseTable\n \n*Overload 8* \n :param sortTable: io.deephaven.qst.table.SortTable\n \n*Overload 9* \n :param snapshotTable: io.deephaven.qst.table.SnapshotTable\n \n*Overload 10* \n :param whereTable: io.deephaven.qst.table.WhereTable\n \n*Overload 11* \n :param whereInTable: io.deephaven.qst.table.WhereInTable\n \n*Overload 12* \n :param whereNotInTable: io.deephaven.qst.table.WhereNotInTable\n \n*Overload 13* \n :param naturalJoinTable: io.deephaven.qst.table.NaturalJoinTable\n \n*Overload 14* \n :param exactJoinTable: io.deephaven.qst.table.ExactJoinTable\n \n*Overload 15* \n :param joinTable: io.deephaven.qst.table.JoinTable\n \n*Overload 16* \n :param leftJoinTable: io.deephaven.qst.table.LeftJoinTable\n \n*Overload 17* \n :param aj: io.deephaven.qst.table.AsOfJoinTable\n \n*Overload 18* \n :param raj: io.deephaven.qst.table.ReverseAsOfJoinTable\n \n*Overload 19* \n :param viewTable: io.deephaven.qst.table.ViewTable\n \n*Overload 20* \n :param selectTable: io.deephaven.qst.table.SelectTable\n \n*Overload 21* \n :param updateViewTable: io.deephaven.qst.table.UpdateViewTable\n \n*Overload 22* \n :param updateTable: io.deephaven.qst.table.UpdateTable\n \n*Overload 23* \n :param groupByTable: io.deephaven.qst.table.GroupByTable\n \n*Overload 24* \n :param aggregationTable: io.deephaven.qst.table.AggregationTable\n \n*Overload 25* \n :param ticketTable: io.deephaven.qst.table.TicketTable\n \n*Overload 26* \n :param inputTable: io.deephaven.qst.table.InputTable" + "visit": "*Overload 1* \n :param emptyTable: io.deephaven.qst.table.EmptyTable\n \n*Overload 2* \n :param newTable: io.deephaven.qst.table.NewTable\n \n*Overload 3* \n :param timeTable: io.deephaven.qst.table.TimeTable\n \n*Overload 4* \n :param mergeTable: io.deephaven.qst.table.MergeTable\n \n*Overload 5* \n :param headTable: io.deephaven.qst.table.HeadTable\n \n*Overload 6* \n :param tailTable: io.deephaven.qst.table.TailTable\n \n*Overload 7* \n :param reverseTable: io.deephaven.qst.table.ReverseTable\n \n*Overload 8* \n :param sortTable: io.deephaven.qst.table.SortTable\n \n*Overload 9* \n :param snapshotTable: io.deephaven.qst.table.SnapshotTable\n \n*Overload 10* \n :param whereTable: io.deephaven.qst.table.WhereTable\n \n*Overload 11* \n :param whereInTable: io.deephaven.qst.table.WhereInTable\n \n*Overload 12* \n :param whereNotInTable: io.deephaven.qst.table.WhereNotInTable\n \n*Overload 13* \n :param naturalJoinTable: io.deephaven.qst.table.NaturalJoinTable\n \n*Overload 14* \n :param exactJoinTable: io.deephaven.qst.table.ExactJoinTable\n \n*Overload 15* \n :param joinTable: io.deephaven.qst.table.JoinTable\n \n*Overload 16* \n :param leftJoinTable: io.deephaven.qst.table.LeftJoinTable\n \n*Overload 17* \n :param aj: io.deephaven.qst.table.AsOfJoinTable\n \n*Overload 18* \n :param raj: io.deephaven.qst.table.ReverseAsOfJoinTable\n \n*Overload 19* \n :param viewTable: io.deephaven.qst.table.ViewTable\n \n*Overload 20* \n :param selectTable: io.deephaven.qst.table.SelectTable\n \n*Overload 21* \n :param updateViewTable: io.deephaven.qst.table.UpdateViewTable\n \n*Overload 22* \n :param updateTable: io.deephaven.qst.table.UpdateTable\n \n*Overload 23* \n :param singleAggregationTable: io.deephaven.qst.table.SingleAggregationTable\n \n*Overload 24* \n :param aggregationTable: io.deephaven.qst.table.AggregationTable\n \n*Overload 25* \n :param ticketTable: io.deephaven.qst.table.TicketTable\n \n*Overload 26* \n :param inputTable: io.deephaven.qst.table.InputTable" }, "path": "io.deephaven.qst.table.TableVisitorGeneric", "typeName": "class" diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationAdapterOptimized.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationAdapterOptimized.java deleted file mode 100644 index 56f2623b4fb..00000000000 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationAdapterOptimized.java +++ /dev/null @@ -1,346 +0,0 @@ -package io.deephaven.engine.table.impl.by; - -import io.deephaven.api.ColumnName; -import io.deephaven.api.SortColumn; -import io.deephaven.api.agg.*; -import io.deephaven.engine.table.MatchPair; -import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement; -import io.deephaven.tuple.generated.ByteDoubleTuple; - -import java.util.*; - -/** - * Utility for converting collections of {@link Aggregation aggregations} to collections of {@link AggregationElement}, - * grouping compatible aggregations in order to allow optimizations at execution time. - */ -class AggregationAdapterOptimized implements Aggregation.Visitor { - - private final List absSums = new ArrayList<>(); - private final List arrays = new ArrayList<>(); - private final List avgs = new ArrayList<>(); - private final List counts = new ArrayList<>(); - private final Map> countDistincts = new HashMap<>(); - private final Map> distincts = new HashMap<>(); - private final List firsts = new ArrayList<>(); - private final List lasts = new ArrayList<>(); - private final List maxs = new ArrayList<>(); - private final Map> medians = new HashMap<>(); - private final List mins = new ArrayList<>(); - private final Map> pcts = new HashMap<>(); - private final Map, List> sortedFirsts = new HashMap<>(); - private final Map, List> sortedLasts = new HashMap<>(); - private final List stds = new ArrayList<>(); - private final List sums = new ArrayList<>(); - private final Map> uniques = new HashMap<>(); - private final List vars = new ArrayList<>(); - private final Map> wAvgs = new HashMap<>(); - private final Map> wSums = new HashMap<>(); - - /** - * We'll do our best to maintain the original aggregation ordering. This will maintain the user-specified order as - * long as the user aggregation types were all next to each other. - *

- * ie: - *

- * {@code aggBy([ Sum.of(A), Sum.of(B), Avg.of(C), Avg.of(D) ], ...)} will not need to be re-ordered - *

- * {@code aggBy([ Sum.of(A), Avg.of(C), Avg.of(D), Sum.of(B) ], ...)} will need to be re-ordered - */ - private final LinkedHashSet buildOrder = new LinkedHashSet<>(); - - @FunctionalInterface - private interface BuildLogic { - void appendTo(List outs); - } - - // Unfortunately, it doesn't look like we can add ad-hoc lambdas to buildOrder, they don't appear to be equal - // across multiple constructions. - private final BuildLogic buildAbsSums = this::buildAbsSums; - private final BuildLogic buildArrays = this::buildArrays; - private final BuildLogic buildAvgs = this::buildAvgs; - private final BuildLogic buildCounts = this::buildCounts; - private final BuildLogic buildCountDistincts = this::buildCountDistincts; - private final BuildLogic buildDistincts = this::buildDistincts; - private final BuildLogic buildFirsts = this::buildFirsts; - private final BuildLogic buildLasts = this::buildLasts; - private final BuildLogic buildMaxes = this::buildMaxes; - private final BuildLogic buildMedians = this::buildMedians; - private final BuildLogic buildMins = this::buildMins; - private final BuildLogic buildPcts = this::buildPcts; - private final BuildLogic buildSortedFirsts = this::buildSortedFirsts; - private final BuildLogic buildSortedLasts = this::buildSortedLasts; - private final BuildLogic buildStds = this::buildStds; - private final BuildLogic buildSums = this::buildSums; - private final BuildLogic buildUniques = this::buildUniques; - private final BuildLogic buildVars = this::buildVars; - private final BuildLogic buildWAvgs = this::buildWAvgs; - private final BuildLogic buildWSums = this::buildWSums; - - - List build() { - List aggs = new ArrayList<>(); - for (BuildLogic buildLogic : buildOrder) { - buildLogic.appendTo(aggs); - } - return aggs; - } - - private void buildWSums(List aggs) { - for (Map.Entry> e : wSums.entrySet()) { - aggs.add(AggregationFactory.Agg(new WeightedSumSpecImpl(e.getKey().name()), - MatchPair.fromPairs(e.getValue()))); - } - } - - private void buildWAvgs(List aggs) { - for (Map.Entry> e : wAvgs.entrySet()) { - aggs.add(AggregationFactory.Agg(new WeightedAverageSpecImpl(e.getKey().name()), - MatchPair.fromPairs(e.getValue()))); - } - } - - private void buildVars(List aggs) { - if (!vars.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.Var, MatchPair.fromPairs(vars))); - } - } - - private void buildUniques(List aggs) { - for (Map.Entry> e : uniques.entrySet()) { - aggs.add(AggregationFactory.Agg(new UniqueSpec(e.getKey()), MatchPair.fromPairs(e.getValue()))); - } - } - - private void buildSums(List aggs) { - if (!sums.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.Sum, MatchPair.fromPairs(sums))); - } - } - - private void buildStds(List aggs) { - if (!stds.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.Std, MatchPair.fromPairs(stds))); - } - } - - private void buildSortedLasts(List aggs) { - for (Map.Entry, List> e : sortedLasts.entrySet()) { - // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction - String[] columns = - e.getKey().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new); - aggs.add(AggregationFactory.Agg(new SortedLastBy(columns), MatchPair.fromPairs(e.getValue()))); - } - } - - private void buildSortedFirsts(List aggs) { - for (Map.Entry, List> e : sortedFirsts.entrySet()) { - // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction - String[] columns = - e.getKey().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new); - aggs.add(AggregationFactory.Agg(new SortedFirstBy(columns), MatchPair.fromPairs(e.getValue()))); - } - } - - private void buildPcts(List aggs) { - for (Map.Entry> e : pcts.entrySet()) { - aggs.add(AggregationFactory.Agg(new PercentileBySpecImpl(e.getKey().getSecondElement(), - e.getKey().getFirstElement() != 0), MatchPair.fromPairs(e.getValue()))); - } - } - - private void buildMins(List aggs) { - if (!mins.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.Min, MatchPair.fromPairs(mins))); - } - } - - private void buildMedians(List aggs) { - for (Map.Entry> e : medians.entrySet()) { - aggs.add(AggregationFactory.Agg(new PercentileBySpecImpl(0.50d, e.getKey()), - MatchPair.fromPairs(e.getValue()))); - } - } - - private void buildMaxes(List aggs) { - if (!maxs.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.Max, MatchPair.fromPairs(maxs))); - } - } - - private void buildLasts(List aggs) { - if (!lasts.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.Last, MatchPair.fromPairs(lasts))); - } - } - - private void buildFirsts(List aggs) { - if (!firsts.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.First, MatchPair.fromPairs(firsts))); - } - } - - private void buildDistincts(List aggs) { - for (Map.Entry> e : distincts.entrySet()) { - aggs.add(AggregationFactory.Agg(new DistinctSpec(e.getKey()), MatchPair.fromPairs(e.getValue()))); - } - } - - private void buildCountDistincts(List aggs) { - for (Map.Entry> e : countDistincts.entrySet()) { - aggs.add(AggregationFactory.Agg(new CountDistinctSpec(e.getKey()), MatchPair.fromPairs(e.getValue()))); - } - } - - private void buildCounts(List aggs) { - for (ColumnName count : counts) { - aggs.add(new AggregationFactory.CountAggregationElement(count.name())); - } - } - - private void buildAvgs(List aggs) { - if (!avgs.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.Avg, MatchPair.fromPairs(avgs))); - } - } - - private void buildArrays(List aggs) { - if (!arrays.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.Group, MatchPair.fromPairs(arrays))); - } - } - - private void buildAbsSums(List aggs) { - if (!absSums.isEmpty()) { - aggs.add(AggregationFactory.Agg(AggType.AbsSum, MatchPair.fromPairs(absSums))); - } - } - - @Override - public void visit(AbsSum absSum) { - absSums.add(absSum.pair()); - buildOrder.add(buildAbsSums); - } - - @Override - public void visit(Group group) { - arrays.add(group.pair()); - buildOrder.add(buildArrays); - } - - @Override - public void visit(Avg avg) { - avgs.add(avg.pair()); - buildOrder.add(buildAvgs); - } - - @Override - public void visit(Count count) { - counts.add(count.column()); - buildOrder.add(buildCounts); - } - - @Override - public void visit(CountDistinct countDistinct) { - countDistincts.computeIfAbsent(countDistinct.countNulls(), b -> new ArrayList<>()) - .add(countDistinct.pair()); - buildOrder.add(buildCountDistincts); - } - - @Override - public void visit(Distinct distinct) { - distincts.computeIfAbsent(distinct.includeNulls(), b -> new ArrayList<>()).add(distinct.pair()); - buildOrder.add(buildDistincts); - } - - @Override - public void visit(First first) { - firsts.add(first.pair()); - buildOrder.add(buildFirsts); - } - - @Override - public void visit(Last last) { - lasts.add(last.pair()); - buildOrder.add(buildLasts); - } - - @Override - public void visit(Max max) { - maxs.add(max.pair()); - buildOrder.add(buildMaxes); - } - - @Override - public void visit(Med med) { - medians.computeIfAbsent(med.averageMedian(), b -> new ArrayList<>()).add(med.pair()); - buildOrder.add(buildMedians); - } - - @Override - public void visit(Min min) { - mins.add(min.pair()); - buildOrder.add(buildMins); - } - - @Override - public void visit(Multi multi) { - for (Aggregation aggregation : multi.aggregations()) { - aggregation.walk(this); - } - } - - @Override - public void visit(Pct pct) { - pcts.computeIfAbsent(new ByteDoubleTuple(pct.averageMedian() ? (byte) 1 : (byte) 0, pct.percentile()), - b -> new ArrayList<>()).add(pct.pair()); - buildOrder.add(buildPcts); - } - - @Override - public void visit(SortedFirst sortedFirst) { - sortedFirsts.computeIfAbsent(sortedFirst.columns(), b -> new ArrayList<>()).add(sortedFirst.pair()); - buildOrder.add(buildSortedFirsts); - } - - @Override - public void visit(SortedLast sortedLast) { - sortedLasts.computeIfAbsent(sortedLast.columns(), b -> new ArrayList<>()).add(sortedLast.pair()); - buildOrder.add(buildSortedLasts); - } - - @Override - public void visit(Std std) { - stds.add(std.pair()); - buildOrder.add(buildStds); - } - - @Override - public void visit(Sum sum) { - sums.add(sum.pair()); - buildOrder.add(buildSums); - } - - @Override - public void visit(Unique unique) { - uniques.computeIfAbsent(unique.includeNulls(), b -> new ArrayList<>()).add(unique.pair()); - buildOrder.add(buildUniques); - } - - @Override - public void visit(Var var) { - vars.add(var.pair()); - buildOrder.add(buildVars); - } - - @Override - public void visit(WAvg wAvg) { - wAvgs.computeIfAbsent(wAvg.weight(), b -> new ArrayList<>()).add(wAvg.pair()); - buildOrder.add(buildWAvgs); - } - - @Override - public void visit(WSum wSum) { - wSums.computeIfAbsent(wSum.weight(), b -> new ArrayList<>()).add(wSum.pair()); - buildOrder.add(buildWSums); - } -} diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationAdapterOrdered.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationAdapterOrdered.java deleted file mode 100644 index ca550dead62..00000000000 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationAdapterOrdered.java +++ /dev/null @@ -1,143 +0,0 @@ -package io.deephaven.engine.table.impl.by; - -import io.deephaven.api.ColumnName; -import io.deephaven.api.SortColumn; -import io.deephaven.api.agg.*; -import io.deephaven.engine.table.MatchPair; -import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement; - -import java.util.ArrayList; -import java.util.List; - -/** - * Utility for converting collections of {@link Aggregation aggregations} to collections of {@link AggregationElement} - * in strict order with no coalescing/optimization. - */ -class AggregationAdapterOrdered implements Aggregation.Visitor { - - private final List aggs = new ArrayList<>(); - - List build() { - return aggs; - } - - @Override - public void visit(AbsSum absSum) { - aggs.add(AggregationFactory.Agg(AggType.AbsSum, MatchPair.of(absSum.pair()))); - } - - @Override - public void visit(Group group) { - aggs.add(AggregationFactory.Agg(AggType.Group, MatchPair.of(group.pair()))); - } - - @Override - public void visit(Avg avg) { - aggs.add(AggregationFactory.Agg(AggType.Avg, MatchPair.of(avg.pair()))); - } - - @Override - public void visit(Count count) { - aggs.add(new AggregationFactory.CountAggregationElement(count.column().name())); - } - - @Override - public void visit(CountDistinct countDistinct) { - aggs.add(AggregationFactory.Agg(new CountDistinctSpec(countDistinct.countNulls()), - MatchPair.of(countDistinct.pair()))); - } - - @Override - public void visit(Distinct distinct) { - aggs.add(AggregationFactory.Agg(new DistinctSpec(distinct.includeNulls()), MatchPair.of(distinct.pair()))); - } - - @Override - public void visit(First first) { - aggs.add(AggregationFactory.Agg(AggType.First, MatchPair.of(first.pair()))); - } - - @Override - public void visit(Last last) { - aggs.add(AggregationFactory.Agg(AggType.Last, MatchPair.of(last.pair()))); - } - - @Override - public void visit(Max max) { - aggs.add(AggregationFactory.Agg(AggType.Max, MatchPair.of(max.pair()))); - } - - @Override - public void visit(Med med) { - aggs.add( - AggregationFactory.Agg(new PercentileBySpecImpl(0.50d, med.averageMedian()), MatchPair.of(med.pair()))); - } - - @Override - public void visit(Min min) { - aggs.add(AggregationFactory.Agg(AggType.Min, MatchPair.of(min.pair()))); - } - - @Override - public void visit(Multi multi) { - final List forMulti = AggregationFactory.AggregationElement.convert(multi); - if (forMulti.size() > 1) { - throw new IllegalArgumentException( - "Expected all elements in a Multi to map to a single operator, encountered aggregations: " - + multi.aggregations()); - } - aggs.add(forMulti.get(0)); - } - - @Override - public void visit(Pct pct) { - aggs.add(AggregationFactory.Agg( - new PercentileBySpecImpl(pct.percentile(), pct.averageMedian()), MatchPair.of(pct.pair()))); - } - - @Override - public void visit(SortedFirst sortedFirst) { - // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction - final String[] columns = - sortedFirst.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new); - aggs.add(AggregationFactory.Agg(new SortedFirstBy(columns), MatchPair.of(sortedFirst.pair()))); - } - - @Override - public void visit(SortedLast sortedLast) { - // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction - final String[] columns = - sortedLast.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new); - aggs.add(AggregationFactory.Agg(new SortedFirstBy(columns), MatchPair.of(sortedLast.pair()))); - } - - @Override - public void visit(Std std) { - aggs.add(AggregationFactory.Agg(AggType.Std, MatchPair.of(std.pair()))); - } - - @Override - public void visit(Sum sum) { - aggs.add(AggregationFactory.Agg(AggType.Sum, MatchPair.of(sum.pair()))); - } - - @Override - public void visit(Unique unique) { - aggs.add(AggregationFactory.Agg(new UniqueSpec(unique.includeNulls()), MatchPair.of(unique.pair()))); - } - - @Override - public void visit(Var var) { - aggs.add(AggregationFactory.Agg(AggType.Var, MatchPair.of(var.pair()))); - } - - @Override - public void visit(WAvg wAvg) { - aggs.add(AggregationFactory.Agg(new WeightedAverageSpecImpl(wAvg.weight().name()), MatchPair.of(wAvg.pair()))); - } - - @Override - public void visit(WSum wSum) { - aggs.add(AggregationFactory.Agg(new WeightedSumSpecImpl(wSum.weight().name()), MatchPair.of(wSum.pair()))); - } -} diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java new file mode 100644 index 00000000000..3ee1741c2db --- /dev/null +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java @@ -0,0 +1,46 @@ +package io.deephaven.engine.table.impl.by; + +import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.Count; +import io.deephaven.api.agg.KeyedAggregation; +import io.deephaven.api.agg.KeyedAggregations; +import io.deephaven.engine.table.MatchPair; +import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement; +import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElementImpl; + +import java.util.Objects; + +/** + * Utility for converting an {@link Aggregation} to an {@link AggregationElement}. + */ +class AggregationElementAdapter implements Aggregation.Visitor { + + public static AggregationElement of(Aggregation aggregation) { + return aggregation.walk(new AggregationElementAdapter()).out(); + } + + private AggregationElement out; + + public AggregationElement out() { + return Objects.requireNonNull(out); + } + + @Override + public void visit(Count count) { + out = new AggregationFactory.CountAggregationElement(count.column().name()); + } + + @Override + public void visit(KeyedAggregation keyedAgg) { + final AggregationSpec spec = AggregationSpecAdapter.of(keyedAgg.key()); + final MatchPair pair = MatchPair.of(keyedAgg.pair()); + out = new AggregationElementImpl(spec, pair); + } + + @Override + public void visit(KeyedAggregations keyedAggs) { + final AggregationSpec spec = AggregationSpecAdapter.of(keyedAggs.key()); + final MatchPair[] pairs = MatchPair.fromPairs(keyedAggs.pairs()); + out = new AggregationElementImpl(spec, pairs); + } +} diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java index a6d14b786b6..28fe6d76787 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java @@ -5,14 +5,24 @@ package io.deephaven.engine.table.impl.by; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.Multi; +import io.deephaven.api.agg.AggregationOptimizer; +import io.deephaven.api.agg.KeyedAggregations; import io.deephaven.base.verify.Assert; +import io.deephaven.chunk.ChunkType; +import io.deephaven.chunk.attributes.Values; import io.deephaven.datastructures.util.CollectionUtil; import io.deephaven.datastructures.util.SmartKey; -import io.deephaven.chunk.attributes.Values; -import io.deephaven.chunk.ChunkType; -import io.deephaven.engine.table.*; -import io.deephaven.engine.table.impl.*; +import io.deephaven.engine.table.ChunkSource; +import io.deephaven.engine.table.ColumnDefinition; +import io.deephaven.engine.table.ColumnSource; +import io.deephaven.engine.table.MatchPair; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.table.impl.BaseTable; +import io.deephaven.engine.table.impl.EmptyTableMap; +import io.deephaven.engine.table.impl.QueryTable; +import io.deephaven.engine.table.impl.ReverseLookup; +import io.deephaven.engine.table.impl.RollupAttributeCopier; +import io.deephaven.engine.table.impl.RollupInfo; import io.deephaven.engine.table.impl.by.ssmminmax.SsmChunkedMinMaxOperator; import io.deephaven.engine.table.impl.select.MatchPairFactory; import io.deephaven.engine.table.impl.sources.ReinterpretUtils; @@ -24,7 +34,15 @@ import java.math.BigDecimal; import java.math.BigInteger; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.OptionalInt; import java.util.function.ToIntFunction; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -599,16 +617,13 @@ private String[] getKeyColumns() { public interface AggregationElement { /** - * Equivalent to {@code convertOrdered(Collections.singleton(aggregation))} or - * {@code optimizeAndConvert(Collections.singleton(aggregation))}. + * Converts an {@link Aggregation} to an {@link AggregationElement}. * * @param aggregation The {@link Aggregation aggregation} - * @return A list of {@link AggregationElement aggregation elements} - * @see #optimizeAndConvert(Collection) - * @see #convert(Collection) + * @return The {@link AggregationElement aggregation element} */ - static List convert(Aggregation aggregation) { - return optimizeAndConvert(Collections.singleton(aggregation)); + static AggregationElement of(Aggregation aggregation) { + return AggregationElementAdapter.of(aggregation); } /** @@ -621,17 +636,16 @@ static List convert(Aggregation aggregation) { * * @param aggregations The {@link Aggregation aggregation} * @return A list of {@link AggregationElement aggregation elements} - * @see #convert(Aggregation) + * @see AggregationOptimizer#of(Collection) + * @see #of(Aggregation) * @see #convert(Collection) */ static List optimizeAndConvert(Collection aggregations) { - AggregationAdapterOptimized builder = new AggregationAdapterOptimized(); - aggregations.forEach(a -> a.walk(builder)); - return builder.build(); + return convert(AggregationOptimizer.of(aggregations)); } /** - * Converts and the aggregations, only collapsing {@link Multi multi} aggregations into single + * Converts and the aggregations, only collapsing {@link KeyedAggregations multi} aggregations into single * {@link AggregationElement elements}, leaving singular aggregations as they are. * *

@@ -639,13 +653,15 @@ static List optimizeAndConvert(Collection convert(Collection aggregations) { - AggregationAdapterOrdered builder = new AggregationAdapterOrdered(); - aggregations.forEach(a -> a.walk(builder)); - return builder.build(); + final List out = new ArrayList<>(aggregations.size()); + for (Aggregation aggregation : aggregations) { + out.add(AggregationElementAdapter.of(aggregation)); + } + return out; } AggregationSpec getSpec(); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java new file mode 100644 index 00000000000..02084691804 --- /dev/null +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java @@ -0,0 +1,136 @@ +package io.deephaven.engine.table.impl.by; + +import io.deephaven.api.ColumnName; +import io.deephaven.api.SortColumn; +import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; + +import java.util.Objects; + +class AggregationSpecAdapter implements Key.Visitor { + + public static AggregationSpec of(Key key) { + return key.walk(new AggregationSpecAdapter()).out(); + } + + private AggregationSpec out; + + public AggregationSpec out() { + return Objects.requireNonNull(out); + } + + @Override + public void visit(KeyAbsSum absSum) { + out = new AbsSumSpec(); + } + + @Override + public void visit(KeyCountDistinct countDistinct) { + out = new CountDistinctSpec(countDistinct.countNulls()); + } + + @Override + public void visit(KeyDistinct distinct) { + out = new DistinctSpec(distinct.includeNulls()); + } + + @Override + public void visit(KeyGroup group) { + out = new AggregationGroupSpec(); + } + + @Override + public void visit(KeyAvg avg) { + out = new AvgSpec(); + } + + @Override + public void visit(KeyFirst first) { + out = new FirstBySpecImpl(); + } + + @Override + public void visit(KeyLast last) { + out = new LastBySpecImpl(); + } + + @Override + public void visit(KeyMax max) { + out = new MinMaxBySpecImpl(false); + } + + @Override + public void visit(KeyMedian median) { + out = new PercentileBySpecImpl(0.50d, median.averageMedian()); + } + + @Override + public void visit(KeyMin min) { + out = new MinMaxBySpecImpl(true); + } + + @Override + public void visit(KeyPct pct) { + out = new PercentileBySpecImpl(pct.percentile(), pct.averageMedian()); + } + + @Override + public void visit(KeySortedFirst sortedFirst) { + out = new SortedFirstBy( + sortedFirst.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); + } + + @Override + public void visit(KeySortedLast sortedLast) { + out = new SortedLastBy( + sortedLast.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); + } + + @Override + public void visit(KeyStd std) { + out = new StdSpec(); + } + + @Override + public void visit(KeySum sum) { + out = new SumSpec(); + } + + @Override + public void visit(KeyUnique unique) { + out = new UniqueSpec(unique.includeNulls()); + } + + @Override + public void visit(KeyWAvg wAvg) { + out = new WeightedAverageSpecImpl(wAvg.weight().name()); + } + + @Override + public void visit(KeyWSum wSum) { + out = new WeightedSumSpecImpl(wSum.weight().name()); + } + + @Override + public void visit(KeyVar var) { + out = new VarSpec(); + } +} diff --git a/engine/table/src/test/java/io/deephaven/engine/table/impl/QueryTableTest.java b/engine/table/src/test/java/io/deephaven/engine/table/impl/QueryTableTest.java index 187e56bab72..cfe75d1c22e 100644 --- a/engine/table/src/test/java/io/deephaven/engine/table/impl/QueryTableTest.java +++ b/engine/table/src/test/java/io/deephaven/engine/table/impl/QueryTableTest.java @@ -2828,15 +2828,15 @@ public void testMemoize() { testMemoize(source, t -> t.aggBy(List.of(AggSum("intCol"), AggAbsSum("absInt=intCol"), AggMax("doubleCol"), AggFirst("Sym"), AggCountDistinct("UniqueCountSym=Sym"), AggDistinct("UniqueSym=Sym")))); testMemoize(source, t -> t.aggBy(List.of(AggCountDistinct("UniqueCountSym=Sym")))); - testMemoize(source, t -> t.aggBy(List.of(AggCountDistinct("UniqueCountSym=Sym").withNulls()))); + testMemoize(source, t -> t.aggBy(List.of(AggCountDistinct(true, "UniqueCountSym=Sym")))); testNoMemoize(source, t -> t.aggBy(List.of(AggCountDistinct("UniqueCountSym=Sym"))), - t -> t.aggBy(List.of(AggCountDistinct("UniqueCountSym=Sym").withNulls()))); + t -> t.aggBy(List.of(AggCountDistinct(true, "UniqueCountSym=Sym")))); testMemoize(source, t -> t.aggBy(List.of(AggDistinct("UniqueSym=Sym")))); - testMemoize(source, t -> t.aggBy(List.of(AggDistinct("UniqueSym=Sym").withNulls()))); + testMemoize(source, t -> t.aggBy(List.of(AggDistinct(true, "UniqueSym=Sym")))); testNoMemoize(source, t -> t.aggBy(List.of(AggCountDistinct("UniqueCountSym=Sym"))), t -> t.aggBy(List.of(AggDistinct("UniqueCountSym=Sym")))); testNoMemoize(source, t -> t.aggBy(List.of(AggDistinct("UniqueSym=Sym"))), - t -> t.aggBy(List.of(AggDistinct("UniqueSym=Sym").withNulls()))); + t -> t.aggBy(List.of(AggDistinct(true, "UniqueSym=Sym")))); testNoMemoize(source, t -> t.countBy("Sym"), t -> t.countBy("Count", "Sym")); testNoMemoize(source, t -> t.sumBy("Sym"), t -> t.countBy("Count", "Sym")); testNoMemoize(source, t -> t.sumBy("Sym"), t -> t.avgBy("Sym")); diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTableWriter.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTableWriter.java index 20e0c856af9..baee2c4b5bf 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTableWriter.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTableWriter.java @@ -4,8 +4,8 @@ import io.deephaven.api.ColumnName; import io.deephaven.api.RawString; import io.deephaven.api.Selectable; -import io.deephaven.api.agg.First; -import io.deephaven.api.agg.Last; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyLast; import io.deephaven.engine.table.*; import io.deephaven.engine.table.impl.CodecLookup; import io.deephaven.vector.Vector; @@ -939,7 +939,8 @@ private static Table groupingAsTable(Table tableToSave, String columnName) { .view(List.of(Selectable.of(ColumnName.of(GROUPING_KEY), ColumnName.of(columnName)), Selectable.of(ColumnName.of(BEGIN_POS), RawString.of("ii")), // Range start, inclusive Selectable.of(ColumnName.of(END_POS), RawString.of("ii+1")))) // Range end, exclusive - .aggBy(List.of(First.of(ColumnName.of(BEGIN_POS)), Last.of(ColumnName.of(END_POS))), + .aggBy(List.of(KeyFirst.of().aggregation(ColumnName.of(BEGIN_POS)), + KeyLast.of().aggregation(ColumnName.of(END_POS))), List.of(ColumnName.of(GROUPING_KEY))); final Table invalid = grouped.where(BEGIN_POS + " != 0 && " + BEGIN_POS + " != " + END_POS + "_[ii-1]"); if (!invalid.isEmpty()) { diff --git a/java-client/flight-examples/src/main/java/io/deephaven/client/examples/Sum.java b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/Sum.java index edc7929d470..1839a5b6293 100644 --- a/java-client/flight-examples/src/main/java/io/deephaven/client/examples/Sum.java +++ b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/Sum.java @@ -1,6 +1,7 @@ package io.deephaven.client.examples; import io.deephaven.api.TableOperations; +import io.deephaven.api.agg.Aggregation; import io.deephaven.qst.TableCreationLogic; import io.deephaven.qst.TableCreator; import io.deephaven.qst.table.TableSpec; @@ -28,7 +29,7 @@ protected TableCreationLogic logic() { public > T create(TableCreator c) { return c.of(TableSpec.empty(count)) .view("I=i") - .aggBy(Collections.singleton(io.deephaven.api.agg.Sum.of("Sum=I")), Collections.emptyList()); + .aggBy(Collections.singleton(Aggregation.AggSum("Sum=I")), Collections.emptyList()); } public static void main(String[] args) { diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java b/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java index f9be9efccc3..48cb42f5147 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java @@ -11,29 +11,31 @@ import io.deephaven.api.SortColumn; import io.deephaven.api.SortColumn.Order; import io.deephaven.api.Strings; -import io.deephaven.api.agg.AbsSum; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.Group; -import io.deephaven.api.agg.Avg; import io.deephaven.api.agg.Count; -import io.deephaven.api.agg.CountDistinct; -import io.deephaven.api.agg.Distinct; -import io.deephaven.api.agg.First; -import io.deephaven.api.agg.Last; -import io.deephaven.api.agg.Max; -import io.deephaven.api.agg.Med; -import io.deephaven.api.agg.Min; -import io.deephaven.api.agg.Multi; +import io.deephaven.api.agg.KeyedAggregation; +import io.deephaven.api.agg.KeyedAggregations; import io.deephaven.api.agg.Pair; -import io.deephaven.api.agg.Pct; -import io.deephaven.api.agg.SortedFirst; -import io.deephaven.api.agg.SortedLast; -import io.deephaven.api.agg.Std; -import io.deephaven.api.agg.Sum; -import io.deephaven.api.agg.Unique; -import io.deephaven.api.agg.Var; -import io.deephaven.api.agg.WAvg; -import io.deephaven.api.agg.WSum; +import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; import io.deephaven.api.filter.Filter; import io.deephaven.api.filter.FilterAnd; import io.deephaven.api.filter.FilterCondition; @@ -82,11 +84,43 @@ import io.deephaven.proto.backplane.grpc.Ticket; import io.deephaven.proto.backplane.grpc.TimeTableRequest; import io.deephaven.proto.backplane.grpc.UnstructuredFilterTableRequest; -import io.deephaven.qst.table.*; +import io.deephaven.qst.table.AggregationTable; +import io.deephaven.qst.table.AsOfJoinTable; +import io.deephaven.qst.table.ByTableBase; +import io.deephaven.qst.table.EmptyTable; +import io.deephaven.qst.table.ExactJoinTable; +import io.deephaven.qst.table.HeadTable; +import io.deephaven.qst.table.InMemoryAppendOnlyInputTable; +import io.deephaven.qst.table.InMemoryKeyBackedInputTable; +import io.deephaven.qst.table.InputTable; +import io.deephaven.qst.table.JoinTable; +import io.deephaven.qst.table.LeftJoinTable; +import io.deephaven.qst.table.MergeTable; +import io.deephaven.qst.table.NaturalJoinTable; +import io.deephaven.qst.table.NewTable; +import io.deephaven.qst.table.ReverseAsOfJoinTable; +import io.deephaven.qst.table.ReverseTable; +import io.deephaven.qst.table.SelectTable; +import io.deephaven.qst.table.SingleAggregationTable; +import io.deephaven.qst.table.SingleParentTable; +import io.deephaven.qst.table.SnapshotTable; +import io.deephaven.qst.table.SortTable; +import io.deephaven.qst.table.TableHeader; +import io.deephaven.qst.table.TableSchema; +import io.deephaven.qst.table.TableSpec; +import io.deephaven.qst.table.TailTable; +import io.deephaven.qst.table.TicketTable; import io.deephaven.qst.table.TimeProvider.Visitor; +import io.deephaven.qst.table.TimeProviderSystem; +import io.deephaven.qst.table.TimeTable; +import io.deephaven.qst.table.UpdateTable; +import io.deephaven.qst.table.UpdateViewTable; +import io.deephaven.qst.table.ViewTable; +import io.deephaven.qst.table.WhereInTable; +import io.deephaven.qst.table.WhereNotInTable; +import io.deephaven.qst.table.WhereTable; import java.time.Instant; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -384,17 +418,13 @@ public void visit(SelectTable v) { } @Override - public void visit(GroupByTable groupByTable) { - out = op(Builder::setComboAggregate, singleAgg(groupByTable, AggType.GROUP)); + public void visit(SingleAggregationTable singleAggregationTable) { + out = op(Builder::setComboAggregate, singleAgg(singleAggregationTable)); } @Override public void visit(AggregationTable aggregationTable) { - ComboAggregateRequest.Builder builder = groupByColumns(aggregationTable); - for (Aggregation aggregation : aggregationTable.aggregations()) { - builder.addAllAggregates(AggregationAdapter.of(aggregation)); - } - out = op(Builder::setComboAggregate, builder); + out = op(Builder::setComboAggregate, agg(aggregationTable)); } @Override @@ -446,8 +476,19 @@ private SelectOrUpdateRequest selectOrUpdate(SingleParentTable x, return builder.build(); } - private ComboAggregateRequest singleAgg(ByTableBase base, AggType type) { - return groupByColumns(base).addAggregates(Aggregate.newBuilder().setType(type).build()).build(); + private ComboAggregateRequest singleAgg(SingleAggregationTable agg) { + // A single aggregate without any input/output is how the protocol knows this is an "aggregate all by" + // as opposed to an AggregationTable with one agg. + final Aggregate aggregate = agg.key().walk(new AggregateAdapter(Collections.emptyList())).out(); + return groupByColumns(agg).addAggregates(aggregate).build(); + } + + private ComboAggregateRequest agg(AggregationTable agg) { + ComboAggregateRequest.Builder builder = groupByColumns(agg); + for (Aggregation aggregation : agg.aggregations()) { + builder.addAggregates(AggregationAdapter.of(aggregation)); + } + return builder.build(); } private ComboAggregateRequest.Builder groupByColumns(ByTableBase base) { @@ -463,149 +504,30 @@ private ComboAggregateRequest.Builder groupByColumns(ByTableBase base) { private static class AggregationAdapter implements Aggregation.Visitor { - public static List of(Aggregation aggregation) { - return aggregation.walk(new AggregationAdapter()).getOut(); + public static Aggregate of(Aggregation aggregation) { + return aggregation.walk(new AggregationAdapter()).out(); } private Aggregate out; - private List multi; - - public List getOut() { - if (multi != null) { - return multi; - } - if (out != null) { - return Collections.singletonList(out); - } - throw new IllegalStateException(); - } - - private Aggregate.Builder of(AggType type, Pair specs) { - return Aggregate.newBuilder().setType(type).addMatchPairs(Strings.of(specs)); - } - - @Override - public void visit(Min min) { - out = of(AggType.MIN, min.pair()).build(); - } - - @Override - public void visit(Max max) { - out = of(AggType.MAX, max.pair()).build(); - } - - @Override - public void visit(Sum sum) { - out = of(AggType.SUM, sum.pair()).build(); - } - - @Override - public void visit(Var var) { - out = of(AggType.VAR, var.pair()).build(); - } - - @Override - public void visit(Avg avg) { - out = of(AggType.AVG, avg.pair()).build(); - } - - @Override - public void visit(First first) { - out = of(AggType.FIRST, first.pair()).build(); - } - - @Override - public void visit(Last last) { - out = of(AggType.LAST, last.pair()).build(); - } - - @Override - public void visit(Std std) { - out = of(AggType.STD, std.pair()).build(); - } - - @Override - public void visit(Med med) { - if (!med.averageMedian()) { - throw new UnsupportedOperationException( - "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); - } - out = of(AggType.MEDIAN, med.pair()).build(); - } - - @Override - public void visit(Pct pct) { - if (pct.averageMedian()) { - throw new UnsupportedOperationException( - "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); - } - out = of(AggType.PERCENTILE, pct.pair()).build(); - } - @Override - public void visit(WSum wSum) { - throw new UnsupportedOperationException( - "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); - } - - @Override - public void visit(WAvg wAvg) { - out = of(AggType.WEIGHTED_AVG, wAvg.pair()).setColumnName(wAvg.weight().name()).build(); + public Aggregate out() { + return Objects.requireNonNull(out); } @Override public void visit(Count count) { - out = Aggregate.newBuilder().setType(AggType.COUNT).setColumnName(count.column().name()) - .build(); - } - - @Override - public void visit(CountDistinct countDistinct) { - throw new UnsupportedOperationException( - "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); - } - - @Override - public void visit(Distinct distinct) { - throw new UnsupportedOperationException( - "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); + out = Aggregate.newBuilder().setType(AggType.COUNT).setColumnName(count.column().name()).build(); } @Override - public void visit(Group group) { - out = of(AggType.GROUP, group.pair()).build(); + public void visit(KeyedAggregation keyedAgg) { + out = keyedAgg.key() + .walk(new AggregateAdapter(Collections.singletonList(keyedAgg.pair()))).out(); } @Override - public void visit(AbsSum absSum) { - out = of(AggType.ABS_SUM, absSum.pair()).build(); - } - - @Override - public void visit(Unique unique) { - throw new UnsupportedOperationException( - "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); - } - - @Override - public void visit(SortedFirst sortedFirst) { - throw new UnsupportedOperationException( - "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); - } - - @Override - public void visit(SortedLast sortedLast) { - throw new UnsupportedOperationException( - "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); - } - - @Override - public void visit(Multi multi) { - List result = new ArrayList<>(); - for (Aggregation aggregation : multi.aggregations()) { - result.addAll(of(aggregation)); - } - this.multi = result; + public void visit(KeyedAggregations keyedAggs) { + out = keyedAggs.key().walk(new AggregateAdapter(keyedAggs.pairs())).out(); } } @@ -724,4 +646,137 @@ public void visit(RawString rawString) { throw new IllegalStateException("Can't build Condition with raw string"); } } + + private static Aggregate.Builder of(AggType type, List pairs) { + final Aggregate.Builder builder = Aggregate.newBuilder().setType(type); + for (Pair pair : pairs) { + builder.addMatchPairs(Strings.of(pair)); + } + return builder; + } + + private static class AggregateAdapter implements Key.Visitor { + + private final List pairs; + + public AggregateAdapter(List pairs) { + this.pairs = Objects.requireNonNull(pairs); + } + + private Aggregate out; + + private Aggregate out() { + return Objects.requireNonNull(out); + } + + @Override + public void visit(KeyAbsSum absSum) { + out = of(AggType.ABS_SUM, pairs).build(); + } + + @Override + public void visit(KeyCountDistinct countDistinct) { + throw new UnsupportedOperationException( + "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); + } + + @Override + public void visit(KeyDistinct distinct) { + throw new UnsupportedOperationException( + "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); + } + + @Override + public void visit(KeyGroup group) { + out = of(AggType.GROUP, pairs).build(); + } + + @Override + public void visit(KeyAvg avg) { + out = of(AggType.AVG, pairs).build(); + } + + @Override + public void visit(KeyFirst first) { + out = of(AggType.FIRST, pairs).build(); + } + + @Override + public void visit(KeyLast last) { + out = of(AggType.LAST, pairs).build(); + } + + @Override + public void visit(KeyMax max) { + out = of(AggType.MAX, pairs).build(); + } + + @Override + public void visit(KeyMedian median) { + if (!median.averageMedian()) { + throw new UnsupportedOperationException( + "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); + } + out = of(AggType.MEDIAN, pairs).build(); + } + + @Override + public void visit(KeyMin min) { + out = of(AggType.MIN, pairs).build(); + } + + @Override + public void visit(KeyPct pct) { + if (pct.averageMedian()) { + throw new UnsupportedOperationException( + "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); + } + out = of(AggType.PERCENTILE, pairs).build(); + } + + @Override + public void visit(KeySortedFirst sortedFirst) { + throw new UnsupportedOperationException( + "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); + } + + @Override + public void visit(KeySortedLast sortedLast) { + throw new UnsupportedOperationException( + "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); + } + + @Override + public void visit(KeyStd std) { + out = of(AggType.STD, pairs).build(); + } + + @Override + public void visit(KeySum sum) { + out = of(AggType.SUM, pairs).build(); + } + + @Override + public void visit(KeyUnique unique) { + throw new UnsupportedOperationException( + "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); + } + + @Override + public void visit(KeyWAvg wAvg) { + out = of(AggType.WEIGHTED_AVG, pairs).setColumnName(wAvg.weight().name()).build(); + + } + + @Override + public void visit(KeyWSum wSum) { + throw new UnsupportedOperationException( + "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); + } + + @Override + public void visit(KeyVar var) { + out = of(AggType.VAR, pairs).build(); + } + } } diff --git a/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java b/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java index c06e19508e7..393d9b371aa 100644 --- a/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java +++ b/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java @@ -1,11 +1,31 @@ package io.deephaven.graphviz; +import io.deephaven.api.SortColumn; import io.deephaven.api.Strings; +import io.deephaven.api.agg.key.Key.Visitor; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; import io.deephaven.qst.table.AggregationTable; import io.deephaven.qst.table.AsOfJoinTable; import io.deephaven.qst.table.EmptyTable; import io.deephaven.qst.table.ExactJoinTable; -import io.deephaven.qst.table.GroupByTable; import io.deephaven.qst.table.HeadTable; import io.deephaven.qst.table.InMemoryAppendOnlyInputTable; import io.deephaven.qst.table.InMemoryKeyBackedInputTable; @@ -17,6 +37,7 @@ import io.deephaven.qst.table.ReverseAsOfJoinTable; import io.deephaven.qst.table.SelectTable; import io.deephaven.qst.table.SelectableTable; +import io.deephaven.qst.table.SingleAggregationTable; import io.deephaven.qst.table.TableSpec; import io.deephaven.qst.table.TableVisitorGeneric; import io.deephaven.qst.table.TailTable; @@ -31,6 +52,7 @@ import java.util.Iterator; import java.util.Objects; import java.util.function.Function; +import java.util.stream.Collectors; public class LabelBuilder extends TableVisitorGeneric { @@ -135,10 +157,155 @@ public void visit(WhereTable whereTable) { } @Override - public void visit(GroupByTable groupByTable) { - sb.append("groupBy("); - append(Strings::of, groupByTable.columns(), sb); - sb.append(')'); + public void visit(SingleAggregationTable singleAggregationTable) { + singleAggregationTable.key().walk(new Visitor() { + @Override + public void visit(KeyAbsSum absSum) { + sb.append("absSumBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyCountDistinct countDistinct) { + sb.append("countDistinctBy("); + sb.append(countDistinct.countNulls()).append(','); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyDistinct distinct) { + sb.append("distinctBy("); + sb.append(distinct.includeNulls()).append(','); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyGroup group) { + sb.append("groupBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyAvg avg) { + sb.append("avgBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyFirst first) { + sb.append("firstBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyLast last) { + sb.append("lastBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyMax max) { + sb.append("maxBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyMedian median) { + sb.append("medianBy("); + sb.append(median.averageMedian()).append(','); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyMin min) { + sb.append("minBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyPct pct) { + sb.append("pctBy("); + sb.append(pct.percentile()).append(','); + sb.append(pct.averageMedian()).append(','); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeySortedFirst sortedFirst) { + sb.append("sortedFirstBy(["); + append(Strings::of, sortedFirst.columns().stream().map(SortColumn::column).collect(Collectors.toList()), + sb); + sb.append("],"); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeySortedLast sortedLast) { + sb.append("sortedLastBy(["); + append(Strings::of, sortedLast.columns().stream().map(SortColumn::column).collect(Collectors.toList()), + sb); + sb.append("],"); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyStd std) { + sb.append("stdBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeySum sum) { + sb.append("sumBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyUnique unique) { + sb.append("uniqueBy("); + sb.append(unique.includeNulls()).append(','); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyWAvg wAvg) { + sb.append("wavgBy("); + sb.append(wAvg.weight().name()).append(','); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyWSum wSum) { + sb.append("wsumBy("); + sb.append(wSum.weight().name()).append(','); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + + @Override + public void visit(KeyVar var) { + sb.append("varBy("); + append(Strings::of, singleAggregationTable.columns(), sb); + sb.append(')'); + } + }); } @Override diff --git a/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java b/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java index 1cdfbf9e1a1..8f5cff896ab 100644 --- a/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java +++ b/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java @@ -1,12 +1,32 @@ package io.deephaven.qst; import io.deephaven.api.TableOperations; +import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; import io.deephaven.qst.TableAdapterResults.Output; import io.deephaven.qst.table.AggregationTable; import io.deephaven.qst.table.AsOfJoinTable; import io.deephaven.qst.table.EmptyTable; import io.deephaven.qst.table.ExactJoinTable; -import io.deephaven.qst.table.GroupByTable; +import io.deephaven.qst.table.SingleAggregationTable; import io.deephaven.qst.table.HeadTable; import io.deephaven.qst.table.InputTable; import io.deephaven.qst.table.JoinTable; @@ -235,8 +255,104 @@ public void visit(ReverseAsOfJoinTable raj) { } @Override - public void visit(GroupByTable groupByTable) { - addOp(groupByTable, parentOps(groupByTable).groupBy(groupByTable.columns())); + public void visit(SingleAggregationTable singleAggregationTable) { + singleAggregationTable.key().walk(new Key.Visitor() { + @Override + public void visit(KeyAbsSum absSum) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyCountDistinct countDistinct) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyDistinct distinct) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyGroup group) { + addOp(singleAggregationTable, + parentOps(singleAggregationTable).groupBy(singleAggregationTable.columns())); + } + + @Override + public void visit(KeyAvg avg) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyFirst first) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyLast last) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyMax max) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyMedian median) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyMin min) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyPct pct) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeySortedFirst sortedFirst) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeySortedLast sortedLast) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyStd std) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeySum sum) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyUnique unique) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyWAvg wAvg) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyWSum wSum) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + + @Override + public void visit(KeyVar var) { + throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); + } + }); } @Override diff --git a/qst/src/main/java/io/deephaven/qst/table/AggregationTable.java b/qst/src/main/java/io/deephaven/qst/table/AggregationTable.java index ac5d4946b05..a9b9bd66672 100644 --- a/qst/src/main/java/io/deephaven/qst/table/AggregationTable.java +++ b/qst/src/main/java/io/deephaven/qst/table/AggregationTable.java @@ -1,8 +1,7 @@ package io.deephaven.qst.table; -import io.deephaven.api.Selectable; -import io.deephaven.api.agg.Aggregation; import io.deephaven.annotations.NodeStyle; +import io.deephaven.api.agg.Aggregation; import org.immutables.value.Value.Check; import org.immutables.value.Value.Immutable; @@ -20,10 +19,6 @@ public static Builder builder() { return ImmutableAggregationTable.builder(); } - public abstract TableSpec parent(); - - public abstract List columns(); - public abstract List aggregations(); @Override @@ -39,21 +34,11 @@ final void checkNumAggs() { } } - public interface Builder { - Builder parent(TableSpec parent); - - Builder addColumns(Selectable element); - - Builder addColumns(Selectable... elements); - - Builder addAllColumns(Iterable elements); - + public interface Builder extends ByTableBase.Builder { Builder addAggregations(Aggregation element); Builder addAggregations(Aggregation... elements); Builder addAllAggregations(Iterable elements); - - AggregationTable build(); } } diff --git a/qst/src/main/java/io/deephaven/qst/table/ByTableBase.java b/qst/src/main/java/io/deephaven/qst/table/ByTableBase.java index ffa9286bd13..fb45223b743 100644 --- a/qst/src/main/java/io/deephaven/qst/table/ByTableBase.java +++ b/qst/src/main/java/io/deephaven/qst/table/ByTableBase.java @@ -6,5 +6,19 @@ public abstract class ByTableBase extends TableBase implements SingleParentTable { + public abstract TableSpec parent(); + public abstract List columns(); + + interface Builder> { + SELF parent(TableSpec parent); + + SELF addColumns(Selectable element); + + SELF addColumns(Selectable... elements); + + SELF addAllColumns(Iterable elements); + + BY build(); + } } diff --git a/qst/src/main/java/io/deephaven/qst/table/GroupByTable.java b/qst/src/main/java/io/deephaven/qst/table/GroupByTable.java deleted file mode 100644 index 4f7f815cd3e..00000000000 --- a/qst/src/main/java/io/deephaven/qst/table/GroupByTable.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.deephaven.qst.table; - -import io.deephaven.api.Selectable; -import io.deephaven.annotations.NodeStyle; -import org.immutables.value.Value.Immutable; - -import java.util.Collection; -import java.util.List; - -/** - * @see io.deephaven.api.TableOperations#groupBy(Collection) - */ -@Immutable -@NodeStyle -public abstract class GroupByTable extends ByTableBase { - - public static Builder builder() { - return ImmutableGroupByTable.builder(); - } - - public abstract TableSpec parent(); - - public abstract List columns(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } - - public interface Builder { - Builder parent(TableSpec parent); - - Builder addColumns(Selectable element); - - Builder addColumns(Selectable... elements); - - Builder addAllColumns(Iterable elements); - - GroupByTable build(); - } -} diff --git a/qst/src/main/java/io/deephaven/qst/table/ParentsVisitor.java b/qst/src/main/java/io/deephaven/qst/table/ParentsVisitor.java index 887607302b9..0b2385a7382 100644 --- a/qst/src/main/java/io/deephaven/qst/table/ParentsVisitor.java +++ b/qst/src/main/java/io/deephaven/qst/table/ParentsVisitor.java @@ -245,8 +245,8 @@ public void visit(UpdateTable updateTable) { } @Override - public void visit(GroupByTable groupByTable) { - out = single(groupByTable); + public void visit(SingleAggregationTable singleAggregationTable) { + out = single(singleAggregationTable); } @Override diff --git a/qst/src/main/java/io/deephaven/qst/table/SingleAggregationTable.java b/qst/src/main/java/io/deephaven/qst/table/SingleAggregationTable.java new file mode 100644 index 00000000000..a3523b85059 --- /dev/null +++ b/qst/src/main/java/io/deephaven/qst/table/SingleAggregationTable.java @@ -0,0 +1,26 @@ +package io.deephaven.qst.table; + +import io.deephaven.annotations.NodeStyle; +import io.deephaven.api.agg.key.Key; +import org.immutables.value.Value.Immutable; + +@Immutable +@NodeStyle +public abstract class SingleAggregationTable extends ByTableBase { + + public static Builder builder() { + return ImmutableSingleAggregationTable.builder(); + } + + public abstract Key key(); + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } + + public interface Builder extends ByTableBase.Builder { + Builder key(Key key); + } +} diff --git a/qst/src/main/java/io/deephaven/qst/table/TableBase.java b/qst/src/main/java/io/deephaven/qst/table/TableBase.java index 17ca034e611..b6190dc4fff 100644 --- a/qst/src/main/java/io/deephaven/qst/table/TableBase.java +++ b/qst/src/main/java/io/deephaven/qst/table/TableBase.java @@ -9,9 +9,10 @@ import io.deephaven.api.Selectable; import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.KeyGroup; import io.deephaven.api.filter.Filter; import io.deephaven.qst.TableCreationLogic; -import io.deephaven.qst.table.TableSchema.Visitor; import java.util.Arrays; import java.util.Collection; @@ -403,22 +404,18 @@ public final SelectTable select(Collection columns) { } @Override - public final GroupByTable groupBy() { - return GroupByTable.builder().parent(this).build(); + public final SingleAggregationTable groupBy() { + return fullAggBy(KeyGroup.of()); } @Override - public final GroupByTable groupBy(String... groupByColumns) { - GroupByTable.Builder builder = GroupByTable.builder().parent(this); - for (String groupByColumn : groupByColumns) { - builder.addColumns(Selectable.parse(groupByColumn)); - } - return builder.build(); + public final SingleAggregationTable groupBy(String... groupByColumns) { + return fullAggBy(KeyGroup.of(), groupByColumns); } @Override - public final GroupByTable groupBy(Collection groupByColumns) { - return GroupByTable.builder().parent(this).addAllColumns(groupByColumns).build(); + public final SingleAggregationTable groupBy(Collection groupByColumns) { + return fullAggBy(KeyGroup.of(), groupByColumns); } @Override @@ -480,4 +477,21 @@ private static Collection split(String string) { : Arrays.stream(string.split(",")).map(String::trim).filter(s -> !s.isEmpty()) .collect(Collectors.toList()); } + + private SingleAggregationTable fullAggBy(Key key) { + return SingleAggregationTable.builder().parent(this).key(key).build(); + } + + private SingleAggregationTable fullAggBy(Key key, String... groupByColumns) { + SingleAggregationTable.Builder builder = SingleAggregationTable.builder().parent(this).key(key); + for (String groupByColumn : groupByColumns) { + builder.addColumns(Selectable.parse(groupByColumn)); + } + return builder.build(); + } + + private SingleAggregationTable fullAggBy(Key key, Collection groupByColumns) { + return SingleAggregationTable.builder().parent(this).key(key).addAllColumns(groupByColumns).build(); + } + } diff --git a/qst/src/main/java/io/deephaven/qst/table/TableSpec.java b/qst/src/main/java/io/deephaven/qst/table/TableSpec.java index d4d3669480b..446de18092e 100644 --- a/qst/src/main/java/io/deephaven/qst/table/TableSpec.java +++ b/qst/src/main/java/io/deephaven/qst/table/TableSpec.java @@ -141,10 +141,10 @@ interface Visitor { void visit(UpdateTable updateTable); - void visit(GroupByTable groupByTable); - void visit(AggregationTable aggregationTable); + void visit(SingleAggregationTable singleAggregationTable); + void visit(TicketTable ticketTable); void visit(InputTable inputTable); diff --git a/qst/src/main/java/io/deephaven/qst/table/TableVisitorGeneric.java b/qst/src/main/java/io/deephaven/qst/table/TableVisitorGeneric.java index 2b333a83172..96a81639929 100644 --- a/qst/src/main/java/io/deephaven/qst/table/TableVisitorGeneric.java +++ b/qst/src/main/java/io/deephaven/qst/table/TableVisitorGeneric.java @@ -115,8 +115,8 @@ public void visit(UpdateTable updateTable) { } @Override - public void visit(GroupByTable groupByTable) { - accept(groupByTable); + public void visit(SingleAggregationTable singleAggregationTable) { + accept(singleAggregationTable); } @Override diff --git a/table-api/src/main/java/io/deephaven/api/agg/AbsSum.java b/table-api/src/main/java/io/deephaven/api/agg/AbsSum.java deleted file mode 100644 index 81812c66db3..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/AbsSum.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class AbsSum implements Aggregation { - - public static AbsSum of(Pair pair) { - return ImmutableAbsSum.of(pair); - } - - public static AbsSum of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java b/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java index c75246515bf..596359946b1 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java +++ b/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java @@ -2,285 +2,288 @@ import io.deephaven.api.ColumnName; import io.deephaven.api.SortColumn; +import io.deephaven.api.agg.KeyedAggregations.Builder; +import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; import java.io.Serializable; import java.util.Collection; -import java.util.stream.Collectors; /** * Represents an aggregation that can be applied to a table. * * @see io.deephaven.api.TableOperations#aggBy(Collection, Collection) + * @see Count + * @see KeyedAggregation + * @see KeyedAggregations */ public interface Aggregation extends Serializable { - static AbsSum AggAbsSum(String pair) { - return AggregationFinisher.absSum().of(pair); + static KeyedAggregation of(Key key, String pair) { + return KeyedAggregation.of(key, Pair.parse(pair)); + } + + static KeyedAggregations of(Key key, String... pairs) { + final Builder builder = KeyedAggregations.builder().key(key); + for (String pair : pairs) { + builder.addPairs(Pair.parse(pair)); + } + return builder.build(); + } + + static Aggregation AggAbsSum(String pair) { + return of(KeyAbsSum.of(), pair); } static Aggregation AggAbsSum(String... pairs) { - return AggregationFinisher.absSum().of(pairs); + return of(KeyAbsSum.of(), pairs); } - static Group AggGroup(String pair) { - return AggregationFinisher.group().of(pair); + static Aggregation AggGroup(String pair) { + return of(KeyGroup.of(), pair); } static Aggregation AggGroup(String... pairs) { - return AggregationFinisher.group().of(pairs); + return of(KeyGroup.of(), pairs); } - static Avg AggAvg(String pair) { - return AggregationFinisher.avg().of(pair); + static Aggregation AggAvg(String pair) { + return of(KeyAvg.of(), pair); } static Aggregation AggAvg(String... pairs) { - return AggregationFinisher.avg().of(pairs); + return of(KeyAvg.of(), pairs); } - static Count AggCount(String resultColumn) { + static Aggregation AggCount(String resultColumn) { return Count.of(resultColumn); } - static CountDistinct AggCountDistinct(String pair) { - return AggregationFinisher.countDistinct().of(pair); + static Aggregation AggCountDistinct(String pair) { + return of(KeyCountDistinct.of(), pair); } static Aggregation AggCountDistinct(String... pairs) { - return AggregationFinisher.countDistinct().of(pairs); + return of(KeyCountDistinct.of(), pairs); } - static CountDistinct AggCountDistinct(boolean countNulls, String pair) { - return AggregationFinisher.countDistinct(countNulls).of(pair); + static Aggregation AggCountDistinct(boolean countNulls, String pair) { + return of(KeyCountDistinct.of(countNulls), pair); } static Aggregation AggCountDistinct(boolean countNulls, String... pairs) { - return AggregationFinisher.countDistinct(countNulls).of(pairs); + return of(KeyCountDistinct.of(countNulls), pairs); } - static Distinct AggDistinct(String pair) { - return AggregationFinisher.distinct().of(pair); + static Aggregation AggDistinct(String pair) { + return of(KeyDistinct.of(), pair); } static Aggregation AggDistinct(String... pairs) { - return AggregationFinisher.distinct().of(pairs); + return of(KeyDistinct.of(), pairs); } - static Distinct AggDistinct(boolean includeNulls, String pair) { - return AggregationFinisher.distinct(includeNulls).of(pair); + static Aggregation AggDistinct(boolean includeNulls, String pair) { + return of(KeyDistinct.of(includeNulls), pair); } static Aggregation AggDistinct(boolean includeNulls, String... pairs) { - return AggregationFinisher.distinct(includeNulls).of(pairs); + return of(KeyDistinct.of(includeNulls), pairs); } - static First AggFirst(String pair) { - return AggregationFinisher.first().of(pair); + static Aggregation AggFirst(String pair) { + return of(KeyFirst.of(), pair); } static Aggregation AggFirst(String... pairs) { - return AggregationFinisher.first().of(pairs); + return of(KeyFirst.of(), pairs); } - static Last AggLast(String pair) { - return AggregationFinisher.last().of(pair); + static Aggregation AggLast(String pair) { + return of(KeyLast.of(), pair); } static Aggregation AggLast(String... pairs) { - return AggregationFinisher.last().of(pairs); + return of(KeyLast.of(), pairs); } - static Max AggMax(String pair) { - return AggregationFinisher.max().of(pair); + static Aggregation AggMax(String pair) { + return of(KeyMax.of(), pair); } static Aggregation AggMax(String... pairs) { - return AggregationFinisher.max().of(pairs); + return of(KeyMax.of(), pairs); } - static Med AggMed(String pair) { - return AggregationFinisher.med().of(pair); + static Aggregation AggMed(String pair) { + return of(KeyMedian.of(), pair); } static Aggregation AggMed(String... pairs) { - return AggregationFinisher.med().of(pairs); + return of(KeyMedian.of(), pairs); } - static Min AggMin(String pair) { - return AggregationFinisher.min().of(pair); + static Aggregation AggMed(boolean average, String pair) { + return of(KeyMedian.of(average), pair); } - static Med AggMed(boolean average, String pair) { - return AggregationFinisher.med(average).of(pair); + static Aggregation AggMed(boolean average, String... pairs) { + return of(KeyMedian.of(average), pairs); } - static Aggregation AggMed(boolean average, String... pairs) { - return AggregationFinisher.med(average).of(pairs); + static Aggregation AggMin(String pair) { + return of(KeyMin.of(), pair); } static Aggregation AggMin(String... pairs) { - return AggregationFinisher.min().of(pairs); + return of(KeyMin.of(), pairs); } - static Pct AggPct(double percentile, String pair) { - return AggregationFinisher.pct(percentile).of(pair); + static Aggregation AggPct(double percentile, String pair) { + return of(KeyPct.of(percentile), pair); } static Aggregation AggPct(double percentile, String... pairs) { - return AggregationFinisher.pct(percentile).of(pairs); + return of(KeyPct.of(percentile), pairs); } - static Pct AggPct(double percentile, boolean average, String pair) { - return AggregationFinisher.pct(percentile, average).of(pair); + static Aggregation AggPct(double percentile, boolean average, String pair) { + return of(KeyPct.of(percentile, average), pair); } static Aggregation AggPct(double percentile, boolean average, String... pairs) { - return AggregationFinisher.pct(percentile, average).of(pairs); + return of(KeyPct.of(percentile, average), pairs); } - static SortedFirst AggSortedFirst(String sortedColumn, String pair) { - return AggregationFinisher.sortedFirst(SortColumn.asc(ColumnName.of(sortedColumn))) - .of(pair); + static Aggregation AggSortedFirst(String sortedColumn, String pair) { + return of(KeySortedFirst.builder().addColumns(SortColumn.asc(ColumnName.of(sortedColumn))).build(), pair); } static Aggregation AggSortedFirst(String sortedColumn, String... pairs) { - return AggregationFinisher.sortedFirst(SortColumn.asc(ColumnName.of(sortedColumn))) - .of(pairs); + return of(KeySortedFirst.builder().addColumns(SortColumn.asc(ColumnName.of(sortedColumn))).build(), pairs); } - static SortedFirst AggSortedFirst(Collection sortedColumns, String pair) { - return AggregationFinisher.sortedFirst( - sortedColumns.stream().map(ColumnName::of).map(SortColumn::asc).collect(Collectors.toList())) - .of(pair); + static Aggregation AggSortedFirst(Collection sortedColumns, String pair) { + final KeySortedFirst.Builder builder = KeySortedFirst.builder(); + for (String sortedColumn : sortedColumns) { + builder.addColumns(SortColumn.asc(ColumnName.of(sortedColumn))); + } + return of(builder.build(), pair); } static Aggregation AggSortedFirst(Collection sortedColumns, String... pairs) { - return AggregationFinisher.sortedFirst( - sortedColumns.stream().map(ColumnName::of).map(SortColumn::asc).collect(Collectors.toList())) - .of(pairs); + final KeySortedFirst.Builder builder = KeySortedFirst.builder(); + for (String sortedColumn : sortedColumns) { + builder.addColumns(SortColumn.asc(ColumnName.of(sortedColumn))); + } + return of(builder.build(), pairs); } - static SortedLast AggSortedLast(String sortedColumn, String pair) { - return AggregationFinisher.sortedLast(SortColumn.asc(ColumnName.of(sortedColumn))) - .of(pair); + static Aggregation AggSortedLast(String sortedColumn, String pair) { + return of(KeySortedLast.builder().addColumns(SortColumn.asc(ColumnName.of(sortedColumn))).build(), pair); } static Aggregation AggSortedLast(String sortedColumn, String... pairs) { - return AggregationFinisher.sortedLast(SortColumn.asc(ColumnName.of(sortedColumn))) - .of(pairs); + return of(KeySortedLast.builder().addColumns(SortColumn.asc(ColumnName.of(sortedColumn))).build(), pairs); } - static SortedLast AggSortedLast(Collection sortedColumns, String pair) { - return AggregationFinisher.sortedLast( - sortedColumns.stream().map(ColumnName::of).map(SortColumn::asc).collect(Collectors.toList())) - .of(pair); + static Aggregation AggSortedLast(Collection sortedColumns, String pair) { + final KeySortedLast.Builder builder = KeySortedLast.builder(); + for (String sortedColumn : sortedColumns) { + builder.addColumns(SortColumn.asc(ColumnName.of(sortedColumn))); + } + return of(builder.build(), pair); } static Aggregation AggSortedLast(Collection sortedColumns, String... pairs) { - return AggregationFinisher.sortedLast( - sortedColumns.stream().map(ColumnName::of).map(SortColumn::asc).collect(Collectors.toList())) - .of(pairs); + final KeySortedLast.Builder builder = KeySortedLast.builder(); + for (String sortedColumn : sortedColumns) { + builder.addColumns(SortColumn.asc(ColumnName.of(sortedColumn))); + } + return of(builder.build(), pairs); } - static Std AggStd(String pair) { - return AggregationFinisher.std().of(pair); + static Aggregation AggStd(String pair) { + return of(KeyStd.of(), pair); } static Aggregation AggStd(String... pairs) { - return AggregationFinisher.std().of(pairs); + return of(KeyStd.of(), pairs); } - static Sum AggSum(String pair) { - return AggregationFinisher.sum().of(pair); + static Aggregation AggSum(String pair) { + return of(KeySum.of(), pair); } static Aggregation AggSum(String... pairs) { - return AggregationFinisher.sum().of(pairs); + return of(KeySum.of(), pairs); } - static Unique AggUnique(String pair) { - return AggregationFinisher.unique().of(pair); + static Aggregation AggUnique(String pair) { + return of(KeyUnique.of(), pair); } static Aggregation AggUnique(String... pairs) { - return AggregationFinisher.unique().of(pairs); + return of(KeyUnique.of(), pairs); } - static Unique AggUnique(boolean includeNulls, String pair) { - return AggregationFinisher.unique(includeNulls).of(pair); + static Aggregation AggUnique(boolean includeNulls, String pair) { + return of(KeyUnique.of(includeNulls), pair); } static Aggregation AggUnique(boolean includeNulls, String... pairs) { - return AggregationFinisher.unique(includeNulls).of(pairs); + return of(KeyUnique.of(includeNulls), pairs); } - static Var AggVar(String pair) { - return AggregationFinisher.var().of(pair); + static Aggregation AggVar(String pair) { + return of(KeyVar.of(), pair); } static Aggregation AggVar(String... pairs) { - return AggregationFinisher.var().of(pairs); + return of(KeyVar.of(), pairs); } - static WAvg AggWAvg(String weightColumn, String pair) { - return AggregationFinisher.wAvg(ColumnName.of(weightColumn)).of(pair); + static Aggregation AggWAvg(String weightColumn, String pair) { + return of(KeyWAvg.of(ColumnName.of(weightColumn)), pair); } static Aggregation AggWAvg(String weightColumn, String... pairs) { - return AggregationFinisher.wAvg(ColumnName.of(weightColumn)).of(pairs); + return of(KeyWAvg.of(ColumnName.of(weightColumn)), pairs); } - static WSum AggWSum(String weightColumn, String pair) { - return AggregationFinisher.wSum(ColumnName.of(weightColumn)).of(pair); + static Aggregation AggWSum(String weightColumn, String pair) { + return of(KeyWSum.of(ColumnName.of(weightColumn)), pair); } static Aggregation AggWSum(String weightColumn, String... pairs) { - return AggregationFinisher.wSum(ColumnName.of(weightColumn)).of(pairs); + return of(KeyWSum.of(ColumnName.of(weightColumn)), pairs); } V walk(V visitor); interface Visitor { - void visit(AbsSum absSum); - - void visit(Group group); - - void visit(Avg avg); - void visit(Count count); - void visit(CountDistinct countDistinct); - - void visit(Distinct distinct); - - void visit(First first); - - void visit(Last last); - - void visit(Max max); - - void visit(Med med); - - void visit(Min min); - - void visit(Multi multi); - - void visit(Pct pct); - - void visit(SortedFirst sortedFirst); - - void visit(SortedLast sortedLast); - - void visit(Std std); - - void visit(Sum sum); - - void visit(Unique unique); - - void visit(Var var); - - void visit(WAvg wAvg); + void visit(KeyedAggregation keyedAgg); - void visit(WSum wSum); + void visit(KeyedAggregations keyedAggs); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/AggregationFinisher.java b/table-api/src/main/java/io/deephaven/api/agg/AggregationFinisher.java deleted file mode 100644 index 1c81114c256..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/AggregationFinisher.java +++ /dev/null @@ -1,180 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.api.ColumnName; -import io.deephaven.annotations.SimpleStyle; -import io.deephaven.api.SortColumn; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -import java.util.Collections; -import java.util.function.Function; - -/** - * The aggregation finisher is a helper to aid in building aggregations whose construction can be finished by a - * {@link Pair}. A vararg overload is provided to build a {@link Multi}, {@link #of(Pair...)}, which can be useful to - * reduce the syntax required to build multiple aggregations of the same basic type. Helpers are provided that translate - * the string-equivalents via {@link Pair#parse(String)}. - * - *

- * Not all aggregations may be suitable for construction in this style. - * - * @param the aggregation type - */ -@Immutable -@SimpleStyle -public abstract class AggregationFinisher { - - public static AggregationFinisher absSum() { - return ImmutableAggregationFinisher.of(AbsSum::of); - } - - public static AggregationFinisher group() { - return ImmutableAggregationFinisher.of(Group::of); - } - - public static AggregationFinisher avg() { - return ImmutableAggregationFinisher.of(Avg::of); - } - - public static AggregationFinisher countDistinct() { - return ImmutableAggregationFinisher.of(CountDistinct::of); - } - - public static AggregationFinisher countDistinct(boolean countNulls) { - if (countNulls) { - return ImmutableAggregationFinisher.of(pair -> CountDistinct.of(pair).withNulls()); - } - return ImmutableAggregationFinisher.of(CountDistinct::of); - } - - public static AggregationFinisher distinct() { - return ImmutableAggregationFinisher.of(Distinct::of); - } - - public static AggregationFinisher distinct(boolean includeNulls) { - if (includeNulls) { - return ImmutableAggregationFinisher.of(pair -> Distinct.of(pair).withNulls()); - } - return ImmutableAggregationFinisher.of(Distinct::of); - } - - - public static AggregationFinisher first() { - return ImmutableAggregationFinisher.of(First::of); - } - - public static AggregationFinisher last() { - return ImmutableAggregationFinisher.of(Last::of); - } - - public static AggregationFinisher max() { - return ImmutableAggregationFinisher.of(Max::of); - } - - public static AggregationFinisher med() { - return ImmutableAggregationFinisher.of(Med::of); - } - - public static AggregationFinisher med(boolean average) { - if (average) { - return med(); - } - return ImmutableAggregationFinisher.of(pair -> Med.of(pair).withoutAverage()); - } - - public static AggregationFinisher min() { - return ImmutableAggregationFinisher.of(Min::of); - } - - public static AggregationFinisher pct(double percentile) { - return ImmutableAggregationFinisher.of(pair -> Pct.of(percentile, pair)); - } - - public static AggregationFinisher pct(double percentile, boolean average) { - if (average) { - return ImmutableAggregationFinisher.of(pair -> Pct.of(percentile, pair).withAverage()); - } - return pct(percentile); - } - - static AggregationFinisher sortedFirst(SortColumn sortColumn) { - return sortedFirst(Collections.singleton(sortColumn)); - } - - static AggregationFinisher sortedFirst(Iterable sortColumns) { - return ImmutableAggregationFinisher - .of(pair -> SortedFirst.builder().addAllColumns(sortColumns).pair(pair).build()); - } - - static AggregationFinisher sortedLast(SortColumn sortColumn) { - return sortedLast(Collections.singleton(sortColumn)); - } - - static AggregationFinisher sortedLast(Iterable sortColumns) { - return ImmutableAggregationFinisher - .of(pair -> SortedLast.builder().addAllColumns(sortColumns).pair(pair).build()); - } - - public static AggregationFinisher std() { - return ImmutableAggregationFinisher.of(Std::of); - } - - public static AggregationFinisher sum() { - return ImmutableAggregationFinisher.of(Sum::of); - } - - public static AggregationFinisher unique() { - return ImmutableAggregationFinisher.of(Unique::of); - } - - public static AggregationFinisher unique(boolean includeNulls) { - if (includeNulls) { - return ImmutableAggregationFinisher.of(pair -> Unique.of(pair).withNulls()); - } - return ImmutableAggregationFinisher.of(Unique::of); - } - - - public static AggregationFinisher var() { - return ImmutableAggregationFinisher.of(Var::of); - } - - public static AggregationFinisher wAvg(ColumnName weightColumn) { - return ImmutableAggregationFinisher.of(pair -> WAvg.of(weightColumn, pair)); - } - - public static AggregationFinisher wSum(ColumnName weightColumn) { - return ImmutableAggregationFinisher.of(pair -> WSum.of(weightColumn, pair)); - } - - @Parameter - public abstract Function function(); - - public final AGG of(Pair pair) { - return function().apply(pair); - } - - public final Multi of(Pair... pairs) { - Multi.Builder builder = Multi.builder(); - for (Pair pair : pairs) { - builder.addAggregations(of(pair)); - } - return builder.build(); - } - - public final AGG of(String arg) { - return of(Pair.parse(arg)); - } - - public final Aggregation of(String... arguments) { - return arguments.length == 1 ? of(arguments[0]) : multiOf(arguments); - } - - public final Multi multiOf(String... arguments) { - Multi.Builder builder = Multi.builder(); - for (String x : arguments) { - builder.addAggregations(of(x)); - } - return builder.build(); - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java b/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java new file mode 100644 index 00000000000..e7e11352432 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java @@ -0,0 +1,66 @@ +package io.deephaven.api.agg; + +import io.deephaven.api.ColumnName; +import io.deephaven.api.agg.key.Key; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map.Entry; + +/** + * Optimizes a collection of {@link Aggregation aggregations} by grouping like-keyed aggregations together. + */ +public final class AggregationOptimizer implements Aggregation.Visitor { + private static final Object COUNT_OBJ = new Object(); + + /** + * Optimizes a collection of {@link Aggregation aggregations} by grouping like-keyed aggregations together. The + * input order will be preserved based on the key-encountered order. + * + * @param aggregations the aggregations + * @return the optimized aggregations + */ + public static List of(Collection aggregations) { + final AggregationOptimizer optimizer = new AggregationOptimizer(); + for (Aggregation aggregation : aggregations) { + aggregation.walk(optimizer); + } + return optimizer.build(); + } + + private final LinkedHashMap> visitOrder = new LinkedHashMap<>(); + + public List build() { + List out = new ArrayList<>(); + for (Entry> e : visitOrder.entrySet()) { + if (e.getKey() == COUNT_OBJ) { + for (Pair pair : e.getValue()) { + out.add(Count.of((ColumnName) pair)); + } + } else if (e.getValue().size() == 1) { + throw new UnsupportedOperationException("TODO"); + } else { + out.add(KeyedAggregations.builder().key((Key) e.getKey()).addAllPairs(e.getValue()).build()); + } + } + return out; + } + + @Override + public void visit(Count count) { + visitOrder.computeIfAbsent(COUNT_OBJ, k -> new ArrayList<>()).add(count.column()); + } + + @Override + public void visit(KeyedAggregation keyedAgg) { + visitOrder.computeIfAbsent(keyedAgg.key(), k -> new ArrayList<>()).add(keyedAgg.pair()); + } + + @Override + public void visit(KeyedAggregations keyedAggs) { + visitOrder.computeIfAbsent(keyedAggs.key(), k -> new ArrayList<>()) + .addAll(keyedAggs.pairs()); + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/AggregationOutputs.java b/table-api/src/main/java/io/deephaven/api/agg/AggregationOutputs.java index 51cbddaf20a..83dde217b99 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/AggregationOutputs.java +++ b/table-api/src/main/java/io/deephaven/api/agg/AggregationOutputs.java @@ -25,112 +25,18 @@ Stream getOut() { return Objects.requireNonNull(out); } - private void visitPair(Pair pair) { - out = Stream.of(pair.output()); - } - - @Override - public void visit(AbsSum absSum) { - visitPair(absSum.pair()); - } - - @Override - public void visit(Group group) { - visitPair(group.pair()); - } - - @Override - public void visit(Avg avg) { - visitPair(avg.pair()); - } - @Override public void visit(Count count) { out = Stream.of(count.column()); } @Override - public void visit(CountDistinct countDistinct) { - visitPair(countDistinct.pair()); - } - - @Override - public void visit(Distinct distinct) { - visitPair(distinct.pair()); - } - - @Override - public void visit(First first) { - visitPair(first.pair()); - } - - @Override - public void visit(Last last) { - visitPair(last.pair()); - } - - @Override - public void visit(Max max) { - visitPair(max.pair()); - } - - @Override - public void visit(Med med) { - visitPair(med.pair()); - } - - @Override - public void visit(Min min) { - visitPair(min.pair()); - } - - @Override - public void visit(Multi multi) { - out = of(multi.aggregations()); - } - - @Override - public void visit(Pct pct) { - visitPair(pct.pair()); - } - - @Override - public void visit(SortedFirst sortedFirst) { - visitPair(sortedFirst.pair()); - } - - @Override - public void visit(SortedLast sortedLast) { - visitPair(sortedLast.pair()); - } - - @Override - public void visit(Std std) { - visitPair(std.pair()); - } - - @Override - public void visit(Sum sum) { - visitPair(sum.pair()); - } - - @Override - public void visit(Unique unique) { - visitPair(unique.pair()); - } - - @Override - public void visit(Var var) { - visitPair(var.pair()); - } - - @Override - public void visit(WAvg wAvg) { - visitPair(wAvg.pair()); + public void visit(KeyedAggregation keyedAgg) { + out = Stream.of(keyedAgg.pair().output()); } @Override - public void visit(WSum wSum) { - visitPair(wSum.pair()); + public void visit(KeyedAggregations keyedAggs) { + out = keyedAggs.pairs().stream().map(Pair::output); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/Avg.java b/table-api/src/main/java/io/deephaven/api/agg/Avg.java deleted file mode 100644 index e03787ee361..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Avg.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class Avg implements Aggregation { - - public static Avg of(Pair pair) { - return ImmutableAvg.of(pair); - } - - public static Avg of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Count.java b/table-api/src/main/java/io/deephaven/api/agg/Count.java index 7a835f0df5c..35960cde3f4 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/Count.java +++ b/table-api/src/main/java/io/deephaven/api/agg/Count.java @@ -1,7 +1,7 @@ package io.deephaven.api.agg; -import io.deephaven.api.ColumnName; import io.deephaven.annotations.SimpleStyle; +import io.deephaven.api.ColumnName; import org.immutables.value.Value.Immutable; import org.immutables.value.Value.Parameter; @@ -17,8 +17,6 @@ public static Count of(String x) { return of(ColumnName.of(x)); } - // Note: Count doesn't need Pair since there is no column as input. - @Parameter public abstract ColumnName column(); diff --git a/table-api/src/main/java/io/deephaven/api/agg/CountDistinct.java b/table-api/src/main/java/io/deephaven/api/agg/CountDistinct.java deleted file mode 100644 index 1b311b71154..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/CountDistinct.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.BuildableStyle; -import org.immutables.value.Value.Default; -import org.immutables.value.Value.Immutable; - -@Immutable -@BuildableStyle -public abstract class CountDistinct implements Aggregation { - - public static CountDistinct of(Pair pair) { - return ImmutableCountDistinct.builder().pair(pair).build(); - } - - public static CountDistinct of(String x) { - return of(Pair.parse(x)); - } - - public abstract Pair pair(); - - @Default - public boolean countNulls() { - return false; - } - - public final CountDistinct withNulls() { - return ImmutableCountDistinct.builder().pair(pair()).countNulls(true).build(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Distinct.java b/table-api/src/main/java/io/deephaven/api/agg/Distinct.java deleted file mode 100644 index 993fb8c153e..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Distinct.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.BuildableStyle; -import org.immutables.value.Value.Default; -import org.immutables.value.Value.Immutable; - -@Immutable -@BuildableStyle -public abstract class Distinct implements Aggregation { - - public static Distinct of(Pair pair) { - return ImmutableDistinct.builder().pair(pair).build(); - } - - public static Distinct of(String x) { - return of(Pair.parse(x)); - } - - public abstract Pair pair(); - - @Default - public boolean includeNulls() { - return false; - } - - public final Distinct withNulls() { - return ImmutableDistinct.builder().pair(pair()).includeNulls(true).build(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/First.java b/table-api/src/main/java/io/deephaven/api/agg/First.java deleted file mode 100644 index efd9eba497d..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/First.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class First implements Aggregation { - - public static First of(Pair pair) { - return ImmutableFirst.of(pair); - } - - public static First of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Group.java b/table-api/src/main/java/io/deephaven/api/agg/Group.java deleted file mode 100644 index 5c7d4017864..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Group.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class Group implements Aggregation { - - public static Group of(Pair pair) { - return ImmutableGroup.of(pair); - } - - public static Group of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregation.java b/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregation.java new file mode 100644 index 00000000000..6a92b634a21 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregation.java @@ -0,0 +1,30 @@ +package io.deephaven.api.agg; + +import io.deephaven.annotations.SimpleStyle; +import io.deephaven.api.agg.key.Key; +import org.immutables.value.Value.Immutable; +import org.immutables.value.Value.Parameter; + +/** + * A keyed aggregation is an {@link Aggregation} that is composed of a {@link #key() key} and a {@link #pair() pair}. + */ +@Immutable +@SimpleStyle +public abstract class KeyedAggregation implements Aggregation { + + public static KeyedAggregation of(Key key, Pair pair) { + return ImmutableKeyedAggregation.of(key, pair); + } + + @Parameter + public abstract Key key(); + + @Parameter + public abstract Pair pair(); + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregations.java b/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregations.java new file mode 100644 index 00000000000..bea759c36a1 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregations.java @@ -0,0 +1,51 @@ +package io.deephaven.api.agg; + +import io.deephaven.annotations.BuildableStyle; +import io.deephaven.api.agg.key.Key; +import org.immutables.value.Value.Check; +import org.immutables.value.Value.Immutable; + +import java.util.List; + +/** + * Keyed aggregations is an {@link Aggregation} that is composed of a {@link #key() key} and multiple {@link #pairs() + * pairs}. + */ +@Immutable +@BuildableStyle +public abstract class KeyedAggregations implements Aggregation { + + public static Builder builder() { + return ImmutableKeyedAggregations.builder(); + } + + public abstract Key key(); + + public abstract List pairs(); + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } + + @Check + final void checkSize() { + if (pairs().size() < 2) { + throw new IllegalArgumentException( + String.format("%s should have at least two pairs", KeyedAggregations.class)); + } + } + + public interface Builder { + Builder key(Key key); + + Builder addPairs(Pair element); + + Builder addPairs(Pair... elements); + + Builder addAllPairs(Iterable elements); + + KeyedAggregations build(); + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Last.java b/table-api/src/main/java/io/deephaven/api/agg/Last.java deleted file mode 100644 index bb11ef37588..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Last.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class Last implements Aggregation { - - public static Last of(Pair pair) { - return ImmutableLast.of(pair); - } - - public static Last of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Max.java b/table-api/src/main/java/io/deephaven/api/agg/Max.java deleted file mode 100644 index dc599c0ac37..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Max.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class Max implements Aggregation { - - public static Max of(Pair pair) { - return ImmutableMax.of(pair); - } - - public static Max of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Med.java b/table-api/src/main/java/io/deephaven/api/agg/Med.java deleted file mode 100644 index beea6b59aa4..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Med.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.BuildableStyle; -import org.immutables.value.Value.Default; -import org.immutables.value.Value.Immutable; - -@Immutable -@BuildableStyle -public abstract class Med implements Aggregation { - - public static Med of(Pair pair) { - return ImmutableMed.builder().pair(pair).build(); - } - - public static Med of(String x) { - return of(Pair.parse(x)); - } - - public abstract Pair pair(); - - @Default - public boolean averageMedian() { - return true; - } - - public final Med withoutAverage() { - return ImmutableMed.builder().pair(pair()).averageMedian(false).build(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Min.java b/table-api/src/main/java/io/deephaven/api/agg/Min.java deleted file mode 100644 index fdf97130e65..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Min.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class Min implements Aggregation { - - public static Min of(Pair pair) { - return ImmutableMin.of(pair); - } - - public static Min of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Multi.java b/table-api/src/main/java/io/deephaven/api/agg/Multi.java deleted file mode 100644 index 17fee0d382f..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Multi.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.BuildableStyle; -import org.immutables.value.Value.Check; -import org.immutables.value.Value.Immutable; - -import java.util.List; - -/** - * An aggregation that is a list of other aggregations. Useful as a helper when returning an aggregation constructed via - * a varargs parameter. - * - * @param the aggregation type - * @see AggregationFinisher#of(String...) - */ -@Immutable -@BuildableStyle -public abstract class Multi implements Aggregation { - - static Builder builder() { - return ImmutableMulti.builder(); - } - - public abstract List aggregations(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } - - @Check - final void checkSize() { - if (aggregations().size() < 2) { - throw new IllegalArgumentException( - String.format("%s should have at least two aggregations", Multi.class)); - } - } - - public interface Builder { - Builder addAggregations(AGG element); - - Builder addAggregations(AGG... elements); - - Builder addAllAggregations(Iterable elements); - - Multi build(); - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Pair.java b/table-api/src/main/java/io/deephaven/api/agg/Pair.java index f48a1702de5..f63be5fbcfc 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/Pair.java +++ b/table-api/src/main/java/io/deephaven/api/agg/Pair.java @@ -5,9 +5,7 @@ import java.io.Serializable; /** - * An aggregation pair represents a {@link #input() input} and {@link #output() output} column for some - * {@link Aggregation aggregations}. Aggregations that don't have a one-to-one input/output mapping will not need an agg - * pair. + * A pair represents an {@link #input() input} and an {@link #output() output} column for a {@link KeyedAggregation}. */ public interface Pair extends Serializable { diff --git a/table-api/src/main/java/io/deephaven/api/agg/Std.java b/table-api/src/main/java/io/deephaven/api/agg/Std.java deleted file mode 100644 index 1eba67892db..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Std.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class Std implements Aggregation { - - public static Std of(Pair pair) { - return ImmutableStd.of(pair); - } - - public static Std of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Sum.java b/table-api/src/main/java/io/deephaven/api/agg/Sum.java deleted file mode 100644 index caace3d93f4..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Sum.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class Sum implements Aggregation { - - public static Sum of(Pair pair) { - return ImmutableSum.of(pair); - } - - public static Sum of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - public final AbsSum abs() { - return AbsSum.of(pair()); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Unique.java b/table-api/src/main/java/io/deephaven/api/agg/Unique.java deleted file mode 100644 index b6da88d8eef..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Unique.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.BuildableStyle; -import org.immutables.value.Value.Default; -import org.immutables.value.Value.Immutable; - -@Immutable -@BuildableStyle -public abstract class Unique implements Aggregation { - - public static Unique of(Pair pair) { - return ImmutableUnique.builder().pair(pair).build(); - } - - public static Unique of(String x) { - return of(Pair.parse(x)); - } - - public abstract Pair pair(); - - @Default - public boolean includeNulls() { - return false; - } - - public final Unique withNulls() { - return ImmutableUnique.builder().pair(pair()).includeNulls(true).build(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Var.java b/table-api/src/main/java/io/deephaven/api/agg/Var.java deleted file mode 100644 index ae195cff22b..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/Var.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.deephaven.api.agg; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class Var implements Aggregation { - - public static Var of(Pair pair) { - return ImmutableVar.of(pair); - } - - public static Var of(String x) { - return of(Pair.parse(x)); - } - - @Parameter - public abstract Pair pair(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/Key.java b/table-api/src/main/java/io/deephaven/api/agg/key/Key.java new file mode 100644 index 00000000000..557bdf2ccb4 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/Key.java @@ -0,0 +1,61 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.api.agg.KeyedAggregation; +import io.deephaven.api.agg.KeyedAggregations; +import io.deephaven.api.agg.Pair; + +import java.util.Collection; + +/** + * A key represents the configurable options for {@link KeyedAggregation}, except for the input/output {@link Pair}. + */ +public interface Key { + + KeyedAggregation aggregation(Pair pair); + + KeyedAggregations aggregation(Pair... pairs); + + KeyedAggregations aggregation(Collection pairs); + + V walk(V visitor); + + interface Visitor { + void visit(KeyAbsSum absSum); + + void visit(KeyCountDistinct countDistinct); + + void visit(KeyDistinct distinct); + + void visit(KeyGroup group); + + void visit(KeyAvg avg); + + void visit(KeyFirst first); + + void visit(KeyLast last); + + void visit(KeyMax max); + + void visit(KeyMedian median); + + void visit(KeyMin min); + + void visit(KeyPct pct); + + void visit(KeySortedFirst sortedFirst); + + void visit(KeySortedLast sortedLast); + + void visit(KeyStd std); + + void visit(KeySum sum); + + void visit(KeyUnique unique); + + void visit(KeyWAvg wAvg); + + void visit(KeyWSum wSum); + + void visit(KeyVar var); + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyAbsSum.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyAbsSum.java new file mode 100644 index 00000000000..60e036fc0e5 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyAbsSum.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeyAbsSum extends KeyEmptyBase { + + public static KeyAbsSum of() { + return ImmutableKeyAbsSum.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyAvg.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyAvg.java new file mode 100644 index 00000000000..6399c942c56 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyAvg.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeyAvg extends KeyEmptyBase { + + public static KeyAvg of() { + return ImmutableKeyAvg.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java new file mode 100644 index 00000000000..f92e1a4e666 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java @@ -0,0 +1,25 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.api.agg.KeyedAggregation; +import io.deephaven.api.agg.KeyedAggregations; +import io.deephaven.api.agg.Pair; + +import java.util.Collection; + +public abstract class KeyBase implements Key { + + @Override + public final KeyedAggregation aggregation(Pair pair) { + return KeyedAggregation.of(this, pair); + } + + @Override + public final KeyedAggregations aggregation(Pair... pairs) { + return KeyedAggregations.builder().key(this).addPairs(pairs).build(); + } + + @Override + public final KeyedAggregations aggregation(Collection pairs) { + return KeyedAggregations.builder().key(this).addAllPairs(pairs).build(); + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyCountDistinct.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyCountDistinct.java new file mode 100644 index 00000000000..005c58b7873 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyCountDistinct.java @@ -0,0 +1,29 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.BuildableStyle; +import org.immutables.value.Value.Default; +import org.immutables.value.Value.Immutable; + +@Immutable +@BuildableStyle +public abstract class KeyCountDistinct extends KeyBase { + + public static KeyCountDistinct of() { + return ImmutableKeyCountDistinct.builder().build(); + } + + public static KeyCountDistinct of(boolean countNulls) { + return ImmutableKeyCountDistinct.builder().countNulls(countNulls).build(); + } + + @Default + public boolean countNulls() { + return false; + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyDistinct.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyDistinct.java new file mode 100644 index 00000000000..dfe51eda561 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyDistinct.java @@ -0,0 +1,31 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.BuildableStyle; +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Default; +import org.immutables.value.Value.Immutable; +import org.immutables.value.Value.Parameter; + +@Immutable +@BuildableStyle +public abstract class KeyDistinct extends KeyBase { + + public static KeyDistinct of() { + return ImmutableKeyDistinct.builder().build(); + } + + public static KeyDistinct of(boolean includeNulls) { + return ImmutableKeyDistinct.builder().includeNulls(includeNulls).build(); + } + + @Default + public boolean includeNulls() { + return false; + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyEmptyBase.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyEmptyBase.java new file mode 100644 index 00000000000..928423f1ce0 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyEmptyBase.java @@ -0,0 +1,12 @@ +package io.deephaven.api.agg.key; + +public abstract class KeyEmptyBase extends KeyBase { + + @Override + public final int hashCode() { + // Immutables uses a hashCode of 0 for empty objects. + // Would be better to give them "proper" hashCodes so they don't always collide in map. + // https://github.com/immutables/immutables/issues/1349 + return getClass().hashCode(); + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyFirst.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyFirst.java new file mode 100644 index 00000000000..42c070fc69f --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyFirst.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeyFirst extends KeyEmptyBase { + + public static KeyFirst of() { + return ImmutableKeyFirst.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyGroup.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyGroup.java new file mode 100644 index 00000000000..cf5de3d161e --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyGroup.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeyGroup extends KeyEmptyBase { + + public static KeyGroup of() { + return ImmutableKeyGroup.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyLast.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyLast.java new file mode 100644 index 00000000000..f023620e806 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyLast.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeyLast extends KeyEmptyBase { + + public static KeyLast of() { + return ImmutableKeyLast.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMax.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMax.java new file mode 100644 index 00000000000..44a240f6e59 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMax.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeyMax extends KeyEmptyBase { + + public static KeyMax of() { + return ImmutableKeyMax.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java new file mode 100644 index 00000000000..80887250237 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java @@ -0,0 +1,31 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.BuildableStyle; +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Default; +import org.immutables.value.Value.Immutable; +import org.immutables.value.Value.Parameter; + +@Immutable +@BuildableStyle +public abstract class KeyMedian extends KeyBase { + + public static KeyMedian of() { + return ImmutableKeyMedian.builder().build(); + } + + public static KeyMedian of(boolean averageMedian) { + return ImmutableKeyMedian.builder().averageMedian(averageMedian).build(); + } + + @Default + public boolean averageMedian() { + return true; + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMin.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMin.java new file mode 100644 index 00000000000..89f3ee371f7 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMin.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeyMin extends KeyEmptyBase { + + public static KeyMin of() { + return ImmutableKeyMin.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/Pct.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java similarity index 56% rename from table-api/src/main/java/io/deephaven/api/agg/Pct.java rename to table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java index 0febc4f513c..ddc543bd234 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/Pct.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg; +package io.deephaven.api.agg.key; import io.deephaven.annotations.BuildableStyle; import org.immutables.value.Value.Check; @@ -7,13 +7,15 @@ @Immutable @BuildableStyle -public abstract class Pct implements Aggregation { +public abstract class KeyPct extends KeyBase { - public static Pct of(double percentile, Pair pair) { - return ImmutablePct.builder().percentile(percentile).pair(pair).build(); + public static KeyPct of(double percentile) { + return ImmutableKeyPct.builder().percentile(percentile).build(); } - public abstract Pair pair(); + public static KeyPct of(double percentile, boolean averageMedian) { + return ImmutableKeyPct.builder().percentile(percentile).averageMedian(averageMedian).build(); + } public abstract double percentile(); @@ -22,8 +24,10 @@ public boolean averageMedian() { return false; } - public Pct withAverage() { - return ImmutablePct.builder().percentile(percentile()).pair(pair()).averageMedian(true) + public KeyPct withAverage() { + return ImmutableKeyPct.builder() + .percentile(percentile()) + .averageMedian(true) .build(); } diff --git a/table-api/src/main/java/io/deephaven/api/agg/SortedFirst.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeySortedFirst.java similarity index 78% rename from table-api/src/main/java/io/deephaven/api/agg/SortedFirst.java rename to table-api/src/main/java/io/deephaven/api/agg/key/KeySortedFirst.java index 9948950bdef..558ee5f2abd 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/SortedFirst.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeySortedFirst.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg; +package io.deephaven.api.agg.key; import io.deephaven.annotations.BuildableStyle; import io.deephaven.api.SortColumn; @@ -9,20 +9,18 @@ /** * Note: the sorted-first aggregation only supports {@link SortColumn.Order#ASCENDING} columns at the moment. - * + * * @see SortedFirst / SortedLast aggregations with sort * direction */ @Immutable @BuildableStyle -public abstract class SortedFirst implements Aggregation { +public abstract class KeySortedFirst extends KeyBase { public static Builder builder() { - return ImmutableSortedFirst.builder(); + return ImmutableKeySortedFirst.builder(); } - public abstract Pair pair(); - public abstract List columns(); @Override @@ -41,9 +39,9 @@ final void nonEmptyColumns() { @Check final void checkSortOrder() { // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction - if (!columns().stream().map(SortColumn::order).allMatch(SortedFirst::isAscending)) { + if (!columns().stream().map(SortColumn::order).allMatch(KeySortedFirst::isAscending)) { throw new IllegalArgumentException( - "Can only construct SortedFirst with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); + "Can only construct KeySortedFirst with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); } } @@ -52,14 +50,12 @@ private static boolean isAscending(SortColumn.Order o) { } public interface Builder { - Builder pair(Pair pair); - Builder addColumns(SortColumn element); Builder addColumns(SortColumn... elements); Builder addAllColumns(Iterable elements); - SortedFirst build(); + KeySortedFirst build(); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/SortedLast.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeySortedLast.java similarity index 79% rename from table-api/src/main/java/io/deephaven/api/agg/SortedLast.java rename to table-api/src/main/java/io/deephaven/api/agg/key/KeySortedLast.java index 302c38165cc..79ece78a6da 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/SortedLast.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeySortedLast.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg; +package io.deephaven.api.agg.key; import io.deephaven.annotations.BuildableStyle; import io.deephaven.api.SortColumn; @@ -9,20 +9,18 @@ /** * Note: the sorted-last aggregation only supports {@link SortColumn.Order#ASCENDING} columns at the moment. - * + * * @see SortedFirst / SortedLast aggregations with sort * direction */ @Immutable @BuildableStyle -public abstract class SortedLast implements Aggregation { +public abstract class KeySortedLast extends KeyBase { public static Builder builder() { - return ImmutableSortedLast.builder(); + return ImmutableKeySortedLast.builder(); } - public abstract Pair pair(); - public abstract List columns(); @Override @@ -41,9 +39,9 @@ final void nonEmptyColumns() { @Check final void checkSortOrder() { // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction - if (!columns().stream().map(SortColumn::order).allMatch(SortedLast::isAscending)) { + if (!columns().stream().map(SortColumn::order).allMatch(KeySortedLast::isAscending)) { throw new IllegalArgumentException( - "Can only construct SortedLast with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); + "Can only construct KeySortedLast with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); } } @@ -52,14 +50,12 @@ private static boolean isAscending(SortColumn.Order o) { } public interface Builder { - Builder pair(Pair pair); - Builder addColumns(SortColumn element); Builder addColumns(SortColumn... elements); Builder addAllColumns(Iterable elements); - SortedLast build(); + KeySortedLast build(); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyStd.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyStd.java new file mode 100644 index 00000000000..0529515de77 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyStd.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeyStd extends KeyEmptyBase { + + public static KeyStd of() { + return ImmutableKeyStd.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeySum.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeySum.java new file mode 100644 index 00000000000..52357fc05bd --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeySum.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeySum extends KeyEmptyBase { + + public static KeySum of() { + return ImmutableKeySum.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyUnique.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyUnique.java new file mode 100644 index 00000000000..88c8fa88857 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyUnique.java @@ -0,0 +1,31 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.BuildableStyle; +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Default; +import org.immutables.value.Value.Immutable; +import org.immutables.value.Value.Parameter; + +@Immutable +@BuildableStyle +public abstract class KeyUnique extends KeyBase { + + public static KeyUnique of() { + return ImmutableKeyUnique.builder().build(); + } + + public static KeyUnique of(boolean includeNulls) { + return ImmutableKeyUnique.builder().includeNulls(includeNulls).build(); + } + + @Default + public boolean includeNulls() { + return false; + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyVar.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyVar.java new file mode 100644 index 00000000000..32f74ad4191 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyVar.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class KeyVar extends KeyEmptyBase { + + public static KeyVar of() { + return ImmutableKeyVar.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/WAvg.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyWAvg.java similarity index 61% rename from table-api/src/main/java/io/deephaven/api/agg/WAvg.java rename to table-api/src/main/java/io/deephaven/api/agg/key/KeyWAvg.java index fff72c32f4b..bd7ae46beea 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/WAvg.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyWAvg.java @@ -1,21 +1,18 @@ -package io.deephaven.api.agg; +package io.deephaven.api.agg.key; -import io.deephaven.api.ColumnName; import io.deephaven.annotations.SimpleStyle; +import io.deephaven.api.ColumnName; import org.immutables.value.Value.Immutable; import org.immutables.value.Value.Parameter; @Immutable @SimpleStyle -public abstract class WAvg implements Aggregation { +public abstract class KeyWAvg extends KeyBase { - public static WAvg of(ColumnName weight, Pair addition) { - return ImmutableWAvg.of(addition, weight); + public static KeyWAvg of(ColumnName weight) { + return ImmutableKeyWAvg.of(weight); } - @Parameter - public abstract Pair pair(); - @Parameter public abstract ColumnName weight(); diff --git a/table-api/src/main/java/io/deephaven/api/agg/WSum.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyWSum.java similarity index 61% rename from table-api/src/main/java/io/deephaven/api/agg/WSum.java rename to table-api/src/main/java/io/deephaven/api/agg/key/KeyWSum.java index 43c1a3c6ca5..2e1c95a50bc 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/WSum.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyWSum.java @@ -1,21 +1,18 @@ -package io.deephaven.api.agg; +package io.deephaven.api.agg.key; -import io.deephaven.api.ColumnName; import io.deephaven.annotations.SimpleStyle; +import io.deephaven.api.ColumnName; import org.immutables.value.Value.Immutable; import org.immutables.value.Value.Parameter; @Immutable @SimpleStyle -public abstract class WSum implements Aggregation { +public abstract class KeyWSum extends KeyBase { - public static WSum of(ColumnName weight, Pair addition) { - return ImmutableWSum.of(addition, weight); + public static KeyWSum of(ColumnName weight) { + return ImmutableKeyWSum.of(weight); } - @Parameter - public abstract Pair pair(); - @Parameter public abstract ColumnName weight(); From 90de9d38b567bd1242689c3f04aa3eaafaa0cad0 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 30 Nov 2021 17:03:28 -0800 Subject: [PATCH 02/20] Add aggAllBy with Key to TableOperations --- .../java/io/deephaven/engine/table/Table.java | 19 ++++++++ .../io/deephaven/qst/table/TableBase.java | 47 +++++++++++-------- .../io/deephaven/api/TableOperations.java | 11 +++++ .../deephaven/api/TableOperationsAdapter.java | 21 +++++++++ 4 files changed, 78 insertions(+), 20 deletions(-) diff --git a/engine/api/src/main/java/io/deephaven/engine/table/Table.java b/engine/api/src/main/java/io/deephaven/engine/table/Table.java index 12fac319f64..420d69956da 100644 --- a/engine/api/src/main/java/io/deephaven/engine/table/Table.java +++ b/engine/api/src/main/java/io/deephaven/engine/table/Table.java @@ -6,6 +6,7 @@ import io.deephaven.api.*; import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.key.Key; import io.deephaven.api.filter.Filter; import io.deephaven.engine.liveness.LivenessNode; import io.deephaven.engine.rowset.TrackingRowSet; @@ -995,6 +996,22 @@ Table join(Table rightTable, Collection columnsToMatch, @ConcurrentMethod Table groupBy(); + @Override + @ConcurrentMethod + Table aggAllBy(Key key); + + @Override + @ConcurrentMethod + Table aggAllBy(Key key, String... groupByColumns); + + @Override + @ConcurrentMethod + Table aggAllBy(Key key, Selectable... groupByColumns); + + @Override + @ConcurrentMethod + Table aggAllBy(Key key, Collection groupByColumns); + @Override @ConcurrentMethod Table aggBy(Aggregation aggregation); @@ -1283,6 +1300,7 @@ Table join(Table rightTable, Collection columnsToMatch, *

* When the input table is empty, zero output rows are produced. */ + @ConcurrentMethod Table stdBy(); /** @@ -1317,6 +1335,7 @@ Table join(Table rightTable, Collection columnsToMatch, *

* When the input table is empty, zero output rows are produced. */ + @ConcurrentMethod Table varBy(); /** diff --git a/qst/src/main/java/io/deephaven/qst/table/TableBase.java b/qst/src/main/java/io/deephaven/qst/table/TableBase.java index b6190dc4fff..c02c3290ba6 100644 --- a/qst/src/main/java/io/deephaven/qst/table/TableBase.java +++ b/qst/src/main/java/io/deephaven/qst/table/TableBase.java @@ -405,17 +405,41 @@ public final SelectTable select(Collection columns) { @Override public final SingleAggregationTable groupBy() { - return fullAggBy(KeyGroup.of()); + return aggAllBy(KeyGroup.of()); } @Override public final SingleAggregationTable groupBy(String... groupByColumns) { - return fullAggBy(KeyGroup.of(), groupByColumns); + return aggAllBy(KeyGroup.of(), groupByColumns); } @Override public final SingleAggregationTable groupBy(Collection groupByColumns) { - return fullAggBy(KeyGroup.of(), groupByColumns); + return aggAllBy(KeyGroup.of(), groupByColumns.toArray(new Selectable[0])); + } + + @Override + public final SingleAggregationTable aggAllBy(Key key) { + return SingleAggregationTable.builder().parent(this).key(key).build(); + } + + @Override + public final SingleAggregationTable aggAllBy(Key key, String... groupByColumns) { + return aggAllBy(key, Arrays.asList(groupByColumns)); + } + + @Override + public final SingleAggregationTable aggAllBy(Key key, Selectable... groupByColumns) { + return SingleAggregationTable.builder().parent(this).key(key).addColumns(groupByColumns).build(); + } + + @Override + public final SingleAggregationTable aggAllBy(Key key, Collection groupByColumns) { + SingleAggregationTable.Builder builder = SingleAggregationTable.builder().parent(this).key(key); + for (String groupByColumn : groupByColumns) { + builder.addColumns(Selectable.parse(groupByColumn)); + } + return builder.build(); } @Override @@ -477,21 +501,4 @@ private static Collection split(String string) { : Arrays.stream(string.split(",")).map(String::trim).filter(s -> !s.isEmpty()) .collect(Collectors.toList()); } - - private SingleAggregationTable fullAggBy(Key key) { - return SingleAggregationTable.builder().parent(this).key(key).build(); - } - - private SingleAggregationTable fullAggBy(Key key, String... groupByColumns) { - SingleAggregationTable.Builder builder = SingleAggregationTable.builder().parent(this).key(key); - for (String groupByColumn : groupByColumns) { - builder.addColumns(Selectable.parse(groupByColumn)); - } - return builder.build(); - } - - private SingleAggregationTable fullAggBy(Key key, Collection groupByColumns) { - return SingleAggregationTable.builder().parent(this).key(key).addAllColumns(groupByColumns).build(); - } - } diff --git a/table-api/src/main/java/io/deephaven/api/TableOperations.java b/table-api/src/main/java/io/deephaven/api/TableOperations.java index d50e0ff7b41..5e9cb7cc227 100644 --- a/table-api/src/main/java/io/deephaven/api/TableOperations.java +++ b/table-api/src/main/java/io/deephaven/api/TableOperations.java @@ -1,6 +1,7 @@ package io.deephaven.api; import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.key.Key; import io.deephaven.api.filter.Filter; import java.util.Collection; @@ -548,6 +549,16 @@ TOPS raj(TABLE rightTable, Collection columnsToMatch, // ------------------------------------------------------------------------------------------- + TOPS aggAllBy(Key key); + + TOPS aggAllBy(Key key, String... groupByColumns); + + TOPS aggAllBy(Key key, Selectable... groupByColumns); + + TOPS aggAllBy(Key key, Collection groupByColumns); + + // ------------------------------------------------------------------------------------------- + TOPS aggBy(Aggregation aggregation); TOPS aggBy(Aggregation aggregation, String... groupByColumns); diff --git a/table-api/src/main/java/io/deephaven/api/TableOperationsAdapter.java b/table-api/src/main/java/io/deephaven/api/TableOperationsAdapter.java index a02c3f3889b..afa0ada39c8 100644 --- a/table-api/src/main/java/io/deephaven/api/TableOperationsAdapter.java +++ b/table-api/src/main/java/io/deephaven/api/TableOperationsAdapter.java @@ -1,6 +1,7 @@ package io.deephaven.api; import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.key.Key; import io.deephaven.api.filter.Filter; import java.util.Collection; @@ -275,6 +276,26 @@ public final TOPS_1 groupBy(Collection groupByColumns) { return adapt(delegate.groupBy(groupByColumns)); } + @Override + public final TOPS_1 aggAllBy(Key key) { + return adapt(delegate.aggAllBy(key)); + } + + @Override + public final TOPS_1 aggAllBy(Key key, String... groupByColumns) { + return adapt(delegate.aggAllBy(key, groupByColumns)); + } + + @Override + public final TOPS_1 aggAllBy(Key key, Selectable... groupByColumns) { + return adapt(delegate.aggAllBy(key, groupByColumns)); + } + + @Override + public final TOPS_1 aggAllBy(Key key, Collection groupByColumns) { + return adapt(delegate.aggAllBy(key, groupByColumns)); + } + @Override public final TOPS_1 aggBy(Aggregation aggregation) { return adapt(delegate.aggBy(aggregation)); From 6864e7d3ee5fb4d63dc249bbac70effbae692b68 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 08:33:32 -0800 Subject: [PATCH 03/20] Actually plumb impl --- .../engine/table/impl/HierarchicalTable.java | 6 + .../engine/table/impl/QueryTable.java | 149 +++++++++++++++++- .../engine/table/impl/TableWithDefaults.java | 39 +++++ .../engine/table/impl/UncoalescedTable.java | 7 + .../table/impl/by/AggregationSpecAdapter.java | 3 +- 5 files changed, 200 insertions(+), 4 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java index ab91c8fd89d..2d8954d0856 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java @@ -4,6 +4,7 @@ import io.deephaven.api.Selectable; import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.key.Key; import io.deephaven.api.filter.Filter; import io.deephaven.engine.rowset.TrackingRowSet; import io.deephaven.engine.table.MatchPair; @@ -208,6 +209,11 @@ public Table groupBy(Collection groupByColumns) { return throwUnsupported("groupBy()"); } + @Override + public Table aggAllBy(Key key, Selectable... groupByColumns) { + return throwUnsupported("aggAllBy()"); + } + @Override public Table aggBy(Collection aggregations, Collection groupByColumns) { diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 08cc4b3ef02..80d81f384b7 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -10,6 +10,26 @@ import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.AggregationOutputs; +import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; import io.deephaven.api.filter.Filter; import io.deephaven.base.StringUtils; import io.deephaven.base.verify.Assert; @@ -592,6 +612,11 @@ public Table groupBy(Collection groupByColumns) { () -> by(new AggregationGroupSpec(), SelectColumn.from(groupByColumns))); } + @Override + public Table aggAllBy(Key key, Selectable... groupByColumns) { + return key.walk(new SingleAggVisitor(groupByColumns)).out(); + } + @Override public Table aggBy(final Collection aggregations, final Collection groupByColumns) { @@ -671,9 +696,9 @@ public Table maxBy(Selectable... groupByColumns) { @Override public Table medianBy(Selectable... groupByColumns) { - return QueryPerformanceRecorder.withNugget("medianBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> by(new PercentileBySpecImpl(0.50, true), SelectColumn.from(groupByColumns))); + final SingleAggVisitor visitor = new SingleAggVisitor(groupByColumns); + visitor.visit(KeyMedian.of()); + return visitor.out(); } @Override @@ -3454,4 +3479,122 @@ public R apply(Function function) { public Table wouldMatch(WouldMatchPair... matchers) { return getResult(new WouldMatchOperation(this, matchers)); } + + private class SingleAggVisitor implements Key.Visitor { + private final Selectable[] groupByColumns; + private Table out; + + public SingleAggVisitor(Selectable[] groupByColumns) { + this.groupByColumns = Objects.requireNonNull(groupByColumns); + } + + public Table out() { + return Objects.requireNonNull(out); + } + + private Table visitGeneric(Key key) { + final QueryTable tableToUse = (QueryTable) dropColumnFormats(); + return QueryPerformanceRecorder.withNugget("aggAllBy(" + key + "," + Arrays.toString(groupByColumns) + ")", + sizeForInstrumentation(), + () -> tableToUse.by(AggregationSpecAdapter.of(key), SelectColumn.from(groupByColumns))); + } + + @Override + public void visit(KeyAbsSum absSum) { + out = absSumBy(groupByColumns); + } + + @Override + public void visit(KeyCountDistinct countDistinct) { + out = visitGeneric(countDistinct); + } + + @Override + public void visit(KeyDistinct distinct) { + out = visitGeneric(distinct); + } + + @Override + public void visit(KeyGroup group) { + out = groupBy(List.of(groupByColumns)); + } + + @Override + public void visit(KeyAvg avg) { + out = avgBy(groupByColumns); + } + + @Override + public void visit(KeyFirst first) { + out = firstBy(groupByColumns); + } + + @Override + public void visit(KeyLast last) { + out = lastBy(groupByColumns); + } + + @Override + public void visit(KeyMax max) { + out = maxBy(groupByColumns); + } + + @Override + public void visit(KeyMedian median) { + out = QueryPerformanceRecorder.withNugget("medianBy(" + Arrays.toString(groupByColumns) + ")", + sizeForInstrumentation(), + () -> by(new PercentileBySpecImpl(0.50, median.averageMedian()), + SelectColumn.from(groupByColumns))); + } + + @Override + public void visit(KeyMin min) { + out = minBy(groupByColumns); + } + + @Override + public void visit(KeyPct pct) { + out = visitGeneric(pct); + } + + @Override + public void visit(KeySortedFirst sortedFirst) { + out = visitGeneric(sortedFirst); + } + + @Override + public void visit(KeySortedLast sortedLast) { + out = visitGeneric(sortedLast); + } + + @Override + public void visit(KeyStd std) { + out = stdBy(groupByColumns); + } + + @Override + public void visit(KeySum sum) { + out = sumBy(groupByColumns); + } + + @Override + public void visit(KeyUnique unique) { + out = visitGeneric(unique); + } + + @Override + public void visit(KeyWAvg wAvg) { + out = wavgBy(wAvg.weight().name(), groupByColumns); + } + + @Override + public void visit(KeyWSum wSum) { + out = wsumBy(wSum.weight().name(), groupByColumns); + } + + @Override + public void visit(KeyVar var) { + out = varBy(groupByColumns); + } + } } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java index c00f2ee4c75..86936b7c1d3 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java @@ -6,6 +6,27 @@ import io.deephaven.api.*; import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.Key.Visitor; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; import io.deephaven.api.filter.Filter; import io.deephaven.base.Pair; import io.deephaven.base.StringUtils; @@ -672,6 +693,24 @@ default Table groupBy() { return groupBy(Collections.emptyList()); } + @Override + @ConcurrentMethod + default Table aggAllBy(Key key) { + return aggAllBy(key, Collections.emptyList()); + } + + @Override + @ConcurrentMethod + default Table aggAllBy(Key key, String... groupByColumns) { + return aggAllBy(key, List.of(groupByColumns)); + } + + @Override + @ConcurrentMethod + default Table aggAllBy(Key key, Collection groupByColumns) { + return aggAllBy(key, Selectable.from(groupByColumns).toArray(ZERO_LENGTH_SELECTABLE_ARRAY)); + } + @Override @ConcurrentMethod default Table aggBy(Aggregation aggregation) { diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java index 0568090af1c..a75a8c34c4f 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java @@ -8,6 +8,7 @@ import io.deephaven.api.Selectable; import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.key.Key; import io.deephaven.api.filter.Filter; import io.deephaven.base.verify.Assert; import io.deephaven.engine.liveness.Liveness; @@ -346,6 +347,12 @@ public Table groupBy(Collection groupByColumns) { return coalesce().groupBy(groupByColumns); } + @Override + @ConcurrentMethod + public Table aggAllBy(Key key, Selectable... groupByColumns) { + return coalesce().aggAllBy(key, groupByColumns); + } + @Override @ConcurrentMethod public Table aggBy(Collection aggregations, diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java index 02084691804..9a46c6ea92d 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java @@ -22,10 +22,11 @@ import io.deephaven.api.agg.key.KeyVar; import io.deephaven.api.agg.key.KeyWAvg; import io.deephaven.api.agg.key.KeyWSum; +import org.jetbrains.annotations.NotNull; import java.util.Objects; -class AggregationSpecAdapter implements Key.Visitor { +public class AggregationSpecAdapter implements Key.Visitor { public static AggregationSpec of(Key key) { return key.walk(new AggregationSpecAdapter()).out(); From bba5f2580d3cc848dc8dec39b5fef22fad2262f5 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 09:50:11 -0800 Subject: [PATCH 04/20] Use the generic code path for aggAllBys that support it --- .../engine/table/impl/HierarchicalTable.java | 37 +----- .../engine/table/impl/QueryTable.java | 107 +++------------- .../engine/table/impl/TableWithDefaults.java | 57 +++++++++ .../table/impl/by/AggregationSpecAdapter.java | 118 ++++++++++++++---- .../api/agg/AggregationOptimizer.java | 2 +- 5 files changed, 173 insertions(+), 148 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java index 2d8954d0856..9bc038ea499 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java @@ -204,14 +204,9 @@ public Table tailPct(double percent) { return throwUnsupported("tailPct()"); } - @Override - public Table groupBy(Collection groupByColumns) { - return throwUnsupported("groupBy()"); - } - @Override public Table aggAllBy(Key key, Selectable... groupByColumns) { - return throwUnsupported("aggAllBy()"); + return throwUnsupported("aggAllBy(" + key + ")"); } @Override @@ -236,36 +231,6 @@ public Table applyToAllBy(String formulaColumn, String columnParamName, return throwUnsupported("applyToAllBy()"); } - @Override - public Table sumBy(Selectable... groupByColumns) { - return throwUnsupported("sumBy()"); - } - - @Override - public Table absSumBy(Selectable... groupByColumns) { - return throwUnsupported("absSumBy()"); - } - - @Override - public Table avgBy(Selectable... groupByColumns) { - return throwUnsupported("avgBy()"); - } - - @Override - public Table wavgBy(String weightColumn, Selectable... groupByColumns) { - return throwUnsupported("wavgBy()"); - } - - @Override - public Table stdBy(Selectable... groupByColumns) { - return throwUnsupported("stdBy()"); - } - - @Override - public Table varBy(Selectable... groupByColumns) { - return throwUnsupported("varBy()"); - } - @Override public Table where(Collection filters) { return throwUnsupported("where()"); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 80d81f384b7..a4859a701f6 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -605,13 +605,6 @@ public Table exactJoin(Table table, MatchPair[] columnsToMatch, MatchPair[] colu () -> naturalJoinInternal(table, columnsToMatch, columnsToAdd, true)); } - @Override - public Table groupBy(Collection groupByColumns) { - return QueryPerformanceRecorder.withNugget("groupBy(" + groupByColumns + ")", - sizeForInstrumentation(), - () -> by(new AggregationGroupSpec(), SelectColumn.from(groupByColumns))); - } - @Override public Table aggAllBy(Key key, Selectable... groupByColumns) { return key.walk(new SingleAggVisitor(groupByColumns)).out(); @@ -694,13 +687,6 @@ public Table maxBy(Selectable... groupByColumns) { }); } - @Override - public Table medianBy(Selectable... groupByColumns) { - final SingleAggVisitor visitor = new SingleAggVisitor(groupByColumns); - visitor.visit(KeyMedian.of()); - return visitor.out(); - } - @Override public Table countBy(String countColumnName, Selectable... groupByColumns) { return QueryPerformanceRecorder.withNugget( @@ -1000,62 +986,6 @@ public Table applyToAllBy(String formulaColumn, String columnParamName, SelectColumn.from(groupByColumns))); } - @Override - public Table sumBy(Selectable... groupByColumns) { - final QueryTable tableToUse = (QueryTable) dropColumnFormats(); - return QueryPerformanceRecorder.withNugget("sumBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> tableToUse.by(new SumSpec(), SelectColumn.from(groupByColumns))); - } - - @Override - public Table absSumBy(Selectable... groupByColumns) { - final QueryTable tableToUse = (QueryTable) dropColumnFormats(); - return QueryPerformanceRecorder.withNugget("absSumBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> tableToUse.by(new AbsSumSpec(), SelectColumn.from(groupByColumns))); - } - - @Override - public Table avgBy(Selectable... groupByColumns) { - final QueryTable tableToUse = (QueryTable) dropColumnFormats(); - return QueryPerformanceRecorder.withNugget("avgBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> tableToUse.by(new AvgSpec(), SelectColumn.from(groupByColumns))); - } - - @Override - public Table wavgBy(String weightColumn, Selectable... groupByColumns) { - final QueryTable tableToUse = (QueryTable) dropColumnFormats(); - return QueryPerformanceRecorder.withNugget( - "wavgBy(" + weightColumn + ", " + Arrays.toString(groupByColumns) + ")", sizeForInstrumentation(), - () -> tableToUse.by(new WeightedAverageSpecImpl(weightColumn), SelectColumn.from(groupByColumns))); - } - - @Override - public Table wsumBy(String weightColumn, Selectable... groupByColumns) { - final QueryTable tableToUse = (QueryTable) dropColumnFormats(); - return QueryPerformanceRecorder.withNugget( - "wsumBy(" + weightColumn + ", " + Arrays.toString(groupByColumns) + ")", sizeForInstrumentation(), - () -> tableToUse.by(new WeightedSumSpecImpl(weightColumn), SelectColumn.from(groupByColumns))); - } - - @Override - public Table stdBy(Selectable... groupByColumns) { - final QueryTable tableToUse = (QueryTable) dropColumnFormats(); - return QueryPerformanceRecorder.withNugget("stdBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> tableToUse.by(new StdSpec(), SelectColumn.from(groupByColumns))); - } - - @Override - public Table varBy(Selectable... groupByColumns) { - final QueryTable tableToUse = (QueryTable) dropColumnFormats(); - return QueryPerformanceRecorder.withNugget("varBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> tableToUse.by(new VarSpec(), SelectColumn.from(groupByColumns))); - } - public static class FilteredTable extends QueryTable implements WhereFilter.RecomputeListener { private final QueryTable source; private final WhereFilter[] filters; @@ -3492,8 +3422,8 @@ public Table out() { return Objects.requireNonNull(out); } - private Table visitGeneric(Key key) { - final QueryTable tableToUse = (QueryTable) dropColumnFormats(); + private Table visitGeneric(Key key, boolean dropFormatColumns) { + final QueryTable tableToUse = dropFormatColumns ? (QueryTable) dropColumnFormats() : QueryTable.this; return QueryPerformanceRecorder.withNugget("aggAllBy(" + key + "," + Arrays.toString(groupByColumns) + ")", sizeForInstrumentation(), () -> tableToUse.by(AggregationSpecAdapter.of(key), SelectColumn.from(groupByColumns))); @@ -3501,27 +3431,27 @@ private Table visitGeneric(Key key) { @Override public void visit(KeyAbsSum absSum) { - out = absSumBy(groupByColumns); + out = visitGeneric(absSum, true); } @Override public void visit(KeyCountDistinct countDistinct) { - out = visitGeneric(countDistinct); + out = visitGeneric(countDistinct, true); } @Override public void visit(KeyDistinct distinct) { - out = visitGeneric(distinct); + out = visitGeneric(distinct, true); } @Override public void visit(KeyGroup group) { - out = groupBy(List.of(groupByColumns)); + out = visitGeneric(group, true); } @Override public void visit(KeyAvg avg) { - out = avgBy(groupByColumns); + out = visitGeneric(avg, true); } @Override @@ -3541,10 +3471,7 @@ public void visit(KeyMax max) { @Override public void visit(KeyMedian median) { - out = QueryPerformanceRecorder.withNugget("medianBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> by(new PercentileBySpecImpl(0.50, median.averageMedian()), - SelectColumn.from(groupByColumns))); + out = visitGeneric(median, median.averageMedian()); } @Override @@ -3554,47 +3481,47 @@ public void visit(KeyMin min) { @Override public void visit(KeyPct pct) { - out = visitGeneric(pct); + out = visitGeneric(pct, pct.averageMedian()); } @Override public void visit(KeySortedFirst sortedFirst) { - out = visitGeneric(sortedFirst); + out = visitGeneric(sortedFirst, true); } @Override public void visit(KeySortedLast sortedLast) { - out = visitGeneric(sortedLast); + out = visitGeneric(sortedLast, true); } @Override public void visit(KeyStd std) { - out = stdBy(groupByColumns); + out = visitGeneric(std, true); } @Override public void visit(KeySum sum) { - out = sumBy(groupByColumns); + out = visitGeneric(sum, true); } @Override public void visit(KeyUnique unique) { - out = visitGeneric(unique); + out = visitGeneric(unique, false); } @Override public void visit(KeyWAvg wAvg) { - out = wavgBy(wAvg.weight().name(), groupByColumns); + out = visitGeneric(wAvg, true); } @Override public void visit(KeyWSum wSum) { - out = wsumBy(wSum.weight().name(), groupByColumns); + out = visitGeneric(wSum, true); } @Override public void visit(KeyVar var) { - out = varBy(groupByColumns); + out = visitGeneric(var, true); } } } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java index 86936b7c1d3..eb3e87235bd 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java @@ -681,6 +681,13 @@ default Table join(Table rightTable, Collection columnsToMa // Aggregation Operations // ----------------------------------------------------------------------------------------------------------------- + + @Override + @ConcurrentMethod + default Table groupBy(Collection groupByColumns) { + return aggAllBy(KeyGroup.of(), groupByColumns.toArray(Selectable[]::new)); + } + @Override @ConcurrentMethod default Table groupBy(String... groupByColumns) { @@ -778,6 +785,12 @@ default Table applyToAllBy(String formulaColumn, String... groupByColumns) { return applyToAllBy(formulaColumn, Selectable.from(groupByColumns)); } + @Override + @ConcurrentMethod + default Table sumBy(Selectable... groupByColumns) { + return aggAllBy(KeySum.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table sumBy(String... groupByColumns) { @@ -796,6 +809,12 @@ default Table sumBy() { return sumBy(ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table absSumBy(Selectable... groupByColumns) { + return aggAllBy(KeyAbsSum.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table absSumBy(String... groupByColumns) { @@ -814,6 +833,12 @@ default Table absSumBy() { return absSumBy(ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table avgBy(Selectable... groupByColumns) { + return aggAllBy(KeyAvg.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table avgBy(String... groupByColumns) { @@ -832,6 +857,12 @@ default Table avgBy() { return avgBy(ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table wavgBy(String weightColumn, Selectable... groupByColumns) { + return aggAllBy(KeyWAvg.of(ColumnName.of(weightColumn)), groupByColumns); + } + @Override @ConcurrentMethod default Table wavgBy(String weightColumn, String... groupByColumns) { @@ -850,6 +881,12 @@ default Table wavgBy(String weightColumn) { return wavgBy(weightColumn, ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table wsumBy(String weightColumn, Selectable... groupByColumns) { + return aggAllBy(KeyWSum.of(ColumnName.of(weightColumn)), groupByColumns); + } + @Override @ConcurrentMethod default Table wsumBy(String weightColumn) { @@ -868,6 +905,12 @@ default Table wsumBy(String weightColumn, Collection groupByColumns) { return wsumBy(weightColumn, Selectable.from(groupByColumns).toArray(ZERO_LENGTH_SELECTABLE_ARRAY)); } + @Override + @ConcurrentMethod + default Table stdBy(Selectable... groupByColumns) { + return aggAllBy(KeyStd.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table stdBy(String... groupByColumns) { @@ -881,10 +924,17 @@ default Table stdBy(Collection groupByColumns) { } @Override + @ConcurrentMethod default Table stdBy() { return stdBy(ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table varBy(Selectable... groupByColumns) { + return aggAllBy(KeyVar.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table varBy(String... groupByColumns) { @@ -898,6 +948,7 @@ default Table varBy(Collection groupByColumns) { } @Override + @ConcurrentMethod default Table varBy() { return varBy(ZERO_LENGTH_SELECTABLE_ARRAY); } @@ -974,6 +1025,12 @@ default Table maxBy() { return maxBy(ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table medianBy(Selectable... groupByColumns) { + return aggAllBy(KeyMedian.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table medianBy(String... groupByColumns) { diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java index 9a46c6ea92d..049fd9137ff 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java @@ -32,6 +32,84 @@ public static AggregationSpec of(Key key) { return key.walk(new AggregationSpecAdapter()).out(); } + public static AggregationSpec of(KeyAbsSum key) { + return key.walk(new AggregationSpecAdapter()).out(); + } + + public static AggregationSpec of(KeyCountDistinct countDistinct) { + return new CountDistinctSpec(countDistinct.countNulls()); + } + + public static AggregationSpec of(KeyDistinct distinct) { + return new DistinctSpec(distinct.includeNulls()); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeyGroup group) { + return new AggregationGroupSpec(); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeyAvg avg) { + return new AvgSpec(); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeyFirst first) { + return new FirstBySpecImpl(); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeyLast last) { + return new LastBySpecImpl(); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeyMax max) { + return new MinMaxBySpecImpl(false); + } + + public static AggregationSpec of(KeyMedian median) { + return new PercentileBySpecImpl(0.50d, median.averageMedian()); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeyMin min) { + return new MinMaxBySpecImpl(true); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeyPct pct) { + return new PercentileBySpecImpl(pct.percentile(), pct.averageMedian()); + } + + public static AggregationSpec of(KeySortedFirst sortedFirst) { + return new SortedFirstBy( + sortedFirst.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); + } + + public static AggregationSpec of(KeySortedLast sortedLast) { + return new SortedLastBy( + sortedLast.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeyStd std) { + return new StdSpec(); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeySum sum) { + return new SumSpec(); + } + + public static AggregationSpec of(KeyUnique unique) { + return new UniqueSpec(unique.includeNulls()); + } + + public static AggregationSpec of(KeyWAvg wAvg) { + return new WeightedAverageSpecImpl(wAvg.weight().name()); + } + + public static AggregationSpec of(KeyWSum wSum) { + return new WeightedSumSpecImpl(wSum.weight().name()); + } + + public static AggregationSpec of(@SuppressWarnings("unused") KeyVar var) { + return new VarSpec(); + } + private AggregationSpec out; public AggregationSpec out() { @@ -40,98 +118,96 @@ public AggregationSpec out() { @Override public void visit(KeyAbsSum absSum) { - out = new AbsSumSpec(); + out = of(absSum); } @Override public void visit(KeyCountDistinct countDistinct) { - out = new CountDistinctSpec(countDistinct.countNulls()); + out = of(countDistinct); } @Override public void visit(KeyDistinct distinct) { - out = new DistinctSpec(distinct.includeNulls()); + out = of(distinct); } @Override public void visit(KeyGroup group) { - out = new AggregationGroupSpec(); + out = of(group); } @Override public void visit(KeyAvg avg) { - out = new AvgSpec(); + out = of(avg); } @Override public void visit(KeyFirst first) { - out = new FirstBySpecImpl(); + out = of(first); } @Override public void visit(KeyLast last) { - out = new LastBySpecImpl(); + out = of(last); } @Override public void visit(KeyMax max) { - out = new MinMaxBySpecImpl(false); + out = of(max); } @Override public void visit(KeyMedian median) { - out = new PercentileBySpecImpl(0.50d, median.averageMedian()); + out = of(median); } @Override public void visit(KeyMin min) { - out = new MinMaxBySpecImpl(true); + out = of(min); } @Override public void visit(KeyPct pct) { - out = new PercentileBySpecImpl(pct.percentile(), pct.averageMedian()); + out = of(pct); } @Override public void visit(KeySortedFirst sortedFirst) { - out = new SortedFirstBy( - sortedFirst.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); + out = of(sortedFirst); } @Override public void visit(KeySortedLast sortedLast) { - out = new SortedLastBy( - sortedLast.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); + out = of(sortedLast); } @Override public void visit(KeyStd std) { - out = new StdSpec(); + out = of(std); } @Override public void visit(KeySum sum) { - out = new SumSpec(); + out = of(sum); } @Override public void visit(KeyUnique unique) { - out = new UniqueSpec(unique.includeNulls()); + out = of(unique); } @Override public void visit(KeyWAvg wAvg) { - out = new WeightedAverageSpecImpl(wAvg.weight().name()); + out = of(wAvg); } @Override public void visit(KeyWSum wSum) { - out = new WeightedSumSpecImpl(wSum.weight().name()); + out = of(wSum); } @Override public void visit(KeyVar var) { - out = new VarSpec(); + out = of(var); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java b/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java index e7e11352432..a9127c8aa56 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java +++ b/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java @@ -40,7 +40,7 @@ public List build() { out.add(Count.of((ColumnName) pair)); } } else if (e.getValue().size() == 1) { - throw new UnsupportedOperationException("TODO"); + out.add(KeyedAggregation.of((Key) e.getKey(), e.getValue().get(0))); } else { out.add(KeyedAggregations.builder().key((Key) e.getKey()).addAllPairs(e.getValue()).build()); } From cfdc68630a7826eeebed13fce51092f45ee4c23b Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 09:54:55 -0800 Subject: [PATCH 05/20] spotless --- .../main/java/io/deephaven/engine/table/impl/QueryTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index a4859a701f6..30eedceec01 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -3501,7 +3501,7 @@ public void visit(KeyStd std) { @Override public void visit(KeySum sum) { - out = visitGeneric(sum, true); + out = visitGeneric(sum, true); } @Override From 3f3834418bc22c5334009e4a6d67017d7ee010f6 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 10:42:07 -0800 Subject: [PATCH 06/20] Fix KeyAbsSum to AggregationSpec --- .../engine/table/impl/by/AggregationSpecAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java index 049fd9137ff..1da717c1c0b 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java @@ -32,8 +32,8 @@ public static AggregationSpec of(Key key) { return key.walk(new AggregationSpecAdapter()).out(); } - public static AggregationSpec of(KeyAbsSum key) { - return key.walk(new AggregationSpecAdapter()).out(); + public static AggregationSpec of(@SuppressWarnings("unused") KeyAbsSum key) { + return new AbsSumSpec(); } public static AggregationSpec of(KeyCountDistinct countDistinct) { From 57cf99f0f947bd875e244d7222a75bcf6cfeea90 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 12:24:41 -0800 Subject: [PATCH 07/20] latest --- .../engine/table/impl/HierarchicalTable.java | 15 -- .../engine/table/impl/QueryTable.java | 174 ++---------------- .../engine/table/impl/TableWithDefaults.java | 12 ++ .../impl/by/AggregationElementAdapter.java | 14 +- .../table/impl/by/AggregationFactory.java | 24 ++- .../table/impl/by/AggregationSpecAdapter.java | 130 ++++--------- .../java/io/deephaven/api/agg/key/Key.java | 6 +- .../io/deephaven/api/agg/key/KeyBase.java | 11 +- 8 files changed, 92 insertions(+), 294 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java index 9bc038ea499..ffb8ed93fa0 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java @@ -169,21 +169,6 @@ public Table firstBy(Selectable... groupByColumns) { return throwUnsupported("firstBy()"); } - @Override - public Table minBy(Selectable... groupByColumns) { - return throwUnsupported("minBy()"); - } - - @Override - public Table maxBy(Selectable... groupByColumns) { - return throwUnsupported("maxBy()"); - } - - @Override - public Table medianBy(Selectable... groupByColumns) { - return throwUnsupported("medianBy()"); - } - @Override public Table countBy(String countColumnName, Selectable... groupByColumns) { return throwUnsupported("countBy()"); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 30eedceec01..b48bd26b5e6 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -11,25 +11,6 @@ import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.AggregationOutputs; import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; import io.deephaven.api.filter.Filter; import io.deephaven.base.StringUtils; import io.deephaven.base.verify.Assert; @@ -457,7 +438,7 @@ public LocalTableMap partitionBy(final boolean dropKeys, final String... keyColu public Table rollup(Collection aggregations, boolean includeConstituents, Selectable... groupByColumns) { final List converted = - AggregationFactory.AggregationElement.convert(aggregations); + AggregationFactory.AggregationElement.convert(aggregations, this); return rollup(new AggregationFactory(converted), includeConstituents, SelectColumn.from(groupByColumns)); } @@ -607,14 +588,24 @@ public Table exactJoin(Table table, MatchPair[] columnsToMatch, MatchPair[] colu @Override public Table aggAllBy(Key key, Selectable... groupByColumns) { - return key.walk(new SingleAggVisitor(groupByColumns)).out(); + final Set groupColumns = new HashSet<>(groupByColumns.length); + for (Selectable groupByColumn : groupByColumns) { + groupColumns.add(groupByColumn.newColumn().name()); + } + final List remainingColumns = new ArrayList<>(columns.size() - groupByColumns.length); + for (String columnName : columns.keySet()) { + if (!groupColumns.contains(columnName)) { + remainingColumns.add(ColumnName.of(columnName)); + } + } + return aggBy(key.aggregation(remainingColumns), List.of(groupByColumns)); } @Override public Table aggBy(final Collection aggregations, final Collection groupByColumns) { final List optimized = - AggregationFactory.AggregationElement.optimizeAndConvert(aggregations); + AggregationFactory.AggregationElement.optimizeAndConvert(aggregations, this); final List optimizedOrder = optimized.stream() .map(AggregationFactory.AggregationElement::getResultPairs) @@ -663,30 +654,6 @@ public Table firstBy(Selectable... groupByColumns) { }); } - @Override - public Table minBy(Selectable... groupByColumns) { - return QueryPerformanceRecorder.withNugget("minBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), () -> { - if (isRefreshing()) { - return by(new MinMaxBySpecImpl(true), SelectColumn.from(groupByColumns)); - } else { - return by(new AddOnlyMinMaxBySpecImpl(true), SelectColumn.from(groupByColumns)); - } - }); - } - - @Override - public Table maxBy(Selectable... groupByColumns) { - return QueryPerformanceRecorder.withNugget("maxBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), () -> { - if (isRefreshing()) { - return by(new MinMaxBySpecImpl(false), SelectColumn.from(groupByColumns)); - } else { - return by(new AddOnlyMinMaxBySpecImpl(false), SelectColumn.from(groupByColumns)); - } - }); - } - @Override public Table countBy(String countColumnName, Selectable... groupByColumns) { return QueryPerformanceRecorder.withNugget( @@ -3409,119 +3376,4 @@ public R apply(Function function) { public Table wouldMatch(WouldMatchPair... matchers) { return getResult(new WouldMatchOperation(this, matchers)); } - - private class SingleAggVisitor implements Key.Visitor { - private final Selectable[] groupByColumns; - private Table out; - - public SingleAggVisitor(Selectable[] groupByColumns) { - this.groupByColumns = Objects.requireNonNull(groupByColumns); - } - - public Table out() { - return Objects.requireNonNull(out); - } - - private Table visitGeneric(Key key, boolean dropFormatColumns) { - final QueryTable tableToUse = dropFormatColumns ? (QueryTable) dropColumnFormats() : QueryTable.this; - return QueryPerformanceRecorder.withNugget("aggAllBy(" + key + "," + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> tableToUse.by(AggregationSpecAdapter.of(key), SelectColumn.from(groupByColumns))); - } - - @Override - public void visit(KeyAbsSum absSum) { - out = visitGeneric(absSum, true); - } - - @Override - public void visit(KeyCountDistinct countDistinct) { - out = visitGeneric(countDistinct, true); - } - - @Override - public void visit(KeyDistinct distinct) { - out = visitGeneric(distinct, true); - } - - @Override - public void visit(KeyGroup group) { - out = visitGeneric(group, true); - } - - @Override - public void visit(KeyAvg avg) { - out = visitGeneric(avg, true); - } - - @Override - public void visit(KeyFirst first) { - out = firstBy(groupByColumns); - } - - @Override - public void visit(KeyLast last) { - out = lastBy(groupByColumns); - } - - @Override - public void visit(KeyMax max) { - out = maxBy(groupByColumns); - } - - @Override - public void visit(KeyMedian median) { - out = visitGeneric(median, median.averageMedian()); - } - - @Override - public void visit(KeyMin min) { - out = minBy(groupByColumns); - } - - @Override - public void visit(KeyPct pct) { - out = visitGeneric(pct, pct.averageMedian()); - } - - @Override - public void visit(KeySortedFirst sortedFirst) { - out = visitGeneric(sortedFirst, true); - } - - @Override - public void visit(KeySortedLast sortedLast) { - out = visitGeneric(sortedLast, true); - } - - @Override - public void visit(KeyStd std) { - out = visitGeneric(std, true); - } - - @Override - public void visit(KeySum sum) { - out = visitGeneric(sum, true); - } - - @Override - public void visit(KeyUnique unique) { - out = visitGeneric(unique, false); - } - - @Override - public void visit(KeyWAvg wAvg) { - out = visitGeneric(wAvg, true); - } - - @Override - public void visit(KeyWSum wSum) { - out = visitGeneric(wSum, true); - } - - @Override - public void visit(KeyVar var) { - out = visitGeneric(var, true); - } - } } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java index eb3e87235bd..7c5d7638de8 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java @@ -989,6 +989,12 @@ default Table firstBy() { return firstBy(ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table minBy(Selectable... groupByColumns) { + return aggAllBy(KeyMin.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table minBy(String... groupByColumns) { @@ -1007,6 +1013,12 @@ default Table minBy() { return minBy(ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table maxBy(Selectable... groupByColumns) { + return aggAllBy(KeyMax.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table maxBy(String... groupByColumns) { diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java index 3ee1741c2db..393d61d0eb0 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java @@ -5,6 +5,7 @@ import io.deephaven.api.agg.KeyedAggregation; import io.deephaven.api.agg.KeyedAggregations; import io.deephaven.engine.table.MatchPair; +import io.deephaven.engine.table.impl.BaseTable; import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement; import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElementImpl; @@ -15,12 +16,17 @@ */ class AggregationElementAdapter implements Aggregation.Visitor { - public static AggregationElement of(Aggregation aggregation) { - return aggregation.walk(new AggregationElementAdapter()).out(); + public static AggregationElement of(Aggregation aggregation, BaseTable parent) { + return aggregation.walk(new AggregationElementAdapter(parent)).out(); } + private final BaseTable parent; private AggregationElement out; + public AggregationElementAdapter(BaseTable parent) { + this.parent = Objects.requireNonNull(parent); + } + public AggregationElement out() { return Objects.requireNonNull(out); } @@ -32,14 +38,14 @@ public void visit(Count count) { @Override public void visit(KeyedAggregation keyedAgg) { - final AggregationSpec spec = AggregationSpecAdapter.of(keyedAgg.key()); + final AggregationSpec spec = AggregationSpecAdapter.of(keyedAgg.key(), parent); final MatchPair pair = MatchPair.of(keyedAgg.pair()); out = new AggregationElementImpl(spec, pair); } @Override public void visit(KeyedAggregations keyedAggs) { - final AggregationSpec spec = AggregationSpecAdapter.of(keyedAggs.key()); + final AggregationSpec spec = AggregationSpecAdapter.of(keyedAggs.key(), parent); final MatchPair[] pairs = MatchPair.fromPairs(keyedAggs.pairs()); out = new AggregationElementImpl(spec, pairs); } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java index 28fe6d76787..2f7e18da5dc 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java @@ -620,10 +620,11 @@ public interface AggregationElement { * Converts an {@link Aggregation} to an {@link AggregationElement}. * * @param aggregation The {@link Aggregation aggregation} + * @param parent The parent table * @return The {@link AggregationElement aggregation element} */ - static AggregationElement of(Aggregation aggregation) { - return AggregationElementAdapter.of(aggregation); + static AggregationElement of(Aggregation aggregation, BaseTable parent) { + return AggregationElementAdapter.of(aggregation, parent); } /** @@ -635,13 +636,15 @@ static AggregationElement of(Aggregation aggregation) { * {@code aggregations}. * * @param aggregations The {@link Aggregation aggregation} + * @param parent The parent table * @return A list of {@link AggregationElement aggregation elements} * @see AggregationOptimizer#of(Collection) - * @see #of(Aggregation) - * @see #convert(Collection) + * @see #of(Aggregation, BaseTable) + * @see #convert(Collection, BaseTable) */ - static List optimizeAndConvert(Collection aggregations) { - return convert(AggregationOptimizer.of(aggregations)); + static List optimizeAndConvert(Collection aggregations, + BaseTable parent) { + return convert(AggregationOptimizer.of(aggregations), parent); } /** @@ -652,14 +655,15 @@ static List optimizeAndConvert(Collection convert(Collection aggregations) { + static List convert(Collection aggregations, BaseTable parent) { final List out = new ArrayList<>(aggregations.size()); for (Aggregation aggregation : aggregations) { - out.add(AggregationElementAdapter.of(aggregation)); + out.add(AggregationElementAdapter.of(aggregation, parent)); } return out; } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java index 1da717c1c0b..2d1da9eab9d 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java @@ -22,192 +22,124 @@ import io.deephaven.api.agg.key.KeyVar; import io.deephaven.api.agg.key.KeyWAvg; import io.deephaven.api.agg.key.KeyWSum; -import org.jetbrains.annotations.NotNull; +import io.deephaven.engine.table.impl.BaseTable; import java.util.Objects; -public class AggregationSpecAdapter implements Key.Visitor { - - public static AggregationSpec of(Key key) { - return key.walk(new AggregationSpecAdapter()).out(); - } - - public static AggregationSpec of(@SuppressWarnings("unused") KeyAbsSum key) { - return new AbsSumSpec(); - } - - public static AggregationSpec of(KeyCountDistinct countDistinct) { - return new CountDistinctSpec(countDistinct.countNulls()); - } - - public static AggregationSpec of(KeyDistinct distinct) { - return new DistinctSpec(distinct.includeNulls()); - } - - public static AggregationSpec of(@SuppressWarnings("unused") KeyGroup group) { - return new AggregationGroupSpec(); - } +import static io.deephaven.engine.table.impl.QueryTable.TRACKED_FIRST_BY; +import static io.deephaven.engine.table.impl.QueryTable.TRACKED_LAST_BY; - public static AggregationSpec of(@SuppressWarnings("unused") KeyAvg avg) { - return new AvgSpec(); - } - - public static AggregationSpec of(@SuppressWarnings("unused") KeyFirst first) { - return new FirstBySpecImpl(); - } - - public static AggregationSpec of(@SuppressWarnings("unused") KeyLast last) { - return new LastBySpecImpl(); - } - - public static AggregationSpec of(@SuppressWarnings("unused") KeyMax max) { - return new MinMaxBySpecImpl(false); - } - - public static AggregationSpec of(KeyMedian median) { - return new PercentileBySpecImpl(0.50d, median.averageMedian()); - } - - public static AggregationSpec of(@SuppressWarnings("unused") KeyMin min) { - return new MinMaxBySpecImpl(true); - } - - public static AggregationSpec of(@SuppressWarnings("unused") KeyPct pct) { - return new PercentileBySpecImpl(pct.percentile(), pct.averageMedian()); - } - - public static AggregationSpec of(KeySortedFirst sortedFirst) { - return new SortedFirstBy( - sortedFirst.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); - } - - public static AggregationSpec of(KeySortedLast sortedLast) { - return new SortedLastBy( - sortedLast.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); - } - - public static AggregationSpec of(@SuppressWarnings("unused") KeyStd std) { - return new StdSpec(); - } - - public static AggregationSpec of(@SuppressWarnings("unused") KeySum sum) { - return new SumSpec(); - } - - public static AggregationSpec of(KeyUnique unique) { - return new UniqueSpec(unique.includeNulls()); - } +public class AggregationSpecAdapter implements Key.Visitor { - public static AggregationSpec of(KeyWAvg wAvg) { - return new WeightedAverageSpecImpl(wAvg.weight().name()); + public static AggregationSpec of(Key key, BaseTable parent) { + return key.walk(new AggregationSpecAdapter(parent)).out(); } - public static AggregationSpec of(KeyWSum wSum) { - return new WeightedSumSpecImpl(wSum.weight().name()); - } + private BaseTable parent; + private AggregationSpec out; - public static AggregationSpec of(@SuppressWarnings("unused") KeyVar var) { - return new VarSpec(); + public AggregationSpecAdapter(BaseTable parent) { + this.parent = Objects.requireNonNull(parent); } - private AggregationSpec out; - public AggregationSpec out() { return Objects.requireNonNull(out); } @Override public void visit(KeyAbsSum absSum) { - out = of(absSum); + out = new AbsSumSpec(); } @Override public void visit(KeyCountDistinct countDistinct) { - out = of(countDistinct); + out = new CountDistinctSpec(countDistinct.countNulls()); } @Override public void visit(KeyDistinct distinct) { - out = of(distinct); + out = new DistinctSpec(distinct.includeNulls()); } @Override public void visit(KeyGroup group) { - out = of(group); + out = new AggregationGroupSpec(); } @Override public void visit(KeyAvg avg) { - out = of(avg); + out = new AvgSpec(); } @Override public void visit(KeyFirst first) { - out = of(first); + out = TRACKED_FIRST_BY ? new TrackingFirstBySpecImpl() : new FirstBySpecImpl(); } @Override public void visit(KeyLast last) { - out = of(last); + out = TRACKED_LAST_BY ? new TrackingLastBySpecImpl() : new LastBySpecImpl(); } @Override public void visit(KeyMax max) { - out = of(max); + out = new MinMaxBySpecImpl(false, parent.isAddOnly()); } @Override public void visit(KeyMedian median) { - out = of(median); + out = new PercentileBySpecImpl(0.50d, median.averageMedian()); } @Override public void visit(KeyMin min) { - out = of(min); + out = new MinMaxBySpecImpl(true, parent.isAddOnly()); } @Override public void visit(KeyPct pct) { - out = of(pct); + out = new PercentileBySpecImpl(pct.percentile(), pct.averageMedian()); } @Override public void visit(KeySortedFirst sortedFirst) { - out = of(sortedFirst); + out = new SortedFirstBy( + sortedFirst.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); } @Override public void visit(KeySortedLast sortedLast) { - out = of(sortedLast); + out = new SortedLastBy( + sortedLast.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); } @Override public void visit(KeyStd std) { - out = of(std); + out = new StdSpec(); } @Override public void visit(KeySum sum) { - out = of(sum); + out = new SumSpec(); } @Override public void visit(KeyUnique unique) { - out = of(unique); + out = new UniqueSpec(unique.includeNulls()); } @Override public void visit(KeyWAvg wAvg) { - out = of(wAvg); + out = new WeightedAverageSpecImpl(wAvg.weight().name()); } @Override public void visit(KeyWSum wSum) { - out = of(wSum); + out = new WeightedSumSpecImpl(wSum.weight().name()); } @Override public void visit(KeyVar var) { - out = of(var); + out = new VarSpec(); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/Key.java b/table-api/src/main/java/io/deephaven/api/agg/key/Key.java index 557bdf2ccb4..70d4be19884 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/Key.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/Key.java @@ -1,7 +1,7 @@ package io.deephaven.api.agg.key; +import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.KeyedAggregation; -import io.deephaven.api.agg.KeyedAggregations; import io.deephaven.api.agg.Pair; import java.util.Collection; @@ -13,9 +13,9 @@ public interface Key { KeyedAggregation aggregation(Pair pair); - KeyedAggregations aggregation(Pair... pairs); + Aggregation aggregation(Pair... pairs); - KeyedAggregations aggregation(Collection pairs); + Aggregation aggregation(Collection pairs); V walk(V visitor); diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java index f92e1a4e666..d179b0be043 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java @@ -1,5 +1,6 @@ package io.deephaven.api.agg.key; +import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.KeyedAggregation; import io.deephaven.api.agg.KeyedAggregations; import io.deephaven.api.agg.Pair; @@ -14,12 +15,18 @@ public final KeyedAggregation aggregation(Pair pair) { } @Override - public final KeyedAggregations aggregation(Pair... pairs) { + public final Aggregation aggregation(Pair... pairs) { + if (pairs.length == 1) { + return aggregation(pairs[0]); + } return KeyedAggregations.builder().key(this).addPairs(pairs).build(); } @Override - public final KeyedAggregations aggregation(Collection pairs) { + public final Aggregation aggregation(Collection pairs) { + if (pairs.size() == 1) { + return aggregation(pairs.iterator().next()); + } return KeyedAggregations.builder().key(this).addAllPairs(pairs).build(); } } From 3e7e433a4dd50fcec01b31435d7c039094bb1754 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 12:28:02 -0800 Subject: [PATCH 08/20] latest --- .../engine/table/impl/TableWithDefaults.java | 9 ------ .../table/impl/by/AggregationFactory.java | 32 ++++--------------- 2 files changed, 6 insertions(+), 35 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java index 7c5d7638de8..4ab2fcc7dac 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java @@ -7,23 +7,14 @@ import io.deephaven.api.*; import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.Key.Visitor; import io.deephaven.api.agg.key.KeyAbsSum; import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; import io.deephaven.api.agg.key.KeyMax; import io.deephaven.api.agg.key.KeyMedian; import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; import io.deephaven.api.agg.key.KeyStd; import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; import io.deephaven.api.agg.key.KeyVar; import io.deephaven.api.agg.key.KeyWAvg; import io.deephaven.api.agg.key.KeyWSum; diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java index 2f7e18da5dc..0641a000137 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java @@ -6,23 +6,13 @@ import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.AggregationOptimizer; -import io.deephaven.api.agg.KeyedAggregations; import io.deephaven.base.verify.Assert; -import io.deephaven.chunk.ChunkType; -import io.deephaven.chunk.attributes.Values; import io.deephaven.datastructures.util.CollectionUtil; import io.deephaven.datastructures.util.SmartKey; -import io.deephaven.engine.table.ChunkSource; -import io.deephaven.engine.table.ColumnDefinition; -import io.deephaven.engine.table.ColumnSource; -import io.deephaven.engine.table.MatchPair; -import io.deephaven.engine.table.Table; -import io.deephaven.engine.table.impl.BaseTable; -import io.deephaven.engine.table.impl.EmptyTableMap; -import io.deephaven.engine.table.impl.QueryTable; -import io.deephaven.engine.table.impl.ReverseLookup; -import io.deephaven.engine.table.impl.RollupAttributeCopier; -import io.deephaven.engine.table.impl.RollupInfo; +import io.deephaven.chunk.attributes.Values; +import io.deephaven.chunk.ChunkType; +import io.deephaven.engine.table.*; +import io.deephaven.engine.table.impl.*; import io.deephaven.engine.table.impl.by.ssmminmax.SsmChunkedMinMaxOperator; import io.deephaven.engine.table.impl.select.MatchPairFactory; import io.deephaven.engine.table.impl.sources.ReinterpretUtils; @@ -34,20 +24,11 @@ import java.math.BigDecimal; import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.OptionalInt; +import java.util.*; import java.util.function.ToIntFunction; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; - /** * The AggregationFactory combines one or more aggregations into an {@link AggregationSpec} for use internally by the * implementation of {@link Table#aggBy}. @@ -648,8 +629,7 @@ static List optimizeAndConvert(Collection * Note: The results will preserve the intended order of the inputs. From 88e647aaa1e5412f4e2cc63d39cea7f1295bde7c Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 12:32:35 -0800 Subject: [PATCH 09/20] regen python docs --- .../doc/io/deephaven/api/TableOperations.json | 1 + .../deephaven/api/TableOperationsAdapter.json | 1 + .../doc/io/deephaven/api/agg/key/Key.json | 2 +- .../doc/io/deephaven/api/agg/key/KeyBase.json | 2 +- .../doc/io/deephaven/engine/table/Table.json | 1 + .../engine/table/impl/HierarchicalTable.json | 11 +-------- .../engine/table/impl/QueryTable.json | 14 ++--------- .../engine/table/impl/TableWithDefaults.json | 23 ++++++++++--------- .../engine/table/impl/UncoalescedTable.json | 1 + .../AggregationElement.json | 6 ++--- .../table/impl/by/AggregationSpecAdapter.json | 10 ++++++++ .../doc/io/deephaven/qst/table/TableBase.json | 1 + 12 files changed, 35 insertions(+), 38 deletions(-) create mode 100644 Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.json diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/TableOperations.json b/Integrations/python/deephaven/doc/io/deephaven/api/TableOperations.json index 00940353bcb..83a8256b98e 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/TableOperations.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/TableOperations.json @@ -1,6 +1,7 @@ { "className": "io.deephaven.api.TableOperations", "methods": { + "aggAllBy": "*Overload 1* \n :param key: io.deephaven.api.agg.key.Key\n :return: TableOperations.TOPS\n \n*Overload 2* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.lang.String...\n :return: TableOperations.TOPS\n \n*Overload 3* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: io.deephaven.api.Selectable...\n :return: TableOperations.TOPS\n \n*Overload 4* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.util.Collection\n :return: TableOperations.TOPS", "aggBy": "*Overload 1* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :return: TableOperations.TOPS\n \n*Overload 2* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.lang.String...\n :return: TableOperations.TOPS\n \n*Overload 3* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.util.Collection\n :return: TableOperations.TOPS\n \n*Overload 4* \n :param aggregations: java.util.Collection\n :return: TableOperations.TOPS\n \n*Overload 5* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.lang.String...\n :return: TableOperations.TOPS\n \n*Overload 6* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.util.Collection\n :return: TableOperations.TOPS", "aj": "**Incompatible overloads text - text from the first overload:**\n\nPerform an as-of join with the rightTable.\n\n \n Delegates to aj(Object, Collection, Collection, AsOfJoinRule).\n\n*Overload 1* \n :param rightTable: (TableOperations.TABLE) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :return: (TableOperations.TOPS) a new table joined according to the specification in columnsToMatch\n \n*Overload 2* \n :param rightTable: (TableOperations.TABLE) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n :return: (TableOperations.TOPS) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 3* \n :param rightTable: (TableOperations.TABLE) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (TableOperations.TOPS) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 4* \n :param rightTable: (TableOperations.TABLE) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :param asOfJoinRule: (io.deephaven.api.AsOfJoinRule) - The binary search operator for the last match pair.\n :return: (TableOperations.TOPS) a new table joined according to the specification in columnsToMatch and columnsToAdd", "exactJoin": "**Incompatible overloads text - text from the first overload:**\n\nPerform an exact-join with the rightTable.\n\n \n Delegates to exactJoin(Object, Collection, Collection).\n\n*Overload 1* \n :param rightTable: (TableOperations.TABLE) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :return: (TableOperations.TOPS) the exact-joined table\n \n*Overload 2* \n :param rightTable: (TableOperations.TABLE) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the right side that need to be added to the left\n side as a result of the match.\n :return: (TableOperations.TOPS) the exact-joined table\n \n*Overload 3* \n :param rightTable: (TableOperations.TABLE) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (TableOperations.TOPS) the exact-joined table", diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/TableOperationsAdapter.json b/Integrations/python/deephaven/doc/io/deephaven/api/TableOperationsAdapter.json index fa83ed2b283..665c2029e00 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/TableOperationsAdapter.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/TableOperationsAdapter.json @@ -1,6 +1,7 @@ { "className": "io.deephaven.api.TableOperationsAdapter", "methods": { + "aggAllBy": "*Overload 1* \n :param key: io.deephaven.api.agg.key.Key\n :return: TableOperationsAdapter.TOPS_1\n \n*Overload 2* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.lang.String...\n :return: TableOperationsAdapter.TOPS_1\n \n*Overload 3* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: io.deephaven.api.Selectable...\n :return: TableOperationsAdapter.TOPS_1\n \n*Overload 4* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.util.Collection\n :return: TableOperationsAdapter.TOPS_1", "aggBy": "*Overload 1* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :return: TableOperationsAdapter.TOPS_1\n \n*Overload 2* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.lang.String...\n :return: TableOperationsAdapter.TOPS_1\n \n*Overload 3* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.util.Collection\n :return: TableOperationsAdapter.TOPS_1\n \n*Overload 4* \n :param aggregations: java.util.Collection\n :return: TableOperationsAdapter.TOPS_1\n \n*Overload 5* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.lang.String...\n :return: TableOperationsAdapter.TOPS_1\n \n*Overload 6* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.util.Collection\n :return: TableOperationsAdapter.TOPS_1", "aj": "**Incompatible overloads text - text from the first overload:**\n\nPerform an as-of join with the rightTable.\n\n \n Delegates to TableOperations.aj(Object, Collection, Collection, AsOfJoinRule).\n\n*Overload 1* \n :param rightTable: (TableOperationsAdapter.TABLE_1) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :return: (TableOperationsAdapter.TOPS_1) a new table joined according to the specification in columnsToMatch\n \n*Overload 2* \n :param rightTable: (TableOperationsAdapter.TABLE_1) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n :return: (TableOperationsAdapter.TOPS_1) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 3* \n :param rightTable: (TableOperationsAdapter.TABLE_1) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (TableOperationsAdapter.TOPS_1) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 4* \n :param rightTable: (TableOperationsAdapter.TABLE_1) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :param asOfJoinRule: (io.deephaven.api.AsOfJoinRule) - The binary search operator for the last match pair.\n :return: (TableOperationsAdapter.TOPS_1) a new table joined according to the specification in columnsToMatch and columnsToAdd", "delegate": ":return: TableOperationsAdapter.TOPS_2", diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key.json index 667e040f961..9e89f98251c 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/Key.json @@ -1,7 +1,7 @@ { "className": "io.deephaven.api.agg.key.Key", "methods": { - "aggregation": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 2* \n :param pairs: io.deephaven.api.agg.Pair...\n :return: io.deephaven.api.agg.KeyedAggregations\n \n*Overload 3* \n :param pairs: java.util.Collection\n :return: io.deephaven.api.agg.KeyedAggregations", + "aggregation": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 2* \n :param pairs: io.deephaven.api.agg.Pair...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param pairs: java.util.Collection\n :return: io.deephaven.api.agg.Aggregation", "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" }, "path": "io.deephaven.api.agg.key.Key", diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyBase.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyBase.json index bd88c841043..db2e7f2423d 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyBase.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/key/KeyBase.json @@ -1,7 +1,7 @@ { "className": "io.deephaven.api.agg.key.KeyBase", "methods": { - "aggregation": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 2* \n :param pairs: io.deephaven.api.agg.Pair...\n :return: io.deephaven.api.agg.KeyedAggregations\n \n*Overload 3* \n :param pairs: java.util.Collection\n :return: io.deephaven.api.agg.KeyedAggregations" + "aggregation": "*Overload 1* \n :param pair: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.KeyedAggregation\n \n*Overload 2* \n :param pairs: io.deephaven.api.agg.Pair...\n :return: io.deephaven.api.agg.Aggregation\n \n*Overload 3* \n :param pairs: java.util.Collection\n :return: io.deephaven.api.agg.Aggregation" }, "path": "io.deephaven.api.agg.key.KeyBase", "typeName": "class" diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/Table.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/Table.json index bbfd8d047c9..8ded08f7596 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/engine/table/Table.json +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/Table.json @@ -2,6 +2,7 @@ "className": "io.deephaven.engine.table.Table", "methods": { "absSumBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the sum of the absolute values for\n the rest of the fields\n\n*Overload 1* \n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :return: io.deephaven.engine.table.Table", + "aggAllBy": "*Overload 1* \n :param key: io.deephaven.api.agg.key.Key\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: io.deephaven.api.Selectable...\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.engine.table.Table", "aggBy": "*Overload 1* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.engine.table.Table\n \n*Overload 5* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 6* \n :param aggregations: java.util.Collection\n :return: io.deephaven.engine.table.Table", "aj": "**Incompatible overloads text - text from the first overload:**\n\nLooks up the columns in the rightTable that meet the match conditions in the columnsToMatch list. Matching is\n done exactly for the first n-1 columns and via a binary search for the last match pair. The columns of the\n original table are returned intact, together with all the columns from rightTable.\n\n*Overload 1* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (io.deephaven.engine.table.MatchPair[]) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :param columnsToAdd: (io.deephaven.engine.table.MatchPair[]) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n :param asOfMatchRule: io.deephaven.engine.table.Table.AsOfMatchRule\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 2* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (io.deephaven.engine.table.MatchPair[]) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :param columnsToAdd: (io.deephaven.engine.table.MatchPair[]) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 3* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 4* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :param asOfJoinRule: (io.deephaven.api.AsOfJoinRule) - The binary search operator for the last match pair.\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 5* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 6* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 7* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch", "apply": "Applies a function to this table.\n \n This is useful if you have a reference to a table or a proxy and want to run a series of operations against the\n table without each individual operation resulting in an RMI.\n\nNote: Java generics information - \n\n:param function: (java.util.function.Function) - the function to run, its single argument will be this table\n:return: (R) the return value of function", diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/HierarchicalTable.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/HierarchicalTable.json index 2496882df3a..c7b178bf501 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/HierarchicalTable.json +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/HierarchicalTable.json @@ -1,11 +1,10 @@ { "className": "io.deephaven.engine.table.impl.HierarchicalTable", "methods": { - "absSumBy": "Groups the data column according to groupByColumns and computes the sum of the absolute values for\n the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", + "aggAllBy": ":param key: io.deephaven.api.agg.key.Key\n:param groupByColumns: io.deephaven.api.Selectable...\n:return: io.deephaven.engine.table.Table", "aggBy": ":param aggregations: java.util.Collection\n:param groupByColumns: java.util.Collection\n:return: io.deephaven.engine.table.Table", "aj": "Looks up the columns in the rightTable that meet the match conditions in the columnsToMatch list. Matching is\n done exactly for the first n-1 columns and via a binary search for the last match pair. The columns of the\n original table are returned intact, together with the columns from rightTable defined in a comma separated list\n \"columnsToAdd\"\n\n:param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n:param columnsToMatch: (io.deephaven.engine.table.MatchPair[]) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n:param columnsToAdd: (io.deephaven.engine.table.MatchPair[]) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n:param asOfMatchRule: io.deephaven.engine.table.Table.AsOfMatchRule\n:return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd", "applyToAllBy": "Groups data according to groupByColumns and applies formulaColumn to each of columns not altered by the grouping\n operation. columnParamName is used as place-holder for the name of each column inside\n formulaColumn.\n\n:param formulaColumn: (java.lang.String) - Formula applied to each column\n:param columnParamName: (java.lang.String) - The parameter name used as a placeholder for each column\n:param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(Collection)\n:return: io.deephaven.engine.table.Table", - "avgBy": "Groups the data column according to groupByColumns and computes the average for the rest of the\n fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "copy": ":param copyAttributes: boolean\n:return: io.deephaven.engine.table.Table", "countBy": ":param countColumnName: java.lang.String\n:param groupByColumns: io.deephaven.api.Selectable...\n:return: io.deephaven.engine.table.Table", "dropColumns": ":param columnNames: java.lang.String...\n:return: io.deephaven.engine.table.Table", @@ -17,7 +16,6 @@ "getRawRootTable": "Get the table that is the root of the hierarchy\n\n:return: (io.deephaven.engine.table.Table) the root of the hierarchy", "getSourceTable": "Get the table on which this hierarchical table was created from.\n\n:return: (io.deephaven.engine.table.Table) the source table", "getSubTable": "Get a Table that contains a sub-set of the rows from this.\n\n:param rowSet: (io.deephaven.engine.rowset.TrackingRowSet) - The row set for the result.\n:return: (io.deephaven.engine.table.impl.QueryTable) A new sub-table", - "groupBy": ":param groupByColumns: java.util.Collection\n:return: io.deephaven.engine.table.Table", "head": ":param size: long\n:return: io.deephaven.engine.table.Table", "headBy": ":param nRows: long\n:param groupByColumns: java.lang.String...\n:return: io.deephaven.engine.table.Table", "headPct": "Provides a head that selects a dynamic number of rows based on a percent.\n\n:param percent: (double) - the fraction of the table to return (0..1), the number of rows will be rounded up. For example if\n there are 3 rows, headPct(50) returns the first two rows.\n:return: io.deephaven.engine.table.Table", @@ -25,9 +23,6 @@ "lastBy": "Groups the data column according to groupByColumns and retrieves the last for the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "lazyUpdate": "Compute column formulas on demand.\n\n \n Lazy update defers computation until required for a set of values, and caches the results for a set of input\n values. This uses less RAM than an update statement when you have a smaller set of unique values. Less\n computation than an updateView is needed, because the results are saved in a cache.\n \n\n If you have many unique values, you should instead use an update statement, which will have more memory efficient\n structures. Values are never removed from the lazyUpdate cache, so it should be used judiciously on a ticking\n table.\n \n\n:param columns: (java.util.Collection) - the columns to add\n:return: (io.deephaven.engine.table.Table) a new Table with the columns added; to be computed on demand", "leftJoin": "Returns a table that has one column for each original table's columns, and one column corresponding to each of\n the input table (right table) columns listed in the columns to add (or all the columns whose names don't overlap\n with the name of a column from the source table if the columnsToAdd is length zero). The new columns (those\n corresponding to the input table) contain an aggregation of all values from the left side that match the join\n criteria. Consequently, the types of all right side columns not involved in a join criteria, is an array of the\n original column type. If the two tables have columns with matching names then the method will fail with an\n exception unless the columns with corresponding names are found in one of the matching criteria.\n \n\n NOTE: leftJoin operation does not involve an actual data copy, or an in-memory table creation. In order to\n produce an actual in memory table you need to apply a select call on the join result.\n\n:param table: (io.deephaven.engine.table.Table) - input table\n:param columnsToMatch: (io.deephaven.engine.table.MatchPair[]) - match criteria\n:param columnsToAdd: (io.deephaven.engine.table.MatchPair[]) - columns to add\n:return: (io.deephaven.engine.table.Table) a table that has one column for each original table's columns, and one column corresponding to each\n column listed in columnsToAdd. If columnsToAdd.length==0 one column corresponding to each column of the\n input table (right table) columns whose names don't overlap with the name of a column from the source\n table is added. The new columns (those corresponding to the input table) contain an aggregation of all\n values from the left side that match the join criteria.", - "maxBy": "Groups the data column according to groupByColumns and computes the max for the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n:return: io.deephaven.engine.table.Table", - "medianBy": "Groups the data column according to groupByColumns and computes the median for the rest of the\n fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n:return: io.deephaven.engine.table.Table", - "minBy": "Groups the data column according to groupByColumns and computes the min for the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "naturalJoin": ":param rightTable: io.deephaven.engine.table.Table\n:param columnsToMatch: io.deephaven.engine.table.MatchPair[]\n:param columnsToAdd: io.deephaven.engine.table.MatchPair[]\n:return: io.deephaven.engine.table.Table", "partitionBy": "Create a TableMap from this table, keyed by the specified columns.\n\n \n The returned TableMap contains each row in this table in exactly one of the tables within the map. If you have\n exactly one key column the TableMap is keyed by the value in that column. If you have zero key columns, then the\n TableMap is keyed by io.deephaven.datastructures.util.SmartKey.EMPTY (and will contain this table as the\n value). If you have multiple key columns, then the TableMap is keyed by a\n io.deephaven.datastructures.util.SmartKey. The SmartKey will have one value for each of your column\n values, in the order specified by keyColumnNames.\n \n\n For example if you have a Table keyed by a String column named USym, and a DateTime column named Expiry; a value\n could be retrieved from the TableMap with\n tableMap.get(new SmartKey(\"SPY\";, DateTimeUtils.convertDateTime(\"2020-06-19T16:15:00 NY\"))). For a table\n with an Integer column named Bucket, you simply use the desired value as in tableMap.get(1).\n \n\n:param dropKeys: (boolean) - if true, drop key columns in the output Tables\n:param keyColumnNames: (java.lang.String...) - the name of the key columns to use.\n:return: (io.deephaven.engine.table.impl.LocalTableMap) a TableMap keyed by keyColumnNames", "raj": "Just like .aj(), but the matching on the last column is in reverse order, so that you find the row after the\n given timestamp instead of the row before.\n \n Looks up the columns in the rightTable that meet the match conditions in the columnsToMatch list. Matching is\n done exactly for the first n-1 columns and via a binary search for the last match pair. The columns of the\n original table are returned intact, together with the columns from rightTable defined in a comma separated list\n \"columnsToAdd\"\n\n:param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n:param columnsToMatch: (io.deephaven.engine.table.MatchPair[]) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n:param columnsToAdd: (io.deephaven.engine.table.MatchPair[]) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n:param asOfMatchRule: io.deephaven.engine.table.Table.AsOfMatchRule\n:return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd", @@ -41,8 +36,6 @@ "snapshotHistory": ":param rightTable: io.deephaven.engine.table.Table\n:return: io.deephaven.engine.table.Table", "snapshotIncremental": ":param rightTable: io.deephaven.engine.table.Table\n:param doInitialSnapshot: boolean\n:param stampColumns: java.lang.String...\n:return: io.deephaven.engine.table.Table", "sort": ":param columnsToSortBy: java.util.Collection\n:return: io.deephaven.engine.table.Table", - "stdBy": ":param groupByColumns: io.deephaven.api.Selectable...\n:return: io.deephaven.engine.table.Table", - "sumBy": "Groups the data column according to groupByColumns and computes the sum for the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "tail": ":param size: long\n:return: io.deephaven.engine.table.Table", "tailBy": ":param nRows: long\n:param groupByColumns: java.lang.String...\n:return: io.deephaven.engine.table.Table", "tailPct": ":param percent: double\n:return: io.deephaven.engine.table.Table", @@ -50,9 +43,7 @@ "ungroup": "Ungroups a table by converting arrays into columns.\n\n:param nullFill: (boolean) - indicates if the ungrouped table should allow disparate sized arrays filling shorter columns with\n null values. If set to false, then all arrays should be the same length.\n:param columnsToUngroup: (java.lang.String...) - the columns to ungroup\n:return: (io.deephaven.engine.table.Table) the ungrouped table", "update": ":param columns: java.util.Collection\n:return: io.deephaven.engine.table.Table", "updateView": ":param columns: java.util.Collection\n:return: io.deephaven.engine.table.Table", - "varBy": "Groups the data column according to groupByColumns and computes the variance for the rest of the\n fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "view": ":param columns: java.util.Collection\n:return: io.deephaven.engine.table.Table", - "wavgBy": "Groups the data column according to groupByColumns and computes the weighted average using\n weightColumn for the rest of the fields\n\n:param weightColumn: (java.lang.String) - the column to use for the weight\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "where": ":param filters: java.util.Collection\n:return: io.deephaven.engine.table.Table", "whereIn": "Filters this table based on the set of values in the rightTable.\n\n \n Note that when the rightTable ticks, all of the rows in this table are going to be re-evaluated,\n thus the intention is that the rightTable is fairly slow moving compared with this table.\n\n:param rightTable: (io.deephaven.engine.table.Table) - the filtering table.\n:param columnsToMatch: (java.util.Collection) - the columns to match between the two tables\n:return: (io.deephaven.engine.table.Table) a new table filtered on right table", "whereNotIn": "Filters this table based on the set of values not in the rightTable.\n\n \n Note that when the rightTable ticks, all of the rows in this table are going to be re-evaluated,\n thus the intention is that the rightTable is fairly slow moving compared with this table.\n\n:param rightTable: (io.deephaven.engine.table.Table) - the filtering table.\n:param columnsToMatch: (java.util.Collection) - the columns to match between the two tables\n:return: (io.deephaven.engine.table.Table) a new table filtered on right table" diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/QueryTable.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/QueryTable.json index 7292d3e9111..724006f3e95 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/QueryTable.json +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/QueryTable.json @@ -1,12 +1,11 @@ { "className": "io.deephaven.engine.table.impl.QueryTable", "methods": { - "absSumBy": "Groups the data column according to groupByColumns and computes the sum of the absolute values for\n the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", + "aggAllBy": ":param key: io.deephaven.api.agg.key.Key\n:param groupByColumns: io.deephaven.api.Selectable...\n:return: io.deephaven.engine.table.Table", "aggBy": ":param aggregations: java.util.Collection\n:param groupByColumns: java.util.Collection\n:return: io.deephaven.engine.table.Table", "aj": "Looks up the columns in the rightTable that meet the match conditions in the columnsToMatch list. Matching is\n done exactly for the first n-1 columns and via a binary search for the last match pair. The columns of the\n original table are returned intact, together with the columns from rightTable defined in a comma separated list\n \"columnsToAdd\"\n\n:param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n:param columnsToMatch: (io.deephaven.engine.table.MatchPair[]) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n:param columnsToAdd: (io.deephaven.engine.table.MatchPair[]) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n:param asOfMatchRule: io.deephaven.engine.table.Table.AsOfMatchRule\n:return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd", "apply": "Applies a function to this table.\n \n This is useful if you have a reference to a table or a proxy and want to run a series of operations against the\n table without each individual operation resulting in an RMI.\n\nNote: Java generics information - \n\n:param function: (java.util.function.Function) - the function to run, its single argument will be this table\n:return: (R) the return value of function", "applyToAllBy": "Groups data according to groupByColumns and applies formulaColumn to each of columns not altered by the grouping\n operation. columnParamName is used as place-holder for the name of each column inside\n formulaColumn.\n\n:param formulaColumn: (java.lang.String) - Formula applied to each column\n:param columnParamName: (java.lang.String) - The parameter name used as a placeholder for each column\n:param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(Collection)\n:return: io.deephaven.engine.table.Table", - "avgBy": "Groups the data column according to groupByColumns and computes the average for the rest of the\n fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "by": ":param inputAggregationSpec: io.deephaven.engine.table.impl.by.AggregationSpec\n:param groupByColumns: io.deephaven.engine.table.impl.select.SelectColumn...\n:return: io.deephaven.engine.table.Table", "copy": "Copies this table, but with a new set of attributes.\n\n*Overload 1* \n :return: (io.deephaven.engine.table.Table) an identical table; but with a new set of attributes\n \n*Overload 2* \n :param copyAttributes: boolean\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param definition: io.deephaven.engine.table.TableDefinition\n :param copyAttributes: boolean\n :return: io.deephaven.engine.table.Table", "countBy": ":param countColumnName: java.lang.String\n:param groupByColumns: io.deephaven.api.Selectable...\n:return: io.deephaven.engine.table.Table", @@ -25,7 +24,6 @@ "getResult": ":param operation: io.deephaven.engine.table.impl.QueryTable.Operation\n:return: T", "getRowSet": ":return: (io.deephaven.engine.rowset.TrackingRowSet) The TrackingRowSet that exposes the row keys present in this Table", "getSubTable": "Get a Table that contains a sub-set of the rows from this.\n\n*Overload 1* \n :param rowSet: (io.deephaven.engine.rowset.TrackingRowSet) - The row set for the result.\n :return: (io.deephaven.engine.table.impl.QueryTable) A new sub-table\n \n*Overload 2* \n :param rowSet: io.deephaven.engine.rowset.TrackingRowSet\n :param resultModifiedColumnSet: io.deephaven.engine.table.ModifiedColumnSet\n :param parents: java.lang.Object...\n :return: io.deephaven.engine.table.impl.QueryTable", - "groupBy": ":param groupByColumns: java.util.Collection\n:return: io.deephaven.engine.table.Table", "head": ":param size: long\n:return: io.deephaven.engine.table.Table", "headBy": ":param nRows: long\n:param groupByColumns: java.lang.String...\n:return: io.deephaven.engine.table.Table", "headPct": "Provides a head that selects a dynamic number of rows based on a percent.\n\n:param percent: (double) - the fraction of the table to return (0..1), the number of rows will be rounded up. For example if\n there are 3 rows, headPct(50) returns the first two rows.\n:return: io.deephaven.engine.table.Table", @@ -34,10 +32,7 @@ "lastBy": "Groups the data column according to groupByColumns and retrieves the last for the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "lazyUpdate": "Compute column formulas on demand.\n\n \n Lazy update defers computation until required for a set of values, and caches the results for a set of input\n values. This uses less RAM than an update statement when you have a smaller set of unique values. Less\n computation than an updateView is needed, because the results are saved in a cache.\n \n\n If you have many unique values, you should instead use an update statement, which will have more memory efficient\n structures. Values are never removed from the lazyUpdate cache, so it should be used judiciously on a ticking\n table.\n \n\n:param newColumns: (java.util.Collection) - the columns to add\n:return: (io.deephaven.engine.table.Table) a new Table with the columns added; to be computed on demand", "leftJoin": "Returns a table that has one column for each original table's columns, and one column corresponding to each of\n the input table (right table) columns listed in the columns to add (or all the columns whose names don't overlap\n with the name of a column from the source table if the columnsToAdd is length zero). The new columns (those\n corresponding to the input table) contain an aggregation of all values from the left side that match the join\n criteria. Consequently, the types of all right side columns not involved in a join criteria, is an array of the\n original column type. If the two tables have columns with matching names then the method will fail with an\n exception unless the columns with corresponding names are found in one of the matching criteria.\n \n\n NOTE: leftJoin operation does not involve an actual data copy, or an in-memory table creation. In order to\n produce an actual in memory table you need to apply a select call on the join result.\n\n:param table: (io.deephaven.engine.table.Table) - input table\n:param columnsToMatch: (io.deephaven.engine.table.MatchPair[]) - match criteria\n:param columnsToAdd: (io.deephaven.engine.table.MatchPair[]) - columns to add\n:return: (io.deephaven.engine.table.Table) a table that has one column for each original table's columns, and one column corresponding to each\n column listed in columnsToAdd. If columnsToAdd.length==0 one column corresponding to each column of the\n input table (right table) columns whose names don't overlap with the name of a column from the source\n table is added. The new columns (those corresponding to the input table) contain an aggregation of all\n values from the left side that match the join criteria.", - "maxBy": "Groups the data column according to groupByColumns and computes the max for the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n:return: io.deephaven.engine.table.Table", - "medianBy": "Groups the data column according to groupByColumns and computes the median for the rest of the\n fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n:return: io.deephaven.engine.table.Table", "memoizeResult": "Saves a weak reference to the result of the given operation.\n\nNote: Java generics information - \n\n:param memoKey: (io.deephaven.engine.table.impl.MemoizedOperationKey) - a complete description of the operation, if null no memoization is performed\n:param operation: (java.util.function.Supplier) - a supplier for the result\n:return: (R) either the cached or newly generated result", - "minBy": "Groups the data column according to groupByColumns and computes the min for the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "moveColumns": ":param index: int\n:param moveToEnd: boolean\n:param columnsToMove: java.lang.String...\n:return: io.deephaven.engine.table.Table", "naturalJoin": ":param rightTable: io.deephaven.engine.table.Table\n:param columnsToMatch: io.deephaven.engine.table.MatchPair[]\n:param columnsToAdd: io.deephaven.engine.table.MatchPair[]\n:return: io.deephaven.engine.table.Table", "newModifiedColumnSet": "Create a ModifiedColumnSet to use when propagating updates from this table.\n\n:param columnNames: (java.lang.String...) - The columns that should belong to the resulting set\n:return: (io.deephaven.engine.table.ModifiedColumnSet) The resulting ModifiedColumnSet for the given columnNames", @@ -59,8 +54,6 @@ "snapshotHistory": ":param rightTable: io.deephaven.engine.table.Table\n:return: io.deephaven.engine.table.Table", "snapshotIncremental": ":param tableToSnapshot: io.deephaven.engine.table.Table\n:param doInitialSnapshot: boolean\n:param stampColumns: java.lang.String...\n:return: io.deephaven.engine.table.Table", "sort": ":param columnsToSortBy: java.util.Collection\n:return: io.deephaven.engine.table.Table", - "stdBy": ":param groupByColumns: io.deephaven.api.Selectable...\n:return: io.deephaven.engine.table.Table", - "sumBy": "Groups the data column according to groupByColumns and computes the sum for the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "tail": ":param size: long\n:return: io.deephaven.engine.table.Table", "tailBy": ":param nRows: long\n:param groupByColumns: java.lang.String...\n:return: io.deephaven.engine.table.Table", "tailPct": ":param percent: double\n:return: io.deephaven.engine.table.Table", @@ -69,15 +62,12 @@ "update": ":param newColumns: java.util.Collection\n:return: io.deephaven.engine.table.Table", "updateView": ":param viewColumns: java.util.Collection\n:return: io.deephaven.engine.table.Table", "validateSelect": "This does a certain amount of validation and can be used to get confidence that the formulas are valid. If it is\n not valid, you will get an exception. Positive test (should pass validation): \"X = 12\", \"Y = X + 1\") Negative\n test (should fail validation): \"X = 12\", \"Y = Z + 1\")\n\n DO NOT USE -- this API is in flux and may change or disappear in the future.\n\n:param selectColumns: io.deephaven.engine.table.impl.select.SelectColumn...\n:return: io.deephaven.engine.table.impl.SelectValidationResult", - "varBy": "Groups the data column according to groupByColumns and computes the variance for the rest of the\n fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "view": ":param viewColumns: java.util.Collection\n:return: io.deephaven.engine.table.Table", - "wavgBy": "Groups the data column according to groupByColumns and computes the weighted average using\n weightColumn for the rest of the fields\n\n:param weightColumn: (java.lang.String) - the column to use for the weight\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", "where": ":param filters: java.util.Collection\n:return: io.deephaven.engine.table.Table", "whereIn": "Filters this table based on the set of values in the rightTable.\n\n \n Note that when the rightTable ticks, all of the rows in this table are going to be re-evaluated,\n thus the intention is that the rightTable is fairly slow moving compared with this table.\n\n:param rightTable: (io.deephaven.engine.table.Table) - the filtering table.\n:param columnsToMatch: (java.util.Collection) - the columns to match between the two tables\n:return: (io.deephaven.engine.table.Table) a new table filtered on right table", "whereNotIn": "Filters this table based on the set of values not in the rightTable.\n\n \n Note that when the rightTable ticks, all of the rows in this table are going to be re-evaluated,\n thus the intention is that the rightTable is fairly slow moving compared with this table.\n\n:param rightTable: (io.deephaven.engine.table.Table) - the filtering table.\n:param columnsToMatch: (java.util.Collection) - the columns to match between the two tables\n:return: (io.deephaven.engine.table.Table) a new table filtered on right table", "withDefinitionUnsafe": "Create a new query table with the ColumnDefinitions of template, but in the\n order of this. The tables must be mutually compatible, as defined via\n TableDefinition.checkCompatibility(TableDefinition).\n\n:param template: (io.deephaven.engine.table.TableDefinition) - the new definition template to use\n:return: (io.deephaven.engine.table.impl.QueryTable) the new query table", - "wouldMatch": "A table operation that applies the supplied predicate to each row in the table and produces columns containing\n the pass/fail result of the predicate application. This is similar to Table.where(String...) except that\n instead of selecting only rows that meet the criteria, new columns are added with the result of the comparison.\n\n:param matchers: io.deephaven.engine.table.WouldMatchPair...\n:return: (io.deephaven.engine.table.Table) a table with new columns containing the filter result for each row.", - "wsumBy": "Groups the data column according to groupByColumns and computes the weighted sum using weightColumn\n for the rest of the fields\n \n If the weight column is a floating point type, all result columns will be doubles. If the weight column is an\n integral type, all integral input columns will have long results and all floating point input columns will have\n double results.\n\n:param weightColumn: (java.lang.String) - the column to use for the weight\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table" + "wouldMatch": "A table operation that applies the supplied predicate to each row in the table and produces columns containing\n the pass/fail result of the predicate application. This is similar to Table.where(String...) except that\n instead of selecting only rows that meet the criteria, new columns are added with the result of the comparison.\n\n:param matchers: io.deephaven.engine.table.WouldMatchPair...\n:return: (io.deephaven.engine.table.Table) a table with new columns containing the filter result for each row." }, "path": "io.deephaven.engine.table.impl.QueryTable", "text": "Primary coalesced table implementation.", diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/TableWithDefaults.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/TableWithDefaults.json index de52e2169ce..eff29186e0a 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/TableWithDefaults.json +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/TableWithDefaults.json @@ -1,12 +1,13 @@ { "className": "io.deephaven.engine.table.impl.TableWithDefaults", "methods": { - "absSumBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the sum of the absolute values for\n the rest of the fields\n\n*Overload 1* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :return: io.deephaven.engine.table.Table", + "absSumBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the sum of the absolute values for\n the rest of the fields\n\n*Overload 1* \n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :return: io.deephaven.engine.table.Table", + "aggAllBy": "*Overload 1* \n :param key: io.deephaven.api.agg.key.Key\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.engine.table.Table", "aggBy": "*Overload 1* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 5* \n :param table: io.deephaven.engine.table.Table\n :param aggHolder: io.deephaven.engine.table.impl.TableWithDefaults.AggHolder\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 6* \n :param aggregations: java.util.Collection\n :return: io.deephaven.engine.table.Table", "aj": "**Incompatible overloads text - text from the first overload:**\n\nLooks up the columns in the rightTable that meet the match conditions in the columnsToMatch list. Matching is\n done exactly for the first n-1 columns and via a binary search for the last match pair. The columns of the\n original table are returned intact, together with all the columns from rightTable.\n\n*Overload 1* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (io.deephaven.engine.table.MatchPair[]) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :param columnsToAdd: (io.deephaven.engine.table.MatchPair[]) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 2* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 3* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :param asOfJoinRule: (io.deephaven.api.AsOfJoinRule) - The binary search operator for the last match pair.\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 4* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 5* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 6* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch", "apply": "Applies a function to this table.\n \n This is useful if you have a reference to a table or a proxy and want to run a series of operations against the\n table without each individual operation resulting in an RMI.\n\nNote: Java generics information - \n\n:param function: (java.util.function.Function) - the function to run, its single argument will be this table\n:return: (R) the return value of function", "applyToAllBy": "Groups data according to groupByColumns and applies formulaColumn to each of columns not altered by the grouping\n operation.\n\n*Overload 1* \n :param formulaColumn: (java.lang.String) - Formula applied to each column, uses parameter each to refer to each colum it being\n applied to\n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param formulaColumn: (java.lang.String) - Formula applied to each column, uses parameter each to refer to each colum it being\n applied to\n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table", - "avgBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the average for the rest of the\n fields\n\n*Overload 1* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :return: io.deephaven.engine.table.Table", + "avgBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the average for the rest of the\n fields\n\n*Overload 1* \n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :return: io.deephaven.engine.table.Table", "byteColumnIterator": ":param columnName: java.lang.String\n:return: io.deephaven.engine.table.iterators.ByteColumnIterator", "characterColumnIterator": ":param columnName: java.lang.String\n:return: io.deephaven.engine.table.iterators.CharacterColumnIterator", "close": "Release resources held by this table, possibly destructively. This may render the table unsuitable or unsafe for\n further use.", @@ -27,7 +28,7 @@ "getColumnSource": "Retrieves a ColumnSource and casts it to the target class clazz.\n\nNote: Java generics information - \n\n:param sourceName: (java.lang.String) - The name of the column\n:param extend: java.lang.Class) The column source for sourceName, parameterized by T", "getColumns": ":return: io.deephaven.engine.table.DataColumn[]", "getMeta": "Provides column metadata in Table form. Convenience method, behaves exactly the same as\n getDefinition().getColumnDefinitionsTable().\n\n:return: (io.deephaven.engine.table.Table) A Table of metadata about this Table's columns.", - "groupBy": "*Overload 1* \n :param groupByColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :return: io.deephaven.engine.table.Table", + "groupBy": "*Overload 1* \n :param groupByColumns: java.util.Collection\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :return: io.deephaven.engine.table.Table", "hasColumns": "**Incompatible overloads text - text from the first overload:**\n\nDetermines whether this Table contains a column for each string in the specified array of columnNames.\n\n*Overload 1* \n :param columnNames: (java.lang.String...) - The array of column names to be checked for inclusion in this table. Must not be null.\n :return: (boolean) true if this Table contains a column for each and every string in the columnNames array;\n false if any element of columnNames is not the name of a column in this table\n \n*Overload 2* \n :param columnNames: (java.util.Collection) - The collection of column names to be checked for inclusion in this table. Must not be\n null.\n :return: (boolean) true if this Table contains a column for each and every string in the columnNames\n collection; false if any element of columnNames is not the name of a column in\n this table", "headBy": ":param nRows: long\n:param groupByColumnNames: java.util.Collection\n:return: io.deephaven.engine.table.Table", "integerColumnIterator": ":param columnName: java.lang.String\n:return: io.deephaven.engine.table.iterators.IntegerColumnIterator", @@ -39,11 +40,11 @@ "leftJoin": "**Incompatible overloads text - text from the first overload:**\n\nPerform a left-join with the rightTable.\n\n \n Delegates to TableOperations.leftJoin(Object, Collection, Collection).\n\n*Overload 1* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (io.deephaven.engine.table.Table) a table that has one column for each original table's columns, and one column corresponding to each\n column listed in columnsToAdd. If columnsToAdd.isEmpty() one column corresponding to each column\n of the input table (right table) columns whose names don't overlap with the name of a column from the\n source table is added. The new columns (those corresponding to the input table) contain an aggregation of\n all values from the left side that match the join criteria.\n \n*Overload 2* \n :param rightTable: io.deephaven.engine.table.Table\n :param columnsToMatch: java.util.Collection\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the right side that need to be added to the left\n side as a result of the match.\n :return: (io.deephaven.engine.table.Table) the left-joined table\n \n*Overload 4* \n :param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :return: (io.deephaven.engine.table.Table) the left-joined table\n \n*Overload 5* \n :param rightTable: io.deephaven.engine.table.Table\n :return: io.deephaven.engine.table.Table", "listenForUpdates": "Subscribe for updates to this table. listener will be invoked via the NotificationQueue\n associated with this Table.\n\n:param listener: (io.deephaven.engine.table.ShiftObliviousListener) - listener for updates", "longColumnIterator": ":param columnName: java.lang.String\n:return: io.deephaven.engine.table.iterators.LongColumnIterator", - "maxBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the max for the rest of the fields\n\n*Overload 1* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :return: io.deephaven.engine.table.Table", - "medianBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the median for the rest of the\n fields\n\n*Overload 1* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :return: io.deephaven.engine.table.Table", + "maxBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the max for the rest of the fields\n\n*Overload 1* \n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :return: io.deephaven.engine.table.Table", + "medianBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the median for the rest of the\n fields\n\n*Overload 1* \n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection) }\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :return: io.deephaven.engine.table.Table", "mergeAfter": "Merge this Table with others. All rows in this Table will appear after all rows in others. If\n Tables in others are the result of a prior merge operation, they may be expanded in an attempt\n to avoid deeply nested structures.\n\n:param others: (io.deephaven.engine.table.Table...) - The Tables to merge with\n:return: (io.deephaven.engine.table.Table) The merged Table", "mergeBefore": "Merge this Table with others. All rows in this Table will appear before all rows in others. If\n Tables in others are the result of a prior merge operation, they may be expanded in an attempt\n to avoid deeply nested structures.\n\n:param others: (io.deephaven.engine.table.Table...) - The Tables to merge with\n:return: (io.deephaven.engine.table.Table) The merged Table", - "minBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the min for the rest of the fields\n\n*Overload 1* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :return: io.deephaven.engine.table.Table", + "minBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the min for the rest of the fields\n\n*Overload 1* \n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :return: io.deephaven.engine.table.Table", "moveColumns": "Produce a new table with the specified columns moved to the specified index. Column indices begin at 0.\n Columns can be renamed with the usual syntax, i.e. \"NewColumnName=OldColumnName\").\n\n:param index: (int) - The index to which the specified columns should be moved\n:param columnsToMove: (java.lang.String...) - The columns to move to the specified index (and, optionally, to rename)\n:return: (io.deephaven.engine.table.Table) The new table, with the columns rearranged as explained above", "moveColumnsDown": "Produce a new table with the specified columns moved to the rightmost position. Columns can be renamed with the\n usual syntax, i.e. \"NewColumnName=OldColumnName\").\n\n:param columnsToMove: (java.lang.String...) - The columns to move to the right (and, optionally, to rename)\n:return: (io.deephaven.engine.table.Table) The new table, with the columns rearranged as explained above Table.moveColumns(int, String...)", "moveColumnsUp": "Produce a new table with the specified columns moved to the leftmost position. Columns can be renamed with the\n usual syntax, i.e. \"NewColumnName=OldColumnName\").\n\n:param columnsToMove: (java.lang.String...) - The columns to move to the left (and, optionally, to rename)\n:return: (io.deephaven.engine.table.Table) The new table, with the columns rearranged as explained above Table.moveColumns(int, String...)", @@ -62,22 +63,22 @@ "snapshotIncremental": ":param rightTable: io.deephaven.engine.table.Table\n:param stampColumns: java.lang.String...\n:return: io.deephaven.engine.table.Table", "sort": "*Overload 1* \n :param columnsToSortBy: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param table: io.deephaven.engine.table.Table\n :param columnsToSortBy: io.deephaven.api.SortColumn...\n :return: io.deephaven.engine.table.Table", "sortDescending": ":param columnsToSortBy: java.lang.String...\n:return: io.deephaven.engine.table.Table", - "stdBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the standard deviation for the rest\n of the fields\n\n*Overload 1* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :return: io.deephaven.engine.table.Table", - "sumBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the sum for the rest of the fields\n\n*Overload 1* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :return: io.deephaven.engine.table.Table", + "stdBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the standard deviation for the rest\n of the fields\n\n*Overload 1* \n :param groupByColumns: io.deephaven.api.Selectable...\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :return: io.deephaven.engine.table.Table", + "sumBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the sum for the rest of the fields\n\n*Overload 1* \n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :return: io.deephaven.engine.table.Table", "tailBy": ":param nRows: long\n:param groupByColumnNames: java.util.Collection\n:return: io.deephaven.engine.table.Table", "ungroup": "*Overload 1* \n :param columnsToUngroup: java.lang.String...\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param nullFill: boolean\n :return: io.deephaven.engine.table.Table", "ungroupAllBut": ":param columnsNotToUngroup: java.lang.String...\n:return: io.deephaven.engine.table.Table", "update": "*Overload 1* \n :param newColumns: io.deephaven.api.Selectable...\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param newColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table", "updateView": "*Overload 1* \n :param newColumns: io.deephaven.api.Selectable...\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param newColumns: java.lang.String...\n :return: io.deephaven.engine.table.Table", - "varBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the variance for the rest of the\n fields\n\n*Overload 1* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :return: io.deephaven.engine.table.Table", + "varBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the variance for the rest of the\n fields\n\n*Overload 1* \n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :return: io.deephaven.engine.table.Table", "view": "*Overload 1* \n :param columns: io.deephaven.api.Selectable...\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param columns: java.lang.String...\n :return: io.deephaven.engine.table.Table", - "wavgBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the weighted average using\n weightColumn for the rest of the fields\n\n*Overload 1* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :return: io.deephaven.engine.table.Table", + "wavgBy": "**Incompatible overloads text - text from the first overload:**\n\nGroups the data column according to groupByColumns and computes the weighted average using\n weightColumn for the rest of the fields\n\n*Overload 1* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :return: io.deephaven.engine.table.Table", "where": "*Overload 1* \n :param filters: io.deephaven.api.filter.Filter...\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param filters: java.lang.String...\n :return: io.deephaven.engine.table.Table", "whereIn": "Filters this table based on the set of values in the rightTable.\n\n \n Delegates to TableOperations.whereIn(Object, Collection).\n\n:param rightTable: (io.deephaven.engine.table.Table) - the filtering table.\n:param columnsToMatch: (java.lang.String...) - the columns to match between the two tables\n:return: (io.deephaven.engine.table.Table) a new table filtered on right table", "whereNotIn": "Filters this table based on the set of values not in the rightTable.\n\n \n Delegates to TableOperations.whereNotIn(Object, Collection).\n\n:param rightTable: (io.deephaven.engine.table.Table) - the filtering table.\n:param columnsToMatch: (java.lang.String...) - the columns to match between the two tables\n:return: (io.deephaven.engine.table.Table) a new table filtered on right table", "withColumnDescription": "Add a description for a specific column. You may use Table.withColumnDescription(Map) to set several\n descriptions at once.\n\n:param column: (java.lang.String) - the name of the column\n:param description: (java.lang.String) - the column description\n:return: (io.deephaven.engine.table.Table) a copy of the source table with the description applied", "wouldMatch": ":param expressions: java.lang.String...\n:return: io.deephaven.engine.table.Table", - "wsumBy": "**Incompatible overloads text - text from the first overload:**\n\nComputes the weighted sum for all rows in the table using weightColumn for the rest of the fields\n \n If the weight column is a floating point type, all result columns will be doubles. If the weight column is an\n integral type, all integral input columns will have long results and all floating point input columns will have\n double results.\n\n*Overload 1* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table" + "wsumBy": "**Incompatible overloads text - text from the first overload:**\n\nComputes the weighted sum for all rows in the table using weightColumn for the rest of the fields\n \n If the weight column is a floating point type, all result columns will be doubles. If the weight column is an\n integral type, all integral input columns will have long results and all floating point input columns will have\n double results.\n\n*Overload 1* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 2* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :return: io.deephaven.engine.table.Table\n \n*Overload 3* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (java.lang.String...) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table\n \n*Overload 4* \n :param weightColumn: (java.lang.String) - the column to use for the weight\n :param groupByColumns: (java.util.Collection) - The grouping columns as in Table.groupBy(java.util.Collection)\n :return: io.deephaven.engine.table.Table" }, "path": "io.deephaven.engine.table.impl.TableWithDefaults", "text": "Sub-interface to capture default methods rom Table.", diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/UncoalescedTable.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/UncoalescedTable.json index edf9bf5568b..7afe87736b9 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/UncoalescedTable.json +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/UncoalescedTable.json @@ -2,6 +2,7 @@ "className": "io.deephaven.engine.table.impl.UncoalescedTable", "methods": { "absSumBy": "Groups the data column according to groupByColumns and computes the sum of the absolute values for\n the rest of the fields\n\n:param groupByColumns: (io.deephaven.api.Selectable...) - The grouping columns as in Table.groupBy(java.util.Collection)\n:return: io.deephaven.engine.table.Table", + "aggAllBy": ":param key: io.deephaven.api.agg.key.Key\n:param groupByColumns: io.deephaven.api.Selectable...\n:return: io.deephaven.engine.table.Table", "aggBy": ":param aggregations: java.util.Collection\n:param groupByColumns: java.util.Collection\n:return: io.deephaven.engine.table.Table", "aj": "Looks up the columns in the rightTable that meet the match conditions in the columnsToMatch list. Matching is\n done exactly for the first n-1 columns and via a binary search for the last match pair. The columns of the\n original table are returned intact, together with the columns from rightTable defined in a comma separated list\n \"columnsToAdd\"\n\n:param rightTable: (io.deephaven.engine.table.Table) - The right side table on the join.\n:param columnsToMatch: (io.deephaven.engine.table.MatchPair[]) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n:param columnsToAdd: (io.deephaven.engine.table.MatchPair[]) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n:param asOfMatchRule: io.deephaven.engine.table.Table.AsOfMatchRule\n:return: (io.deephaven.engine.table.Table) a new table joined according to the specification in columnsToMatch and columnsToAdd", "apply": "Applies a function to this table.\n \n This is useful if you have a reference to a table or a proxy and want to run a series of operations against the\n table without each individual operation resulting in an RMI.\n\nNote: Java generics information - \n\n:param function: (java.util.function.Function) - the function to run, its single argument will be this table\n:return: (R) the return value of function", diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationFactory/AggregationElement.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationFactory/AggregationElement.json index d26ab32cd07..41bc7915f02 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationFactory/AggregationElement.json +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationFactory/AggregationElement.json @@ -1,14 +1,14 @@ { "className": "io.deephaven.engine.table.impl.by.AggregationFactory$AggregationElement", "methods": { - "convert": "Converts and the aggregations, only collapsing multi aggregations into single\n elements, leaving singular aggregations as they are.\n\n \n Note: The results will preserve the intended order of the inputs.\n\n:param aggregations: (java.util.Collection) - The aggregation\n:return: (java.util.List) A list of aggregation elements", + "convert": "Converts and the aggregations leaving singular aggregations as they are.\n\n \n Note: The results will preserve the intended order of the inputs.\n\n:param aggregations: (java.util.Collection) - The aggregation\n:param parent: (io.deephaven.engine.table.impl.BaseTable) - The parent table\n:return: (java.util.List) A list of aggregation elements", "forRollup": ":return: io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement", "getMemoKey": ":return: io.deephaven.engine.table.impl.by.AggregationMemoKey", "getResultPairs": ":return: io.deephaven.engine.table.MatchPair[]", "getSourceColumns": ":return: java.lang.String[]", "getSpec": ":return: io.deephaven.engine.table.impl.by.AggregationSpec", - "of": "Converts an Aggregation to an AggregationFactory.AggregationElement.\n\n:param aggregation: (io.deephaven.api.agg.Aggregation) - The aggregation\n:return: (io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement) The aggregation element", - "optimizeAndConvert": "Converts and optimizes the aggregations, collapsing relevant aggregations into single\n elements where applicable.\n\n \n Note: due to the optimization, the aggregation elements may not be in the same order as specified in\n aggregations.\n\n:param aggregations: (java.util.Collection) - The aggregation\n:return: (java.util.List) A list of aggregation elements" + "of": "Converts an Aggregation to an AggregationFactory.AggregationElement.\n\n:param aggregation: (io.deephaven.api.agg.Aggregation) - The aggregation\n:param parent: (io.deephaven.engine.table.impl.BaseTable) - The parent table\n:return: (io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement) The aggregation element", + "optimizeAndConvert": "Converts and optimizes the aggregations, collapsing relevant aggregations into single\n elements where applicable.\n\n \n Note: due to the optimization, the aggregation elements may not be in the same order as specified in\n aggregations.\n\n:param aggregations: (java.util.Collection) - The aggregation\n:param parent: (io.deephaven.engine.table.impl.BaseTable) - The parent table\n:return: (java.util.List) A list of aggregation elements" }, "path": "io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement", "typeName": "interface" diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.json new file mode 100644 index 00000000000..861e9ccbe28 --- /dev/null +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.json @@ -0,0 +1,10 @@ +{ + "className": "io.deephaven.engine.table.impl.by.AggregationSpecAdapter", + "methods": { + "of": ":param key: io.deephaven.api.agg.key.Key\n:param parent: io.deephaven.engine.table.impl.BaseTable\n:return: io.deephaven.engine.table.impl.by.AggregationSpec", + "out": ":return: io.deephaven.engine.table.impl.by.AggregationSpec", + "visit": "*Overload 1* \n :param absSum: io.deephaven.api.agg.key.KeyAbsSum\n \n*Overload 2* \n :param countDistinct: io.deephaven.api.agg.key.KeyCountDistinct\n \n*Overload 3* \n :param distinct: io.deephaven.api.agg.key.KeyDistinct\n \n*Overload 4* \n :param group: io.deephaven.api.agg.key.KeyGroup\n \n*Overload 5* \n :param avg: io.deephaven.api.agg.key.KeyAvg\n \n*Overload 6* \n :param first: io.deephaven.api.agg.key.KeyFirst\n \n*Overload 7* \n :param last: io.deephaven.api.agg.key.KeyLast\n \n*Overload 8* \n :param max: io.deephaven.api.agg.key.KeyMax\n \n*Overload 9* \n :param median: io.deephaven.api.agg.key.KeyMedian\n \n*Overload 10* \n :param min: io.deephaven.api.agg.key.KeyMin\n \n*Overload 11* \n :param pct: io.deephaven.api.agg.key.KeyPct\n \n*Overload 12* \n :param sortedFirst: io.deephaven.api.agg.key.KeySortedFirst\n \n*Overload 13* \n :param sortedLast: io.deephaven.api.agg.key.KeySortedLast\n \n*Overload 14* \n :param std: io.deephaven.api.agg.key.KeyStd\n \n*Overload 15* \n :param sum: io.deephaven.api.agg.key.KeySum\n \n*Overload 16* \n :param unique: io.deephaven.api.agg.key.KeyUnique\n \n*Overload 17* \n :param wAvg: io.deephaven.api.agg.key.KeyWAvg\n \n*Overload 18* \n :param wSum: io.deephaven.api.agg.key.KeyWSum\n \n*Overload 19* \n :param var: io.deephaven.api.agg.key.KeyVar" + }, + "path": "io.deephaven.engine.table.impl.by.AggregationSpecAdapter", + "typeName": "class" +} \ No newline at end of file diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableBase.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableBase.json index bf8e67067fb..944aa87aed6 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableBase.json +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/TableBase.json @@ -1,6 +1,7 @@ { "className": "io.deephaven.qst.table.TableBase", "methods": { + "aggAllBy": "*Overload 1* \n :param key: io.deephaven.api.agg.key.Key\n :return: io.deephaven.qst.table.SingleAggregationTable\n \n*Overload 2* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.qst.table.SingleAggregationTable\n \n*Overload 3* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: io.deephaven.api.Selectable...\n :return: io.deephaven.qst.table.SingleAggregationTable\n \n*Overload 4* \n :param key: io.deephaven.api.agg.key.Key\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.qst.table.SingleAggregationTable", "aggBy": "*Overload 1* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 2* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 3* \n :param aggregation: io.deephaven.api.agg.Aggregation\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 4* \n :param aggregations: java.util.Collection\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 5* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.lang.String...\n :return: io.deephaven.qst.table.AggregationTable\n \n*Overload 6* \n :param aggregations: java.util.Collection\n :param groupByColumns: java.util.Collection\n :return: io.deephaven.qst.table.AggregationTable", "aj": "**Incompatible overloads text - text from the first overload:**\n\nPerform an as-of join with the rightTable.\n\n \n Delegates to TableOperations.aj(Object, Collection, Collection, AsOfJoinRule).\n\n*Overload 1* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :return: (io.deephaven.qst.table.AsOfJoinTable) a new table joined according to the specification in columnsToMatch\n \n*Overload 2* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\").\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the left side that need to be added to the right\n side as a result of the match.\n :return: (io.deephaven.qst.table.AsOfJoinTable) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 3* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (io.deephaven.qst.table.AsOfJoinTable) a new table joined according to the specification in columnsToMatch and columnsToAdd\n \n*Overload 4* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :param asOfJoinRule: (io.deephaven.api.AsOfJoinRule) - The binary search operator for the last match pair.\n :return: (io.deephaven.qst.table.AsOfJoinTable) a new table joined according to the specification in columnsToMatch and columnsToAdd", "exactJoin": "**Incompatible overloads text - text from the first overload:**\n\nPerform an exact-join with the rightTable.\n\n \n Delegates to TableOperations.exactJoin(Object, Collection, Collection).\n\n*Overload 1* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.util.Collection) - The match pair conditions.\n :param columnsToAdd: (java.util.Collection) - The columns from the right side that need to be added to the left side as a result of the\n match.\n :return: (io.deephaven.qst.table.ExactJoinTable) the exact-joined table\n \n*Overload 2* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :return: (io.deephaven.qst.table.ExactJoinTable) the exact-joined table\n \n*Overload 3* \n :param rightTable: (io.deephaven.qst.table.TableSpec) - The right side table on the join.\n :param columnsToMatch: (java.lang.String) - A comma separated list of match conditions (\"leftColumn=rightColumn\" or\n \"columnFoundInBoth\")\n :param columnsToAdd: (java.lang.String) - A comma separated list with the columns from the right side that need to be added to the left\n side as a result of the match.\n :return: (io.deephaven.qst.table.ExactJoinTable) the exact-joined table", From 9b0c7b33fe99a756bbbbc58cbc35c28a1cb72337 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 12:35:45 -0800 Subject: [PATCH 10/20] spotless --- .../io/deephaven/engine/table/impl/by/AggregationFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java index 0641a000137..c69713647ba 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java @@ -29,6 +29,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; + /** * The AggregationFactory combines one or more aggregations into an {@link AggregationSpec} for use internally by the * implementation of {@link Table#aggBy}. From 00e347b005d0ad7c238f96b353259de16a1e005a Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 13:22:00 -0800 Subject: [PATCH 11/20] plumb lastBy/firstBy --- .../engine/table/impl/HierarchicalTable.java | 10 -- .../engine/table/impl/QueryTable.java | 121 ++++++++++++++---- .../engine/table/impl/TableWithDefaults.java | 14 ++ 3 files changed, 108 insertions(+), 37 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java index ffb8ed93fa0..1cc945c29d9 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java @@ -159,16 +159,6 @@ public Table join(Table rightTable, MatchPair[] columnsToMatch, MatchPair[] colu return throwUnsupported("join()"); } - @Override - public Table lastBy(Selectable... groupByColumns) { - return throwUnsupported("lastBy()"); - } - - @Override - public Table firstBy(Selectable... groupByColumns) { - return throwUnsupported("firstBy()"); - } - @Override public Table countBy(String countColumnName, Selectable... groupByColumns) { return throwUnsupported("countBy()"); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index b48bd26b5e6..2448113dcf9 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -11,6 +11,25 @@ import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.AggregationOutputs; import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; import io.deephaven.api.filter.Filter; import io.deephaven.base.StringUtils; import io.deephaven.base.verify.Assert; @@ -598,7 +617,9 @@ public Table aggAllBy(Key key, Selectable... groupByColumns) { remainingColumns.add(ColumnName.of(columnName)); } } - return aggBy(key.aggregation(remainingColumns), List.of(groupByColumns)); + final Table result = aggBy(key.aggregation(remainingColumns), List.of(groupByColumns)); + key.walk(new CopyAttributes(this, result)); + return result; } @Override @@ -628,32 +649,6 @@ public Table aggBy(final Collection aggregations, return aggregationTable.view(resultOrder); } - @Override - public Table lastBy(Selectable... groupByColumns) { - return QueryPerformanceRecorder.withNugget("lastBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> { - final Table result = - by(TRACKED_LAST_BY ? new TrackingLastBySpecImpl() : new LastBySpecImpl(), - SelectColumn.from(groupByColumns)); - copyAttributes(result, CopyAttributeOperation.LastBy); - return result; - }); - } - - @Override - public Table firstBy(Selectable... groupByColumns) { - return QueryPerformanceRecorder.withNugget("firstBy(" + Arrays.toString(groupByColumns) + ")", - sizeForInstrumentation(), - () -> { - final Table result = - by(TRACKED_FIRST_BY ? new TrackingFirstBySpecImpl() : new FirstBySpecImpl(), - SelectColumn.from(groupByColumns)); - copyAttributes(result, CopyAttributeOperation.FirstBy); - return result; - }); - } - @Override public Table countBy(String countColumnName, Selectable... groupByColumns) { return QueryPerformanceRecorder.withNugget( @@ -3376,4 +3371,76 @@ public R apply(Function function) { public Table wouldMatch(WouldMatchPair... matchers) { return getResult(new WouldMatchOperation(this, matchers)); } + + private static class CopyAttributes implements Key.Visitor { + + private final BaseTable parent; + private final Table result; + + public CopyAttributes(BaseTable parent, Table result) { + this.parent = Objects.requireNonNull(parent); + this.result = Objects.requireNonNull(result); + } + + @Override + public void visit(KeyAbsSum absSum) {} + + @Override + public void visit(KeyCountDistinct countDistinct) {} + + @Override + public void visit(KeyDistinct distinct) {} + + @Override + public void visit(KeyGroup group) {} + + @Override + public void visit(KeyAvg avg) {} + + @Override + public void visit(KeyFirst first) { + parent.copyAttributes(result, CopyAttributeOperation.FirstBy); + } + + @Override + public void visit(KeyLast last) { + parent.copyAttributes(result, CopyAttributeOperation.LastBy); + } + + @Override + public void visit(KeyMax max) {} + + @Override + public void visit(KeyMedian median) {} + + @Override + public void visit(KeyMin min) {} + + @Override + public void visit(KeyPct pct) {} + + @Override + public void visit(KeySortedFirst sortedFirst) {} + + @Override + public void visit(KeySortedLast sortedLast) {} + + @Override + public void visit(KeyStd std) {} + + @Override + public void visit(KeySum sum) {} + + @Override + public void visit(KeyUnique unique) {} + + @Override + public void visit(KeyWAvg wAvg) {} + + @Override + public void visit(KeyWSum wSum) {} + + @Override + public void visit(KeyVar var) {} + } } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java index 4ab2fcc7dac..da4d4049ee1 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java @@ -9,7 +9,9 @@ import io.deephaven.api.agg.key.Key; import io.deephaven.api.agg.key.KeyAbsSum; import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyFirst; import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; import io.deephaven.api.agg.key.KeyMax; import io.deephaven.api.agg.key.KeyMedian; import io.deephaven.api.agg.key.KeyMin; @@ -944,6 +946,12 @@ default Table varBy() { return varBy(ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table lastBy(Selectable... groupByColumns) { + return aggAllBy(KeyLast.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table lastBy(String... groupByColumns) { @@ -962,6 +970,12 @@ default Table lastBy() { return lastBy(ZERO_LENGTH_SELECTABLE_ARRAY); } + @Override + @ConcurrentMethod + default Table firstBy(Selectable... groupByColumns) { + return aggAllBy(KeyFirst.of(), groupByColumns); + } + @Override @ConcurrentMethod default Table firstBy(String... groupByColumns) { From b6a9f516bc14907371b24e9ae9f1e471f9d39a32 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 1 Dec 2021 14:37:16 -0800 Subject: [PATCH 12/20] Ensure we don't include columns that agg keys reference --- .../engine/table/impl/QueryTable.java | 37 ++++-- .../api/agg/key/KeyColumnReferences.java | 117 ++++++++++++++++++ 2 files changed, 144 insertions(+), 10 deletions(-) create mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyColumnReferences.java diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 2448113dcf9..0cf1081809e 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -13,6 +13,7 @@ import io.deephaven.api.agg.key.Key; import io.deephaven.api.agg.key.KeyAbsSum; import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyColumnReferences; import io.deephaven.api.agg.key.KeyCountDistinct; import io.deephaven.api.agg.key.KeyDistinct; import io.deephaven.api.agg.key.KeyFirst; @@ -607,19 +608,35 @@ public Table exactJoin(Table table, MatchPair[] columnsToMatch, MatchPair[] colu @Override public Table aggAllBy(Key key, Selectable... groupByColumns) { - final Set groupColumns = new HashSet<>(groupByColumns.length); - for (Selectable groupByColumn : groupByColumns) { - groupColumns.add(groupByColumn.newColumn().name()); - } - final List remainingColumns = new ArrayList<>(columns.size() - groupByColumns.length); + final List aggColumns = aggregateColumns(key, groupByColumns); + final Table result = aggColumns.isEmpty() ? aggBy(List.of(), List.of(groupByColumns)) + : aggBy(key.aggregation(aggColumns), List.of(groupByColumns)); + key.walk(new CopyAttributes(this, result)); + return result; + } + + private List aggregateColumns(Key key, Selectable[] groupByColumns) { + final Set doNotAgg = doNotAggregateColumns(key, groupByColumns); + final List remainingColumns = new ArrayList<>(columns.size() - doNotAgg.size()); for (String columnName : columns.keySet()) { - if (!groupColumns.contains(columnName)) { - remainingColumns.add(ColumnName.of(columnName)); + if (doNotAgg.contains(columnName)) { + continue; } + remainingColumns.add(ColumnName.of(columnName)); } - final Table result = aggBy(key.aggregation(remainingColumns), List.of(groupByColumns)); - key.walk(new CopyAttributes(this, result)); - return result; + return remainingColumns; + } + + private Set doNotAggregateColumns(Key key, Selectable[] groupByColumns) { + final Set keyRefs = KeyColumnReferences.of(key); + final Set doNotAgg = new HashSet<>(groupByColumns.length + keyRefs.size()); + for (Selectable groupByColumn : groupByColumns) { + doNotAgg.add(groupByColumn.newColumn().name()); + } + for (ColumnName columnName : keyRefs) { + doNotAgg.add(columnName.name()); + } + return doNotAgg; } @Override diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyColumnReferences.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyColumnReferences.java new file mode 100644 index 00000000000..46aad94eb58 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyColumnReferences.java @@ -0,0 +1,117 @@ +package io.deephaven.api.agg.key; + +import io.deephaven.api.ColumnName; +import io.deephaven.api.SortColumn; + +import java.util.Collections; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +public final class KeyColumnReferences implements Key.Visitor { + + public static Set of(Key key) { + return key.walk(new KeyColumnReferences()).out(); + } + + private Set out; + + public Set out() { + return Objects.requireNonNull(out); + } + + @Override + public void visit(KeyAbsSum absSum) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyCountDistinct countDistinct) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyDistinct distinct) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyGroup group) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyAvg avg) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyFirst first) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyLast last) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyMax max) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyMedian median) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyMin min) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyPct pct) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeySortedFirst sortedFirst) { + out = sortedFirst.columns().stream().map(SortColumn::column).collect(Collectors.toSet()); + } + + @Override + public void visit(KeySortedLast sortedLast) { + out = sortedLast.columns().stream().map(SortColumn::column).collect(Collectors.toSet()); + } + + @Override + public void visit(KeyStd std) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeySum sum) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyUnique unique) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyWAvg wAvg) { + out = Collections.singleton(wAvg.weight()); + } + + @Override + public void visit(KeyWSum wSum) { + out = Collections.singleton(wSum.weight()); + } + + @Override + public void visit(KeyVar var) { + out = Collections.emptySet(); + } +} From 3e3a51d2d0e1d17c09dd256926d2989d8da7d3ec Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 2 Dec 2021 08:47:29 -0800 Subject: [PATCH 13/20] Review responses --- .../table/impl/AggAllByCopyAttributes.java | 98 +++++++++ .../engine/table/impl/QueryTable.java | 139 ++---------- .../engine/table/impl/TableWithDefaults.java | 39 ++-- .../impl/by/AggregationElementAdapter.java | 14 +- .../table/impl/by/AggregationFactory.java | 26 +-- .../table/impl/by/AggregationSpecAdapter.java | 13 +- .../parquet/table/ParquetTableWriter.java | 6 +- java-client/flight-examples/build.gradle | 1 + .../client/examples/AggregateAllExample.java | 151 +++++++++++++ .../client/impl/BatchTableRequestBuilder.java | 14 +- .../io/deephaven/graphviz/LabelBuilder.java | 182 +--------------- .../io/deephaven/qst/TableAdapterImpl.java | 126 +---------- .../qst/table/AggAllByExclusions.java | 146 +++++++++++++ .../qst/table/AggregateAllByTable.java | 73 +++++++ .../io/deephaven/qst/table/ByTableBase.java | 8 +- .../deephaven/qst/table/ParentsVisitor.java | 4 +- .../qst/table/SingleAggregationTable.java | 26 --- .../io/deephaven/qst/table/TableBase.java | 38 ++-- .../io/deephaven/qst/table/TableSpec.java | 2 +- .../qst/table/TableVisitorGeneric.java | 4 +- .../io/deephaven/api/agg/Aggregation.java | 200 +++--------------- .../main/java/io/deephaven/api/agg/Pair.java | 5 +- .../java/io/deephaven/api/agg/key/Key.java | 115 ++++++++++ ...yColumnReferences.java => KeyColumns.java} | 4 +- .../io/deephaven/api/agg/key/KeyMedian.java | 2 - .../java/io/deephaven/api/agg/key/KeyPct.java | 7 - 26 files changed, 723 insertions(+), 720 deletions(-) create mode 100644 engine/table/src/main/java/io/deephaven/engine/table/impl/AggAllByCopyAttributes.java create mode 100644 java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java create mode 100644 qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java create mode 100644 qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java delete mode 100644 qst/src/main/java/io/deephaven/qst/table/SingleAggregationTable.java rename table-api/src/main/java/io/deephaven/api/agg/key/{KeyColumnReferences.java => KeyColumns.java} (95%) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/AggAllByCopyAttributes.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/AggAllByCopyAttributes.java new file mode 100644 index 00000000000..f63fad4e9ab --- /dev/null +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/AggAllByCopyAttributes.java @@ -0,0 +1,98 @@ +package io.deephaven.engine.table.impl; + +import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; +import io.deephaven.engine.table.Table; +import io.deephaven.engine.table.impl.BaseTable.CopyAttributeOperation; + +import java.util.Objects; + +class AggAllByCopyAttributes implements Key.Visitor { + + private final BaseTable parent; + private final Table result; + + public AggAllByCopyAttributes(BaseTable parent, Table result) { + this.parent = Objects.requireNonNull(parent); + this.result = Objects.requireNonNull(result); + } + + @Override + public void visit(KeyAbsSum absSum) {} + + @Override + public void visit(KeyCountDistinct countDistinct) {} + + @Override + public void visit(KeyDistinct distinct) {} + + @Override + public void visit(KeyGroup group) {} + + @Override + public void visit(KeyAvg avg) {} + + @Override + public void visit(KeyFirst first) { + parent.copyAttributes(result, CopyAttributeOperation.FirstBy); + } + + @Override + public void visit(KeyLast last) { + parent.copyAttributes(result, CopyAttributeOperation.LastBy); + } + + @Override + public void visit(KeyMax max) {} + + @Override + public void visit(KeyMedian median) {} + + @Override + public void visit(KeyMin min) {} + + @Override + public void visit(KeyPct pct) {} + + @Override + public void visit(KeySortedFirst sortedFirst) {} + + @Override + public void visit(KeySortedLast sortedLast) {} + + @Override + public void visit(KeyStd std) {} + + @Override + public void visit(KeySum sum) {} + + @Override + public void visit(KeyUnique unique) {} + + @Override + public void visit(KeyWAvg wAvg) {} + + @Override + public void visit(KeyWSum wSum) {} + + @Override + public void visit(KeyVar var) {} +} diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 0cf1081809e..1e6703e6197 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -11,26 +11,7 @@ import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.AggregationOutputs; import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyColumnReferences; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; +import io.deephaven.api.agg.key.KeyColumns; import io.deephaven.api.filter.Filter; import io.deephaven.base.StringUtils; import io.deephaven.base.verify.Assert; @@ -47,6 +28,8 @@ import io.deephaven.engine.updategraph.DynamicNode; import io.deephaven.engine.util.ColumnFormattingValues; import io.deephaven.engine.util.systemicmarking.SystemicObject; +import io.deephaven.qst.table.AggregateAllByTable; +import io.deephaven.qst.table.AggregationTable; import io.deephaven.vector.Vector; import io.deephaven.engine.updategraph.UpdateGraphProcessor; import io.deephaven.engine.updategraph.NotificationQueue; @@ -458,7 +441,7 @@ public LocalTableMap partitionBy(final boolean dropKeys, final String... keyColu public Table rollup(Collection aggregations, boolean includeConstituents, Selectable... groupByColumns) { final List converted = - AggregationFactory.AggregationElement.convert(aggregations, this); + AggregationFactory.AggregationElement.convert(aggregations); return rollup(new AggregationFactory(converted), includeConstituents, SelectColumn.from(groupByColumns)); } @@ -608,42 +591,29 @@ public Table exactJoin(Table table, MatchPair[] columnsToMatch, MatchPair[] colu @Override public Table aggAllBy(Key key, Selectable... groupByColumns) { - final List aggColumns = aggregateColumns(key, groupByColumns); - final Table result = aggColumns.isEmpty() ? aggBy(List.of(), List.of(groupByColumns)) - : aggBy(key.aggregation(aggColumns), List.of(groupByColumns)); - key.walk(new CopyAttributes(this, result)); - return result; - } - - private List aggregateColumns(Key key, Selectable[] groupByColumns) { - final Set doNotAgg = doNotAggregateColumns(key, groupByColumns); - final List remainingColumns = new ArrayList<>(columns.size() - doNotAgg.size()); - for (String columnName : columns.keySet()) { - if (doNotAgg.contains(columnName)) { - continue; + for (ColumnName name : KeyColumns.of(key)) { + if (!columns.containsKey(name.name())) { + throw new IllegalArgumentException("Key references column that does not exist: " + name.name()); } - remainingColumns.add(ColumnName.of(columnName)); - } - return remainingColumns; - } - - private Set doNotAggregateColumns(Key key, Selectable[] groupByColumns) { - final Set keyRefs = KeyColumnReferences.of(key); - final Set doNotAgg = new HashSet<>(groupByColumns.length + keyRefs.size()); - for (Selectable groupByColumn : groupByColumns) { - doNotAgg.add(groupByColumn.newColumn().name()); - } - for (ColumnName columnName : keyRefs) { - doNotAgg.add(columnName.name()); } - return doNotAgg; + final List groupByList = Arrays.asList(groupByColumns); + final List tableColumns = + columns.keySet().stream().map(ColumnName::of).collect(Collectors.toList()); + final Optional agg = AggregateAllByTable.singleAggregation(key, groupByList, tableColumns); + final Table result = aggBy(agg.stream().collect(Collectors.toList()), groupByList); + key.walk(new AggAllByCopyAttributes(this, result)); + return result; } @Override public Table aggBy(final Collection aggregations, final Collection groupByColumns) { + if (aggregations.isEmpty()) { + return selectDistinct(groupByColumns); + } + final List optimized = - AggregationFactory.AggregationElement.optimizeAndConvert(aggregations, this); + AggregationFactory.AggregationElement.optimizeAndConvert(aggregations); final List optimizedOrder = optimized.stream() .map(AggregationFactory.AggregationElement::getResultPairs) @@ -3389,75 +3359,4 @@ public Table wouldMatch(WouldMatchPair... matchers) { return getResult(new WouldMatchOperation(this, matchers)); } - private static class CopyAttributes implements Key.Visitor { - - private final BaseTable parent; - private final Table result; - - public CopyAttributes(BaseTable parent, Table result) { - this.parent = Objects.requireNonNull(parent); - this.result = Objects.requireNonNull(result); - } - - @Override - public void visit(KeyAbsSum absSum) {} - - @Override - public void visit(KeyCountDistinct countDistinct) {} - - @Override - public void visit(KeyDistinct distinct) {} - - @Override - public void visit(KeyGroup group) {} - - @Override - public void visit(KeyAvg avg) {} - - @Override - public void visit(KeyFirst first) { - parent.copyAttributes(result, CopyAttributeOperation.FirstBy); - } - - @Override - public void visit(KeyLast last) { - parent.copyAttributes(result, CopyAttributeOperation.LastBy); - } - - @Override - public void visit(KeyMax max) {} - - @Override - public void visit(KeyMedian median) {} - - @Override - public void visit(KeyMin min) {} - - @Override - public void visit(KeyPct pct) {} - - @Override - public void visit(KeySortedFirst sortedFirst) {} - - @Override - public void visit(KeySortedLast sortedLast) {} - - @Override - public void visit(KeyStd std) {} - - @Override - public void visit(KeySum sum) {} - - @Override - public void visit(KeyUnique unique) {} - - @Override - public void visit(KeyWAvg wAvg) {} - - @Override - public void visit(KeyWSum wSum) {} - - @Override - public void visit(KeyVar var) {} - } } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java index da4d4049ee1..fb6e6973368 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java @@ -7,19 +7,6 @@ import io.deephaven.api.*; import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; import io.deephaven.api.filter.Filter; import io.deephaven.base.Pair; import io.deephaven.base.StringUtils; @@ -678,7 +665,7 @@ default Table join(Table rightTable, Collection columnsToMa @Override @ConcurrentMethod default Table groupBy(Collection groupByColumns) { - return aggAllBy(KeyGroup.of(), groupByColumns.toArray(Selectable[]::new)); + return aggAllBy(Key.group(), groupByColumns.toArray(Selectable[]::new)); } @Override @@ -781,7 +768,7 @@ default Table applyToAllBy(String formulaColumn, String... groupByColumns) { @Override @ConcurrentMethod default Table sumBy(Selectable... groupByColumns) { - return aggAllBy(KeySum.of(), groupByColumns); + return aggAllBy(Key.sum(), groupByColumns); } @Override @@ -805,7 +792,7 @@ default Table sumBy() { @Override @ConcurrentMethod default Table absSumBy(Selectable... groupByColumns) { - return aggAllBy(KeyAbsSum.of(), groupByColumns); + return aggAllBy(Key.absSum(), groupByColumns); } @Override @@ -829,7 +816,7 @@ default Table absSumBy() { @Override @ConcurrentMethod default Table avgBy(Selectable... groupByColumns) { - return aggAllBy(KeyAvg.of(), groupByColumns); + return aggAllBy(Key.avg(), groupByColumns); } @Override @@ -853,7 +840,7 @@ default Table avgBy() { @Override @ConcurrentMethod default Table wavgBy(String weightColumn, Selectable... groupByColumns) { - return aggAllBy(KeyWAvg.of(ColumnName.of(weightColumn)), groupByColumns); + return aggAllBy(Key.wavg(weightColumn), groupByColumns); } @Override @@ -877,7 +864,7 @@ default Table wavgBy(String weightColumn) { @Override @ConcurrentMethod default Table wsumBy(String weightColumn, Selectable... groupByColumns) { - return aggAllBy(KeyWSum.of(ColumnName.of(weightColumn)), groupByColumns); + return aggAllBy(Key.wsum(weightColumn), groupByColumns); } @Override @@ -901,7 +888,7 @@ default Table wsumBy(String weightColumn, Collection groupByColumns) { @Override @ConcurrentMethod default Table stdBy(Selectable... groupByColumns) { - return aggAllBy(KeyStd.of(), groupByColumns); + return aggAllBy(Key.std(), groupByColumns); } @Override @@ -925,7 +912,7 @@ default Table stdBy() { @Override @ConcurrentMethod default Table varBy(Selectable... groupByColumns) { - return aggAllBy(KeyVar.of(), groupByColumns); + return aggAllBy(Key.var(), groupByColumns); } @Override @@ -949,7 +936,7 @@ default Table varBy() { @Override @ConcurrentMethod default Table lastBy(Selectable... groupByColumns) { - return aggAllBy(KeyLast.of(), groupByColumns); + return aggAllBy(Key.last(), groupByColumns); } @Override @@ -973,7 +960,7 @@ default Table lastBy() { @Override @ConcurrentMethod default Table firstBy(Selectable... groupByColumns) { - return aggAllBy(KeyFirst.of(), groupByColumns); + return aggAllBy(Key.first(), groupByColumns); } @Override @@ -997,7 +984,7 @@ default Table firstBy() { @Override @ConcurrentMethod default Table minBy(Selectable... groupByColumns) { - return aggAllBy(KeyMin.of(), groupByColumns); + return aggAllBy(Key.min(), groupByColumns); } @Override @@ -1021,7 +1008,7 @@ default Table minBy() { @Override @ConcurrentMethod default Table maxBy(Selectable... groupByColumns) { - return aggAllBy(KeyMax.of(), groupByColumns); + return aggAllBy(Key.max(), groupByColumns); } @Override @@ -1045,7 +1032,7 @@ default Table maxBy() { @Override @ConcurrentMethod default Table medianBy(Selectable... groupByColumns) { - return aggAllBy(KeyMedian.of(), groupByColumns); + return aggAllBy(Key.median(), groupByColumns); } @Override diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java index 393d61d0eb0..3ee1741c2db 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java @@ -5,7 +5,6 @@ import io.deephaven.api.agg.KeyedAggregation; import io.deephaven.api.agg.KeyedAggregations; import io.deephaven.engine.table.MatchPair; -import io.deephaven.engine.table.impl.BaseTable; import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement; import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElementImpl; @@ -16,17 +15,12 @@ */ class AggregationElementAdapter implements Aggregation.Visitor { - public static AggregationElement of(Aggregation aggregation, BaseTable parent) { - return aggregation.walk(new AggregationElementAdapter(parent)).out(); + public static AggregationElement of(Aggregation aggregation) { + return aggregation.walk(new AggregationElementAdapter()).out(); } - private final BaseTable parent; private AggregationElement out; - public AggregationElementAdapter(BaseTable parent) { - this.parent = Objects.requireNonNull(parent); - } - public AggregationElement out() { return Objects.requireNonNull(out); } @@ -38,14 +32,14 @@ public void visit(Count count) { @Override public void visit(KeyedAggregation keyedAgg) { - final AggregationSpec spec = AggregationSpecAdapter.of(keyedAgg.key(), parent); + final AggregationSpec spec = AggregationSpecAdapter.of(keyedAgg.key()); final MatchPair pair = MatchPair.of(keyedAgg.pair()); out = new AggregationElementImpl(spec, pair); } @Override public void visit(KeyedAggregations keyedAggs) { - final AggregationSpec spec = AggregationSpecAdapter.of(keyedAggs.key(), parent); + final AggregationSpec spec = AggregationSpecAdapter.of(keyedAggs.key()); final MatchPair[] pairs = MatchPair.fromPairs(keyedAggs.pairs()); out = new AggregationElementImpl(spec, pairs); } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java index c69713647ba..a98c59febf8 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationFactory.java @@ -602,11 +602,10 @@ public interface AggregationElement { * Converts an {@link Aggregation} to an {@link AggregationElement}. * * @param aggregation The {@link Aggregation aggregation} - * @param parent The parent table * @return The {@link AggregationElement aggregation element} */ - static AggregationElement of(Aggregation aggregation, BaseTable parent) { - return AggregationElementAdapter.of(aggregation, parent); + static AggregationElement of(Aggregation aggregation) { + return AggregationElementAdapter.of(aggregation); } /** @@ -618,33 +617,30 @@ static AggregationElement of(Aggregation aggregation, BaseTable parent) { * {@code aggregations}. * * @param aggregations The {@link Aggregation aggregation} - * @param parent The parent table * @return A list of {@link AggregationElement aggregation elements} * @see AggregationOptimizer#of(Collection) - * @see #of(Aggregation, BaseTable) - * @see #convert(Collection, BaseTable) + * @see #of(Aggregation) + * @see #convert(Collection) */ - static List optimizeAndConvert(Collection aggregations, - BaseTable parent) { - return convert(AggregationOptimizer.of(aggregations), parent); + static List optimizeAndConvert(Collection aggregations) { + return convert(AggregationOptimizer.of(aggregations)); } /** - * Converts and the aggregations leaving singular aggregations as they are. + * Converts the aggregations leaving singular aggregations as they are. * *

* Note: The results will preserve the intended order of the inputs. * * @param aggregations The {@link Aggregation aggregation} - * @param parent The parent table * @return A list of {@link AggregationElement aggregation elements} - * @see #of(Aggregation, BaseTable) - * @see #optimizeAndConvert(Collection, BaseTable) + * @see #of(Aggregation) + * @see #optimizeAndConvert(Collection) */ - static List convert(Collection aggregations, BaseTable parent) { + static List convert(Collection aggregations) { final List out = new ArrayList<>(aggregations.size()); for (Aggregation aggregation : aggregations) { - out.add(AggregationElementAdapter.of(aggregation, parent)); + out.add(of(aggregation)); } return out; } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java index 2d1da9eab9d..0677627a48c 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java @@ -22,7 +22,6 @@ import io.deephaven.api.agg.key.KeyVar; import io.deephaven.api.agg.key.KeyWAvg; import io.deephaven.api.agg.key.KeyWSum; -import io.deephaven.engine.table.impl.BaseTable; import java.util.Objects; @@ -31,16 +30,12 @@ public class AggregationSpecAdapter implements Key.Visitor { - public static AggregationSpec of(Key key, BaseTable parent) { - return key.walk(new AggregationSpecAdapter(parent)).out(); + public static AggregationSpec of(Key key) { + return key.walk(new AggregationSpecAdapter()).out(); } - private BaseTable parent; private AggregationSpec out; - public AggregationSpecAdapter(BaseTable parent) { - this.parent = Objects.requireNonNull(parent); - } public AggregationSpec out() { return Objects.requireNonNull(out); @@ -83,7 +78,7 @@ public void visit(KeyLast last) { @Override public void visit(KeyMax max) { - out = new MinMaxBySpecImpl(false, parent.isAddOnly()); + out = new MinMaxBySpecImpl(false); } @Override @@ -93,7 +88,7 @@ public void visit(KeyMedian median) { @Override public void visit(KeyMin min) { - out = new MinMaxBySpecImpl(true, parent.isAddOnly()); + out = new MinMaxBySpecImpl(true); } @Override diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTableWriter.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTableWriter.java index baee2c4b5bf..b24c9b8edda 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTableWriter.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetTableWriter.java @@ -4,8 +4,7 @@ import io.deephaven.api.ColumnName; import io.deephaven.api.RawString; import io.deephaven.api.Selectable; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.Aggregation; import io.deephaven.engine.table.*; import io.deephaven.engine.table.impl.CodecLookup; import io.deephaven.vector.Vector; @@ -939,8 +938,7 @@ private static Table groupingAsTable(Table tableToSave, String columnName) { .view(List.of(Selectable.of(ColumnName.of(GROUPING_KEY), ColumnName.of(columnName)), Selectable.of(ColumnName.of(BEGIN_POS), RawString.of("ii")), // Range start, inclusive Selectable.of(ColumnName.of(END_POS), RawString.of("ii+1")))) // Range end, exclusive - .aggBy(List.of(KeyFirst.of().aggregation(ColumnName.of(BEGIN_POS)), - KeyLast.of().aggregation(ColumnName.of(END_POS))), + .aggBy(List.of(Aggregation.AggFirst(BEGIN_POS), Aggregation.AggLast(END_POS)), List.of(ColumnName.of(GROUPING_KEY))); final Table invalid = grouped.where(BEGIN_POS + " != 0 && " + BEGIN_POS + " != " + END_POS + "_[ii-1]"); if (!invalid.isEmpty()) { diff --git a/java-client/flight-examples/build.gradle b/java-client/flight-examples/build.gradle index 3cd147f50d5..c90c94226f7 100644 --- a/java-client/flight-examples/build.gradle +++ b/java-client/flight-examples/build.gradle @@ -42,6 +42,7 @@ applicationDistribution.into('bin') { from(createApplication('poll-tsv', 'io.deephaven.client.examples.PollTsv')) from(createApplication('list-tables', 'io.deephaven.client.examples.ListTables')) from(createApplication('excessive', 'io.deephaven.client.examples.ExampleExcessive')) + from(createApplication('aggregate-all', 'io.deephaven.client.examples.AggregateAllExample')) from(createApplication('do-put-new', 'io.deephaven.client.examples.DoPutNew')) from(createApplication('do-put-spray', 'io.deephaven.client.examples.DoPutSpray')) diff --git a/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java new file mode 100644 index 00000000000..fe45e62dceb --- /dev/null +++ b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java @@ -0,0 +1,151 @@ +package io.deephaven.client.examples; + +import io.deephaven.api.agg.key.Key; +import io.deephaven.client.impl.FlightSession; +import io.deephaven.client.impl.TableHandle; +import io.deephaven.qst.LabeledValue; +import io.deephaven.qst.LabeledValues; +import io.deephaven.qst.column.header.ColumnHeader; +import io.deephaven.qst.column.header.ColumnHeaders8; +import io.deephaven.qst.column.header.ColumnHeaders8.Rows; +import io.deephaven.qst.table.InMemoryKeyBackedInputTable; +import io.deephaven.qst.table.LabeledTables; +import io.deephaven.qst.table.LabeledTables.Builder; +import io.deephaven.qst.table.NewTable; +import io.deephaven.qst.table.TableHeader; +import io.deephaven.qst.table.TableSpec; +import picocli.CommandLine; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +@Command(name = "aggregate-all", mixinStandardHelpOptions = true, + description = "Aggregate all examples", version = "0.1.0") +class AggregateAllExample extends FlightExampleBase { + + private static List keys() { + return Arrays.asList( + Key.absSum(), + Key.avg(), + // Key.countDistinct(false), + // Key.countDistinct(true), + // Key.distinct(false), + // Key.distinct(true), + Key.first(), + Key.group(), + Key.last(), + Key.max(), + // Key.median(false), + Key.median(true), + Key.min(), + // Key.percentile(0.25, false), + // Key.percentile(0.25, true), + // Key.sortedFirst(...), + // Key.sortedLast(...), + Key.std(), + Key.sum(), + // Key.unique(false), + // Key.unique(true), + Key.var(), + Key.wavg("Z") + // Key.wsum("Z") + ); + } + + @Option(names = {"--input-table-size"}, description = "The input table size, default ${DEFAULT-VALUE}", + defaultValue = "1000") + int inputTableSize; + + @Option(names = {"--num-groups"}, description = "The number of groups, default ${DEFAULT-VALUE}", + defaultValue = "10") + int numGroups; + + @Option(names = {"--update-percentage"}, + description = "The update percentage per input table row per cycle, default ${DEFAULT-VALUE}", + defaultValue = "0.01") + double updatePercentage; + + @Option(names = {"--sleep-millis"}, description = "The sleep milliseconds between cycles, default ${DEFAULT-VALUE}", + defaultValue = "100") + long sleepMillis; + + @Override + protected void execute(FlightSession flight) throws Exception { + final ColumnHeader inputKey = ColumnHeader.ofInt("InputKey"); + final ColumnHeader groupKey = ColumnHeader.ofInt("GroupKey"); + final ColumnHeader u = ColumnHeader.ofByte("U"); + final ColumnHeader v = ColumnHeader.ofShort("V"); + final ColumnHeader w = ColumnHeader.ofInt("W"); + final ColumnHeader x = ColumnHeader.ofLong("X"); + final ColumnHeader y = ColumnHeader.ofFloat("Y"); + final ColumnHeader z = ColumnHeader.ofDouble("Z"); + + final Builder builder = LabeledTables.builder(); + + final TableSpec spec = InMemoryKeyBackedInputTable.of(TableHeader.of(inputKey, groupKey, u, v, w, x, y, z), + Collections.singletonList(inputKey.name())); + builder.putMap("base", spec); + // todo: countBy + for (Key key : keys()) { + final String name = key.toString() + .replace('=', '_') + .replace('{', '_') + .replace('}', '_') + .replace(' ', '_') + .replace('.', '_'); + final TableSpec tableSpec = spec.aggAllBy(key, groupKey.name()); + builder.putMap(name, tableSpec); + } + final LabeledTables tables = builder.build(); + + final LabeledValues results = flight.session().batch().execute(tables); + try { + for (LabeledValue result : results) { + flight.session().publish(result.name(), result.value()).get(5, TimeUnit.SECONDS); + } + + final ColumnHeaders8 headers = + inputKey.header(groupKey).header(u).header(v).header(w).header(x).header(y).header(z); + + final TableHandle base = results.get("base"); + + final Random random = new Random(); + + final int sizeGuess = (int) Math.round(inputTableSize * updatePercentage); + + while (true) { + final ColumnHeaders8.Rows rows = + headers.start(sizeGuess); + for (int i = 0; i < inputTableSize; ++i) { + if (random.nextDouble() > updatePercentage) { + continue; + } + final int group = random.nextInt(numGroups); + final byte u_ = (byte) random.nextInt(); + final short v_ = (short) random.nextInt(); + final int w_ = random.nextInt(); + final long x_ = random.nextLong(); + final float y_ = random.nextFloat(); + final double z_ = random.nextDouble(); + rows.row(i, group, u_, v_, w_, x_, y_, z_); + } + flight.addToInputTable(base, rows.newTable(), bufferAllocator); + Thread.sleep(sleepMillis); + } + } finally { + for (LabeledValue result : results) { + result.value().close(); + } + } + } + + public static void main(String[] args) { + int execute = new CommandLine(new AggregateAllExample()).execute(args); + System.exit(execute); + } +} diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java b/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java index 48cb42f5147..31a6305b450 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java @@ -84,6 +84,7 @@ import io.deephaven.proto.backplane.grpc.Ticket; import io.deephaven.proto.backplane.grpc.TimeTableRequest; import io.deephaven.proto.backplane.grpc.UnstructuredFilterTableRequest; +import io.deephaven.qst.table.AggregateAllByTable; import io.deephaven.qst.table.AggregationTable; import io.deephaven.qst.table.AsOfJoinTable; import io.deephaven.qst.table.ByTableBase; @@ -101,7 +102,6 @@ import io.deephaven.qst.table.ReverseAsOfJoinTable; import io.deephaven.qst.table.ReverseTable; import io.deephaven.qst.table.SelectTable; -import io.deephaven.qst.table.SingleAggregationTable; import io.deephaven.qst.table.SingleParentTable; import io.deephaven.qst.table.SnapshotTable; import io.deephaven.qst.table.SortTable; @@ -418,13 +418,13 @@ public void visit(SelectTable v) { } @Override - public void visit(SingleAggregationTable singleAggregationTable) { - out = op(Builder::setComboAggregate, singleAgg(singleAggregationTable)); + public void visit(AggregateAllByTable aggAllByTable) { + out = op(Builder::setComboAggregate, aggAllBy(aggAllByTable)); } @Override public void visit(AggregationTable aggregationTable) { - out = op(Builder::setComboAggregate, agg(aggregationTable)); + out = op(Builder::setComboAggregate, aggBy(aggregationTable)); } @Override @@ -476,14 +476,14 @@ private SelectOrUpdateRequest selectOrUpdate(SingleParentTable x, return builder.build(); } - private ComboAggregateRequest singleAgg(SingleAggregationTable agg) { + private ComboAggregateRequest aggAllBy(AggregateAllByTable agg) { // A single aggregate without any input/output is how the protocol knows this is an "aggregate all by" // as opposed to an AggregationTable with one agg. final Aggregate aggregate = agg.key().walk(new AggregateAdapter(Collections.emptyList())).out(); return groupByColumns(agg).addAggregates(aggregate).build(); } - private ComboAggregateRequest agg(AggregationTable agg) { + private ComboAggregateRequest aggBy(AggregationTable agg) { ComboAggregateRequest.Builder builder = groupByColumns(agg); for (Aggregation aggregation : agg.aggregations()) { builder.addAggregates(AggregationAdapter.of(aggregation)); @@ -495,7 +495,7 @@ private ComboAggregateRequest.Builder groupByColumns(ByTableBase base) { ComboAggregateRequest.Builder builder = ComboAggregateRequest.newBuilder() .setResultId(ticket) .setSourceId(ref(base.parent())); - for (Selectable column : base.columns()) { + for (Selectable column : base.groupByColumns()) { builder.addGroupByColumns(Strings.of(column)); } return builder; diff --git a/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java b/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java index 393d9b371aa..af4d4f2917a 100644 --- a/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java +++ b/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java @@ -1,27 +1,7 @@ package io.deephaven.graphviz; -import io.deephaven.api.SortColumn; import io.deephaven.api.Strings; -import io.deephaven.api.agg.key.Key.Visitor; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; +import io.deephaven.qst.table.AggregateAllByTable; import io.deephaven.qst.table.AggregationTable; import io.deephaven.qst.table.AsOfJoinTable; import io.deephaven.qst.table.EmptyTable; @@ -37,7 +17,6 @@ import io.deephaven.qst.table.ReverseAsOfJoinTable; import io.deephaven.qst.table.SelectTable; import io.deephaven.qst.table.SelectableTable; -import io.deephaven.qst.table.SingleAggregationTable; import io.deephaven.qst.table.TableSpec; import io.deephaven.qst.table.TableVisitorGeneric; import io.deephaven.qst.table.TailTable; @@ -52,7 +31,6 @@ import java.util.Iterator; import java.util.Objects; import java.util.function.Function; -import java.util.stream.Collectors; public class LabelBuilder extends TableVisitorGeneric { @@ -157,162 +135,18 @@ public void visit(WhereTable whereTable) { } @Override - public void visit(SingleAggregationTable singleAggregationTable) { - singleAggregationTable.key().walk(new Visitor() { - @Override - public void visit(KeyAbsSum absSum) { - sb.append("absSumBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyCountDistinct countDistinct) { - sb.append("countDistinctBy("); - sb.append(countDistinct.countNulls()).append(','); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyDistinct distinct) { - sb.append("distinctBy("); - sb.append(distinct.includeNulls()).append(','); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyGroup group) { - sb.append("groupBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyAvg avg) { - sb.append("avgBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyFirst first) { - sb.append("firstBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyLast last) { - sb.append("lastBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyMax max) { - sb.append("maxBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyMedian median) { - sb.append("medianBy("); - sb.append(median.averageMedian()).append(','); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyMin min) { - sb.append("minBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyPct pct) { - sb.append("pctBy("); - sb.append(pct.percentile()).append(','); - sb.append(pct.averageMedian()).append(','); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeySortedFirst sortedFirst) { - sb.append("sortedFirstBy(["); - append(Strings::of, sortedFirst.columns().stream().map(SortColumn::column).collect(Collectors.toList()), - sb); - sb.append("],"); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeySortedLast sortedLast) { - sb.append("sortedLastBy(["); - append(Strings::of, sortedLast.columns().stream().map(SortColumn::column).collect(Collectors.toList()), - sb); - sb.append("],"); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyStd std) { - sb.append("stdBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeySum sum) { - sb.append("sumBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyUnique unique) { - sb.append("uniqueBy("); - sb.append(unique.includeNulls()).append(','); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyWAvg wAvg) { - sb.append("wavgBy("); - sb.append(wAvg.weight().name()).append(','); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyWSum wSum) { - sb.append("wsumBy("); - sb.append(wSum.weight().name()).append(','); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - - @Override - public void visit(KeyVar var) { - sb.append("varBy("); - append(Strings::of, singleAggregationTable.columns(), sb); - sb.append(')'); - } - }); + public void visit(AggregateAllByTable aggAllByTable) { + sb.append("aggAllBy("); + sb.append(aggAllByTable.key()).append(','); + append(Strings::of, aggAllByTable.groupByColumns(), sb); + sb.append(')'); } @Override public void visit(AggregationTable aggregationTable) { // TODO(deephaven-core#1116): Add labeling, or structuring, for qst graphviz aggregations - sb.append("groupBy(["); - append(Strings::of, aggregationTable.columns(), sb); + sb.append("aggBy(["); + append(Strings::of, aggregationTable.groupByColumns(), sb); sb.append("],[ todo ])"); } diff --git a/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java b/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java index 8f5cff896ab..f1078d4d6d9 100644 --- a/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java +++ b/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java @@ -1,32 +1,14 @@ package io.deephaven.qst; +import io.deephaven.api.Selectable; import io.deephaven.api.TableOperations; import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; import io.deephaven.qst.TableAdapterResults.Output; +import io.deephaven.qst.table.AggregateAllByTable; import io.deephaven.qst.table.AggregationTable; import io.deephaven.qst.table.AsOfJoinTable; import io.deephaven.qst.table.EmptyTable; import io.deephaven.qst.table.ExactJoinTable; -import io.deephaven.qst.table.SingleAggregationTable; import io.deephaven.qst.table.HeadTable; import io.deephaven.qst.table.InputTable; import io.deephaven.qst.table.JoinTable; @@ -255,110 +237,16 @@ public void visit(ReverseAsOfJoinTable raj) { } @Override - public void visit(SingleAggregationTable singleAggregationTable) { - singleAggregationTable.key().walk(new Key.Visitor() { - @Override - public void visit(KeyAbsSum absSum) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyCountDistinct countDistinct) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyDistinct distinct) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyGroup group) { - addOp(singleAggregationTable, - parentOps(singleAggregationTable).groupBy(singleAggregationTable.columns())); - } - - @Override - public void visit(KeyAvg avg) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyFirst first) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyLast last) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyMax max) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyMedian median) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyMin min) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyPct pct) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeySortedFirst sortedFirst) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeySortedLast sortedLast) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyStd std) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeySum sum) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyUnique unique) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyWAvg wAvg) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyWSum wSum) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - - @Override - public void visit(KeyVar var) { - throw new UnsupportedOperationException("TODO(deephaven-core#1617): TableAPI: Aggregation coverage"); - } - }); + public void visit(AggregateAllByTable aggAllByTable) { + final Key key = aggAllByTable.key(); + final Selectable[] groupByColumns = aggAllByTable.groupByColumns().toArray(new Selectable[0]); + addOp(aggAllByTable, parentOps(aggAllByTable).aggAllBy(key, groupByColumns)); } @Override public void visit(AggregationTable aggregationTable) { addOp(aggregationTable, - parentOps(aggregationTable).aggBy(aggregationTable.aggregations(), aggregationTable.columns())); + parentOps(aggregationTable).aggBy(aggregationTable.aggregations(), aggregationTable.groupByColumns())); } @Override diff --git a/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java b/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java new file mode 100644 index 00000000000..ac60ec34870 --- /dev/null +++ b/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java @@ -0,0 +1,146 @@ +package io.deephaven.qst.table; + +import io.deephaven.api.ColumnName; +import io.deephaven.api.Selectable; +import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.key.Key.Visitor; +import io.deephaven.api.agg.key.KeyAbsSum; +import io.deephaven.api.agg.key.KeyAvg; +import io.deephaven.api.agg.key.KeyCountDistinct; +import io.deephaven.api.agg.key.KeyDistinct; +import io.deephaven.api.agg.key.KeyFirst; +import io.deephaven.api.agg.key.KeyGroup; +import io.deephaven.api.agg.key.KeyLast; +import io.deephaven.api.agg.key.KeyMax; +import io.deephaven.api.agg.key.KeyMedian; +import io.deephaven.api.agg.key.KeyMin; +import io.deephaven.api.agg.key.KeyPct; +import io.deephaven.api.agg.key.KeySortedFirst; +import io.deephaven.api.agg.key.KeySortedLast; +import io.deephaven.api.agg.key.KeyStd; +import io.deephaven.api.agg.key.KeySum; +import io.deephaven.api.agg.key.KeyUnique; +import io.deephaven.api.agg.key.KeyVar; +import io.deephaven.api.agg.key.KeyWAvg; +import io.deephaven.api.agg.key.KeyWSum; + +import java.util.Collection; +import java.util.Collections; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Computes the columns to exclude from aggregation output + */ +final class AggAllByExclusions implements Visitor { + + public static Set of(Key key, Collection groupByColumns) { + final Set exclusions = + groupByColumns.stream().map(Selectable::newColumn).collect(Collectors.toSet()); + final Set otherExclusions = key.walk(new AggAllByExclusions()).out(); + exclusions.addAll(otherExclusions); + return exclusions; + } + + private Set out; + + public Set out() { + return Objects.requireNonNull(out); + } + + @Override + public void visit(KeyAbsSum absSum) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyCountDistinct countDistinct) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyDistinct distinct) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyGroup group) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyAvg avg) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyFirst first) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyLast last) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyMax max) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyMedian median) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyMin min) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyPct pct) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeySortedFirst sortedFirst) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeySortedLast sortedLast) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyStd std) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeySum sum) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyUnique unique) { + out = Collections.emptySet(); + } + + @Override + public void visit(KeyWAvg wAvg) { + out = Collections.singleton(wAvg.weight()); + } + + @Override + public void visit(KeyWSum wSum) { + out = Collections.singleton(wSum.weight()); + } + + @Override + public void visit(KeyVar var) { + out = Collections.emptySet(); + } +} diff --git a/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java b/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java new file mode 100644 index 00000000000..6bf0b2b009a --- /dev/null +++ b/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java @@ -0,0 +1,73 @@ +package io.deephaven.qst.table; + +import io.deephaven.annotations.NodeStyle; +import io.deephaven.api.ColumnName; +import io.deephaven.api.Selectable; +import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.key.Key; +import org.immutables.value.Value.Immutable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +@Immutable +@NodeStyle +public abstract class AggregateAllByTable extends ByTableBase { + + public static Builder builder() { + return ImmutableAggregateAllByTable.builder(); + } + + /** + * Computes the single-aggregation from the agg-all implied by the {@code key} and {@code groupByColumns} by + * removing the {@code groupByColumns} and any extra columns implied by the {@code key}. + * + * @param key the key + * @param groupByColumns the group by columns + * @param tableColumns the table columns + * @return the aggregation, if non-empty + */ + public static Optional singleAggregation( + Key key, Collection groupByColumns, Collection tableColumns) { + Set exclusions = AggAllByExclusions.of(key, groupByColumns); + List columnsToAgg = new ArrayList<>(tableColumns.size()); + for (ColumnName column : tableColumns) { + if (exclusions.contains(column)) { + continue; + } + columnsToAgg.add(column); + } + return columnsToAgg.isEmpty() ? Optional.empty() : Optional.of(key.aggregation(columnsToAgg)); + } + + public abstract Key key(); + + /** + * Transform {@code this} agg-all-by table into an {@link AggregationTable} by constructing the necessary + * {@link Aggregation} from the {@code key} and {@code tableColumns}. + * + * @param tableColumns the table columns + * @return the aggregation table + * @see #singleAggregation(Key, Collection, Collection) + */ + public final AggregationTable asAggregation(Collection tableColumns) { + AggregationTable.Builder builder = AggregationTable.builder() + .parent(parent()) + .addAllGroupByColumns(groupByColumns()); + singleAggregation(key(), groupByColumns(), tableColumns).ifPresent(builder::addAggregations); + return builder.build(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } + + public interface Builder extends ByTableBase.Builder { + Builder key(Key key); + } +} diff --git a/qst/src/main/java/io/deephaven/qst/table/ByTableBase.java b/qst/src/main/java/io/deephaven/qst/table/ByTableBase.java index fb45223b743..18ed5bc5ca6 100644 --- a/qst/src/main/java/io/deephaven/qst/table/ByTableBase.java +++ b/qst/src/main/java/io/deephaven/qst/table/ByTableBase.java @@ -8,16 +8,16 @@ public abstract class ByTableBase extends TableBase implements SingleParentTable public abstract TableSpec parent(); - public abstract List columns(); + public abstract List groupByColumns(); interface Builder> { SELF parent(TableSpec parent); - SELF addColumns(Selectable element); + SELF addGroupByColumns(Selectable element); - SELF addColumns(Selectable... elements); + SELF addGroupByColumns(Selectable... elements); - SELF addAllColumns(Iterable elements); + SELF addAllGroupByColumns(Iterable elements); BY build(); } diff --git a/qst/src/main/java/io/deephaven/qst/table/ParentsVisitor.java b/qst/src/main/java/io/deephaven/qst/table/ParentsVisitor.java index 0b2385a7382..74e4cfcddc4 100644 --- a/qst/src/main/java/io/deephaven/qst/table/ParentsVisitor.java +++ b/qst/src/main/java/io/deephaven/qst/table/ParentsVisitor.java @@ -245,8 +245,8 @@ public void visit(UpdateTable updateTable) { } @Override - public void visit(SingleAggregationTable singleAggregationTable) { - out = single(singleAggregationTable); + public void visit(AggregateAllByTable aggAllByTable) { + out = single(aggAllByTable); } @Override diff --git a/qst/src/main/java/io/deephaven/qst/table/SingleAggregationTable.java b/qst/src/main/java/io/deephaven/qst/table/SingleAggregationTable.java deleted file mode 100644 index a3523b85059..00000000000 --- a/qst/src/main/java/io/deephaven/qst/table/SingleAggregationTable.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.deephaven.qst.table; - -import io.deephaven.annotations.NodeStyle; -import io.deephaven.api.agg.key.Key; -import org.immutables.value.Value.Immutable; - -@Immutable -@NodeStyle -public abstract class SingleAggregationTable extends ByTableBase { - - public static Builder builder() { - return ImmutableSingleAggregationTable.builder(); - } - - public abstract Key key(); - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } - - public interface Builder extends ByTableBase.Builder { - Builder key(Key key); - } -} diff --git a/qst/src/main/java/io/deephaven/qst/table/TableBase.java b/qst/src/main/java/io/deephaven/qst/table/TableBase.java index c02c3290ba6..4e8e3addfc1 100644 --- a/qst/src/main/java/io/deephaven/qst/table/TableBase.java +++ b/qst/src/main/java/io/deephaven/qst/table/TableBase.java @@ -10,7 +10,6 @@ import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyGroup; import io.deephaven.api.filter.Filter; import io.deephaven.qst.TableCreationLogic; @@ -25,7 +24,6 @@ public abstract class TableBase implements TableSpec { // necessary TableSpec instead of delegating to other methods. The default values are the // responsibility of the TableSpec. - @Override public final TableCreationLogic logic() { return new TableCreationLogicImpl(this); @@ -404,40 +402,40 @@ public final SelectTable select(Collection columns) { } @Override - public final SingleAggregationTable groupBy() { - return aggAllBy(KeyGroup.of()); + public final AggregateAllByTable groupBy() { + return aggAllBy(Key.group()); } @Override - public final SingleAggregationTable groupBy(String... groupByColumns) { - return aggAllBy(KeyGroup.of(), groupByColumns); + public final AggregateAllByTable groupBy(String... groupByColumns) { + return aggAllBy(Key.group(), groupByColumns); } @Override - public final SingleAggregationTable groupBy(Collection groupByColumns) { - return aggAllBy(KeyGroup.of(), groupByColumns.toArray(new Selectable[0])); + public final AggregateAllByTable groupBy(Collection groupByColumns) { + return aggAllBy(Key.group(), groupByColumns.toArray(new Selectable[0])); } @Override - public final SingleAggregationTable aggAllBy(Key key) { - return SingleAggregationTable.builder().parent(this).key(key).build(); + public final AggregateAllByTable aggAllBy(Key key) { + return AggregateAllByTable.builder().parent(this).key(key).build(); } @Override - public final SingleAggregationTable aggAllBy(Key key, String... groupByColumns) { + public final AggregateAllByTable aggAllBy(Key key, String... groupByColumns) { return aggAllBy(key, Arrays.asList(groupByColumns)); } @Override - public final SingleAggregationTable aggAllBy(Key key, Selectable... groupByColumns) { - return SingleAggregationTable.builder().parent(this).key(key).addColumns(groupByColumns).build(); + public final AggregateAllByTable aggAllBy(Key key, Selectable... groupByColumns) { + return AggregateAllByTable.builder().parent(this).key(key).addGroupByColumns(groupByColumns).build(); } @Override - public final SingleAggregationTable aggAllBy(Key key, Collection groupByColumns) { - SingleAggregationTable.Builder builder = SingleAggregationTable.builder().parent(this).key(key); + public final AggregateAllByTable aggAllBy(Key key, Collection groupByColumns) { + AggregateAllByTable.Builder builder = AggregateAllByTable.builder().parent(this).key(key); for (String groupByColumn : groupByColumns) { - builder.addColumns(Selectable.parse(groupByColumn)); + builder.addGroupByColumns(Selectable.parse(groupByColumn)); } return builder.build(); } @@ -451,14 +449,14 @@ public final AggregationTable aggBy(Aggregation aggregation) { public final AggregationTable aggBy(Aggregation aggregation, String... groupByColumns) { final AggregationTable.Builder builder = AggregationTable.builder().parent(this); for (String groupByColumn : groupByColumns) { - builder.addColumns(Selectable.parse(groupByColumn)); + builder.addGroupByColumns(Selectable.parse(groupByColumn)); } return builder.addAggregations(aggregation).build(); } @Override public final AggregationTable aggBy(Aggregation aggregation, Collection groupByColumns) { - return AggregationTable.builder().parent(this).addAllColumns(groupByColumns) + return AggregationTable.builder().parent(this).addAllGroupByColumns(groupByColumns) .addAggregations(aggregation).build(); } @@ -471,7 +469,7 @@ public final AggregationTable aggBy(Collection aggregatio public final AggregationTable aggBy(Collection aggregations, String... groupByColumns) { final AggregationTable.Builder builder = AggregationTable.builder().parent(this); for (String groupByColumn : groupByColumns) { - builder.addColumns(Selectable.parse(groupByColumn)); + builder.addGroupByColumns(Selectable.parse(groupByColumn)); } return builder.addAllAggregations(aggregations).build(); } @@ -479,7 +477,7 @@ public final AggregationTable aggBy(Collection aggregatio @Override public final AggregationTable aggBy(Collection aggregations, Collection groupByColumns) { - return AggregationTable.builder().parent(this).addAllColumns(groupByColumns) + return AggregationTable.builder().parent(this).addAllGroupByColumns(groupByColumns) .addAllAggregations(aggregations).build(); } diff --git a/qst/src/main/java/io/deephaven/qst/table/TableSpec.java b/qst/src/main/java/io/deephaven/qst/table/TableSpec.java index 446de18092e..56d079e0dad 100644 --- a/qst/src/main/java/io/deephaven/qst/table/TableSpec.java +++ b/qst/src/main/java/io/deephaven/qst/table/TableSpec.java @@ -143,7 +143,7 @@ interface Visitor { void visit(AggregationTable aggregationTable); - void visit(SingleAggregationTable singleAggregationTable); + void visit(AggregateAllByTable aggAllByTable); void visit(TicketTable ticketTable); diff --git a/qst/src/main/java/io/deephaven/qst/table/TableVisitorGeneric.java b/qst/src/main/java/io/deephaven/qst/table/TableVisitorGeneric.java index 96a81639929..1a1b42f443a 100644 --- a/qst/src/main/java/io/deephaven/qst/table/TableVisitorGeneric.java +++ b/qst/src/main/java/io/deephaven/qst/table/TableVisitorGeneric.java @@ -115,8 +115,8 @@ public void visit(UpdateTable updateTable) { } @Override - public void visit(SingleAggregationTable singleAggregationTable) { - accept(singleAggregationTable); + public void visit(AggregateAllByTable aggAllByTable) { + accept(aggAllByTable); } @Override diff --git a/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java b/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java index 596359946b1..9e98384c911 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java +++ b/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java @@ -1,28 +1,7 @@ package io.deephaven.api.agg; -import io.deephaven.api.ColumnName; -import io.deephaven.api.SortColumn; import io.deephaven.api.agg.KeyedAggregations.Builder; import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; import java.io.Serializable; import java.util.Collection; @@ -41,7 +20,10 @@ static KeyedAggregation of(Key key, String pair) { return KeyedAggregation.of(key, Pair.parse(pair)); } - static KeyedAggregations of(Key key, String... pairs) { + static Aggregation of(Key key, String... pairs) { + if (pairs.length == 1) { + return of(key, pairs[0]); + } final Builder builder = KeyedAggregations.builder().key(key); for (String pair : pairs) { builder.addPairs(Pair.parse(pair)); @@ -49,232 +31,112 @@ static KeyedAggregations of(Key key, String... pairs) { return builder.build(); } - static Aggregation AggAbsSum(String pair) { - return of(KeyAbsSum.of(), pair); - } - static Aggregation AggAbsSum(String... pairs) { - return of(KeyAbsSum.of(), pairs); - } - - static Aggregation AggGroup(String pair) { - return of(KeyGroup.of(), pair); - } - - static Aggregation AggGroup(String... pairs) { - return of(KeyGroup.of(), pairs); - } - - static Aggregation AggAvg(String pair) { - return of(KeyAvg.of(), pair); + return of(Key.absSum(), pairs); } static Aggregation AggAvg(String... pairs) { - return of(KeyAvg.of(), pairs); + return of(Key.avg(), pairs); } static Aggregation AggCount(String resultColumn) { return Count.of(resultColumn); } - static Aggregation AggCountDistinct(String pair) { - return of(KeyCountDistinct.of(), pair); - } - static Aggregation AggCountDistinct(String... pairs) { - return of(KeyCountDistinct.of(), pairs); - } - - static Aggregation AggCountDistinct(boolean countNulls, String pair) { - return of(KeyCountDistinct.of(countNulls), pair); + return of(Key.countDistinct(), pairs); } static Aggregation AggCountDistinct(boolean countNulls, String... pairs) { - return of(KeyCountDistinct.of(countNulls), pairs); - } - - static Aggregation AggDistinct(String pair) { - return of(KeyDistinct.of(), pair); + return of(Key.countDistinct(countNulls), pairs); } static Aggregation AggDistinct(String... pairs) { - return of(KeyDistinct.of(), pairs); - } - - static Aggregation AggDistinct(boolean includeNulls, String pair) { - return of(KeyDistinct.of(includeNulls), pair); + return of(Key.distinct(), pairs); } static Aggregation AggDistinct(boolean includeNulls, String... pairs) { - return of(KeyDistinct.of(includeNulls), pairs); - } - - static Aggregation AggFirst(String pair) { - return of(KeyFirst.of(), pair); + return of(Key.distinct(includeNulls), pairs); } static Aggregation AggFirst(String... pairs) { - return of(KeyFirst.of(), pairs); + return of(Key.first(), pairs); } - static Aggregation AggLast(String pair) { - return of(KeyLast.of(), pair); + static Aggregation AggGroup(String... pairs) { + return of(Key.group(), pairs); } static Aggregation AggLast(String... pairs) { - return of(KeyLast.of(), pairs); - } - - static Aggregation AggMax(String pair) { - return of(KeyMax.of(), pair); + return of(Key.last(), pairs); } static Aggregation AggMax(String... pairs) { - return of(KeyMax.of(), pairs); - } - - static Aggregation AggMed(String pair) { - return of(KeyMedian.of(), pair); + return of(Key.max(), pairs); } static Aggregation AggMed(String... pairs) { - return of(KeyMedian.of(), pairs); - } - - static Aggregation AggMed(boolean average, String pair) { - return of(KeyMedian.of(average), pair); + return of(Key.median(), pairs); } static Aggregation AggMed(boolean average, String... pairs) { - return of(KeyMedian.of(average), pairs); - } - - static Aggregation AggMin(String pair) { - return of(KeyMin.of(), pair); + return of(Key.median(average), pairs); } static Aggregation AggMin(String... pairs) { - return of(KeyMin.of(), pairs); - } - - static Aggregation AggPct(double percentile, String pair) { - return of(KeyPct.of(percentile), pair); + return of(Key.min(), pairs); } static Aggregation AggPct(double percentile, String... pairs) { - return of(KeyPct.of(percentile), pairs); - } - - static Aggregation AggPct(double percentile, boolean average, String pair) { - return of(KeyPct.of(percentile, average), pair); + return of(Key.percentile(percentile), pairs); } static Aggregation AggPct(double percentile, boolean average, String... pairs) { - return of(KeyPct.of(percentile, average), pairs); - } - - static Aggregation AggSortedFirst(String sortedColumn, String pair) { - return of(KeySortedFirst.builder().addColumns(SortColumn.asc(ColumnName.of(sortedColumn))).build(), pair); + return of(Key.percentile(percentile, average), pairs); } static Aggregation AggSortedFirst(String sortedColumn, String... pairs) { - return of(KeySortedFirst.builder().addColumns(SortColumn.asc(ColumnName.of(sortedColumn))).build(), pairs); - } - - static Aggregation AggSortedFirst(Collection sortedColumns, String pair) { - final KeySortedFirst.Builder builder = KeySortedFirst.builder(); - for (String sortedColumn : sortedColumns) { - builder.addColumns(SortColumn.asc(ColumnName.of(sortedColumn))); - } - return of(builder.build(), pair); + return of(Key.sortedFirst(sortedColumn), pairs); } static Aggregation AggSortedFirst(Collection sortedColumns, String... pairs) { - final KeySortedFirst.Builder builder = KeySortedFirst.builder(); - for (String sortedColumn : sortedColumns) { - builder.addColumns(SortColumn.asc(ColumnName.of(sortedColumn))); - } - return of(builder.build(), pairs); - } - - static Aggregation AggSortedLast(String sortedColumn, String pair) { - return of(KeySortedLast.builder().addColumns(SortColumn.asc(ColumnName.of(sortedColumn))).build(), pair); + return of(Key.sortedFirst(sortedColumns), pairs); } static Aggregation AggSortedLast(String sortedColumn, String... pairs) { - return of(KeySortedLast.builder().addColumns(SortColumn.asc(ColumnName.of(sortedColumn))).build(), pairs); - } - - static Aggregation AggSortedLast(Collection sortedColumns, String pair) { - final KeySortedLast.Builder builder = KeySortedLast.builder(); - for (String sortedColumn : sortedColumns) { - builder.addColumns(SortColumn.asc(ColumnName.of(sortedColumn))); - } - return of(builder.build(), pair); + return of(Key.sortedLast(sortedColumn), pairs); } static Aggregation AggSortedLast(Collection sortedColumns, String... pairs) { - final KeySortedLast.Builder builder = KeySortedLast.builder(); - for (String sortedColumn : sortedColumns) { - builder.addColumns(SortColumn.asc(ColumnName.of(sortedColumn))); - } - return of(builder.build(), pairs); - } - - static Aggregation AggStd(String pair) { - return of(KeyStd.of(), pair); + return of(Key.sortedLast(sortedColumns), pairs); } static Aggregation AggStd(String... pairs) { - return of(KeyStd.of(), pairs); - } - - static Aggregation AggSum(String pair) { - return of(KeySum.of(), pair); + return of(Key.std(), pairs); } static Aggregation AggSum(String... pairs) { - return of(KeySum.of(), pairs); - } - - static Aggregation AggUnique(String pair) { - return of(KeyUnique.of(), pair); + return of(Key.sum(), pairs); } static Aggregation AggUnique(String... pairs) { - return of(KeyUnique.of(), pairs); - } - - static Aggregation AggUnique(boolean includeNulls, String pair) { - return of(KeyUnique.of(includeNulls), pair); + return of(Key.unique(), pairs); } static Aggregation AggUnique(boolean includeNulls, String... pairs) { - return of(KeyUnique.of(includeNulls), pairs); - } - - static Aggregation AggVar(String pair) { - return of(KeyVar.of(), pair); + return of(Key.unique(includeNulls), pairs); } static Aggregation AggVar(String... pairs) { - return of(KeyVar.of(), pairs); - } - - static Aggregation AggWAvg(String weightColumn, String pair) { - return of(KeyWAvg.of(ColumnName.of(weightColumn)), pair); + return of(Key.var(), pairs); } static Aggregation AggWAvg(String weightColumn, String... pairs) { - return of(KeyWAvg.of(ColumnName.of(weightColumn)), pairs); - } - - static Aggregation AggWSum(String weightColumn, String pair) { - return of(KeyWSum.of(ColumnName.of(weightColumn)), pair); + return of(Key.wavg(weightColumn), pairs); } static Aggregation AggWSum(String weightColumn, String... pairs) { - return of(KeyWSum.of(ColumnName.of(weightColumn)), pairs); + return of(Key.wsum(weightColumn), pairs); } V walk(V visitor); diff --git a/table-api/src/main/java/io/deephaven/api/agg/Pair.java b/table-api/src/main/java/io/deephaven/api/agg/Pair.java index f63be5fbcfc..cc5161a4ea5 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/Pair.java +++ b/table-api/src/main/java/io/deephaven/api/agg/Pair.java @@ -5,7 +5,10 @@ import java.io.Serializable; /** - * A pair represents an {@link #input() input} and an {@link #output() output} column for a {@link KeyedAggregation}. + * A column pair represents an {@link #input() input} and an {@link #output() output} column. + * + * @see KeyedAggregation + * @see KeyedAggregations */ public interface Pair extends Serializable { diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/Key.java b/table-api/src/main/java/io/deephaven/api/agg/key/Key.java index 70d4be19884..3b8a4e1d506 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/Key.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/Key.java @@ -1,9 +1,12 @@ package io.deephaven.api.agg.key; +import io.deephaven.api.ColumnName; +import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.KeyedAggregation; import io.deephaven.api.agg.Pair; +import java.util.Arrays; import java.util.Collection; /** @@ -11,6 +14,118 @@ */ public interface Key { + static KeyAbsSum absSum() { + return KeyAbsSum.of(); + } + + static KeyAvg avg() { + return KeyAvg.of(); + } + + static KeyCountDistinct countDistinct() { + return KeyCountDistinct.of(); + } + + static KeyCountDistinct countDistinct(boolean countNulls) { + return KeyCountDistinct.of(countNulls); + } + + static KeyDistinct distinct() { + return KeyDistinct.of(); + } + + static KeyDistinct distinct(boolean includeNulls) { + return KeyDistinct.of(includeNulls); + } + + static KeyFirst first() { + return KeyFirst.of(); + } + + static KeyGroup group() { + return KeyGroup.of(); + } + + static KeyLast last() { + return KeyLast.of(); + } + + static KeyMax max() { + return KeyMax.of(); + } + + static KeyMedian median() { + return KeyMedian.of(); + } + + static KeyMedian median(boolean averageMedian) { + return KeyMedian.of(averageMedian); + } + + static KeyMin min() { + return KeyMin.of(); + } + + static KeyPct percentile(double percentile) { + return KeyPct.of(percentile); + } + + static KeyPct percentile(double percentile, boolean averageMedian) { + return KeyPct.of(percentile, averageMedian); + } + + static KeySortedFirst sortedFirst(String... columns) { + return sortedFirst(Arrays.asList(columns)); + } + + static KeySortedFirst sortedFirst(Collection columns) { + final KeySortedFirst.Builder builder = KeySortedFirst.builder(); + for (String column : columns) { + builder.addColumns(SortColumn.asc(ColumnName.of(column))); + } + return builder.build(); + } + + static KeySortedLast sortedLast(String... columns) { + return sortedLast(Arrays.asList(columns)); + } + + static KeySortedLast sortedLast(Collection columns) { + final KeySortedLast.Builder builder = KeySortedLast.builder(); + for (String column : columns) { + builder.addColumns(SortColumn.asc(ColumnName.of(column))); + } + return builder.build(); + } + + static KeyStd std() { + return KeyStd.of(); + } + + static KeySum sum() { + return KeySum.of(); + } + + static KeyUnique unique() { + return KeyUnique.of(); + } + + static KeyUnique unique(boolean includeNulls) { + return KeyUnique.of(includeNulls); + } + + static KeyVar var() { + return KeyVar.of(); + } + + static KeyWAvg wavg(String weightColumn) { + return KeyWAvg.of(ColumnName.of(weightColumn)); + } + + static KeyWSum wsum(String weightColumn) { + return KeyWSum.of(ColumnName.of(weightColumn)); + } + KeyedAggregation aggregation(Pair pair); Aggregation aggregation(Pair... pairs); diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyColumnReferences.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyColumns.java similarity index 95% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyColumnReferences.java rename to table-api/src/main/java/io/deephaven/api/agg/key/KeyColumns.java index 46aad94eb58..1cbee996575 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyColumnReferences.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyColumns.java @@ -8,10 +8,10 @@ import java.util.Set; import java.util.stream.Collectors; -public final class KeyColumnReferences implements Key.Visitor { +public class KeyColumns implements Key.Visitor { public static Set of(Key key) { - return key.walk(new KeyColumnReferences()).out(); + return key.walk(new KeyColumns()).out(); } private Set out; diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java index 80887250237..efd12538e0b 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java @@ -1,10 +1,8 @@ package io.deephaven.api.agg.key; import io.deephaven.annotations.BuildableStyle; -import io.deephaven.annotations.SimpleStyle; import org.immutables.value.Value.Default; import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; @Immutable @BuildableStyle diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java index ddc543bd234..83b8e8ed915 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java +++ b/table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java @@ -24,13 +24,6 @@ public boolean averageMedian() { return false; } - public KeyPct withAverage() { - return ImmutableKeyPct.builder() - .percentile(percentile()) - .averageMedian(true) - .build(); - } - @Override public final V walk(V visitor) { visitor.visit(this); From dd81714fd5b66ad5a28b04a625809543e3281e2d Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 2 Dec 2021 13:09:32 -0800 Subject: [PATCH 14/20] rename --- .../java/io/deephaven/engine/table/Table.java | 10 +- .../table/impl/AggAllByCopyAttributes.java | 80 ++++---- .../engine/table/impl/HierarchicalTable.java | 6 +- .../engine/table/impl/QueryTable.java | 13 +- .../engine/table/impl/TableWithDefaults.java | 40 ++-- .../engine/table/impl/UncoalescedTable.java | 6 +- .../impl/by/AggregationElementAdapter.java | 16 +- .../table/impl/by/AggregationSpecAdapter.java | 82 ++++---- .../client/examples/AggregateAllExample.java | 32 ++-- .../client/impl/BatchTableRequestBuilder.java | 96 +++++----- .../io/deephaven/graphviz/LabelBuilder.java | 2 +- .../io/deephaven/qst/TableAdapterImpl.java | 4 +- .../qst/table/AggAllByExclusions.java | 82 ++++---- .../qst/table/AggregateAllByTable.java | 13 +- .../io/deephaven/qst/table/TableBase.java | 24 +-- .../io/deephaven/api/TableOperations.java | 10 +- .../deephaven/api/TableOperationsAdapter.java | 18 +- .../io/deephaven/api/agg/Aggregation.java | 74 ++++---- .../api/agg/AggregationOptimizer.java | 22 +-- .../deephaven/api/agg/AggregationOutputs.java | 8 +- ...ggregation.java => NormalAggregation.java} | 12 +- ...regations.java => NormalAggregations.java} | 16 +- .../main/java/io/deephaven/api/agg/Pair.java | 4 +- .../java/io/deephaven/api/agg/key/Key.java | 176 ------------------ .../io/deephaven/api/agg/key/KeyDistinct.java | 31 --- .../io/deephaven/api/agg/key/KeyLast.java | 19 -- .../java/io/deephaven/api/agg/key/KeyMax.java | 19 -- .../java/io/deephaven/api/agg/key/KeyMin.java | 19 -- .../java/io/deephaven/api/agg/key/KeyStd.java | 19 -- .../java/io/deephaven/api/agg/key/KeySum.java | 19 -- .../io/deephaven/api/agg/key/KeyUnique.java | 31 --- .../java/io/deephaven/api/agg/key/KeyVar.java | 19 -- .../io/deephaven/api/agg/spec/AggSpec.java | 176 ++++++++++++++++++ .../deephaven/api/agg/spec/AggSpecAbsSum.java | 20 ++ .../KeyGroup.java => spec/AggSpecAvg.java} | 8 +- .../KeyBase.java => spec/AggSpecBase.java} | 16 +- .../AggSpecColumnReferences.java} | 46 ++--- .../AggSpecCountDistinct.java} | 12 +- .../api/agg/spec/AggSpecDistinct.java | 29 +++ .../AggSpecEmptyBase.java} | 4 +- .../deephaven/api/agg/spec/AggSpecFirst.java | 19 ++ .../deephaven/api/agg/spec/AggSpecGroup.java | 19 ++ .../deephaven/api/agg/spec/AggSpecLast.java | 19 ++ .../{key/KeyAvg.java => spec/AggSpecMax.java} | 8 +- .../AggSpecMedian.java} | 12 +- .../KeyFirst.java => spec/AggSpecMin.java} | 8 +- .../AggSpecPercentile.java} | 12 +- .../AggSpecSortedFirst.java} | 10 +- .../AggSpecSortedLast.java} | 10 +- .../KeyAbsSum.java => spec/AggSpecStd.java} | 8 +- .../io/deephaven/api/agg/spec/AggSpecSum.java | 19 ++ .../deephaven/api/agg/spec/AggSpecUnique.java | 29 +++ .../io/deephaven/api/agg/spec/AggSpecVar.java | 19 ++ .../KeyWAvg.java => spec/AggSpecWAvg.java} | 8 +- .../KeyWSum.java => spec/AggSpecWSum.java} | 8 +- 55 files changed, 768 insertions(+), 773 deletions(-) rename table-api/src/main/java/io/deephaven/api/agg/{KeyedAggregation.java => NormalAggregation.java} (51%) rename table-api/src/main/java/io/deephaven/api/agg/{KeyedAggregations.java => NormalAggregations.java} (66%) delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/Key.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyDistinct.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyLast.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyMax.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyMin.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyStd.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeySum.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyUnique.java delete mode 100644 table-api/src/main/java/io/deephaven/api/agg/key/KeyVar.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/spec/AggSpec.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecAbsSum.java rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyGroup.java => spec/AggSpecAvg.java} (59%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyBase.java => spec/AggSpecBase.java} (51%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyColumns.java => spec/AggSpecColumnReferences.java} (59%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyCountDistinct.java => spec/AggSpecCountDistinct.java} (51%) create mode 100644 table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecDistinct.java rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyEmptyBase.java => spec/AggSpecEmptyBase.java} (76%) create mode 100644 table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecFirst.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecGroup.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecLast.java rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyAvg.java => spec/AggSpecMax.java} (59%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyMedian.java => spec/AggSpecMedian.java} (53%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyFirst.java => spec/AggSpecMin.java} (59%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyPct.java => spec/AggSpecPercentile.java} (60%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeySortedFirst.java => spec/AggSpecSortedFirst.java} (87%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeySortedLast.java => spec/AggSpecSortedLast.java} (88%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyAbsSum.java => spec/AggSpecStd.java} (59%) create mode 100644 table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSum.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecUnique.java create mode 100644 table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecVar.java rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyWAvg.java => spec/AggSpecWAvg.java} (67%) rename table-api/src/main/java/io/deephaven/api/agg/{key/KeyWSum.java => spec/AggSpecWSum.java} (67%) diff --git a/engine/api/src/main/java/io/deephaven/engine/table/Table.java b/engine/api/src/main/java/io/deephaven/engine/table/Table.java index 420d69956da..b70d75e8761 100644 --- a/engine/api/src/main/java/io/deephaven/engine/table/Table.java +++ b/engine/api/src/main/java/io/deephaven/engine/table/Table.java @@ -6,7 +6,7 @@ import io.deephaven.api.*; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.api.filter.Filter; import io.deephaven.engine.liveness.LivenessNode; import io.deephaven.engine.rowset.TrackingRowSet; @@ -998,19 +998,19 @@ Table join(Table rightTable, Collection columnsToMatch, @Override @ConcurrentMethod - Table aggAllBy(Key key); + Table aggAllBy(AggSpec spec); @Override @ConcurrentMethod - Table aggAllBy(Key key, String... groupByColumns); + Table aggAllBy(AggSpec spec, String... groupByColumns); @Override @ConcurrentMethod - Table aggAllBy(Key key, Selectable... groupByColumns); + Table aggAllBy(AggSpec spec, Selectable... groupByColumns); @Override @ConcurrentMethod - Table aggAllBy(Key key, Collection groupByColumns); + Table aggAllBy(AggSpec spec, Collection groupByColumns); @Override @ConcurrentMethod diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/AggAllByCopyAttributes.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/AggAllByCopyAttributes.java index f63fad4e9ab..55ed51c3ff7 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/AggAllByCopyAttributes.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/AggAllByCopyAttributes.java @@ -1,31 +1,31 @@ package io.deephaven.engine.table.impl; -import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; +import io.deephaven.api.agg.spec.AggSpec; +import io.deephaven.api.agg.spec.AggSpecAbsSum; +import io.deephaven.api.agg.spec.AggSpecAvg; +import io.deephaven.api.agg.spec.AggSpecCountDistinct; +import io.deephaven.api.agg.spec.AggSpecDistinct; +import io.deephaven.api.agg.spec.AggSpecFirst; +import io.deephaven.api.agg.spec.AggSpecGroup; +import io.deephaven.api.agg.spec.AggSpecLast; +import io.deephaven.api.agg.spec.AggSpecMax; +import io.deephaven.api.agg.spec.AggSpecMedian; +import io.deephaven.api.agg.spec.AggSpecMin; +import io.deephaven.api.agg.spec.AggSpecPercentile; +import io.deephaven.api.agg.spec.AggSpecSortedFirst; +import io.deephaven.api.agg.spec.AggSpecSortedLast; +import io.deephaven.api.agg.spec.AggSpecStd; +import io.deephaven.api.agg.spec.AggSpecSum; +import io.deephaven.api.agg.spec.AggSpecUnique; +import io.deephaven.api.agg.spec.AggSpecVar; +import io.deephaven.api.agg.spec.AggSpecWAvg; +import io.deephaven.api.agg.spec.AggSpecWSum; import io.deephaven.engine.table.Table; import io.deephaven.engine.table.impl.BaseTable.CopyAttributeOperation; import java.util.Objects; -class AggAllByCopyAttributes implements Key.Visitor { +class AggAllByCopyAttributes implements AggSpec.Visitor { private final BaseTable parent; private final Table result; @@ -36,63 +36,63 @@ public AggAllByCopyAttributes(BaseTable parent, Table result) { } @Override - public void visit(KeyAbsSum absSum) {} + public void visit(AggSpecAbsSum absSum) {} @Override - public void visit(KeyCountDistinct countDistinct) {} + public void visit(AggSpecCountDistinct countDistinct) {} @Override - public void visit(KeyDistinct distinct) {} + public void visit(AggSpecDistinct distinct) {} @Override - public void visit(KeyGroup group) {} + public void visit(AggSpecGroup group) {} @Override - public void visit(KeyAvg avg) {} + public void visit(AggSpecAvg avg) {} @Override - public void visit(KeyFirst first) { + public void visit(AggSpecFirst first) { parent.copyAttributes(result, CopyAttributeOperation.FirstBy); } @Override - public void visit(KeyLast last) { + public void visit(AggSpecLast last) { parent.copyAttributes(result, CopyAttributeOperation.LastBy); } @Override - public void visit(KeyMax max) {} + public void visit(AggSpecMax max) {} @Override - public void visit(KeyMedian median) {} + public void visit(AggSpecMedian median) {} @Override - public void visit(KeyMin min) {} + public void visit(AggSpecMin min) {} @Override - public void visit(KeyPct pct) {} + public void visit(AggSpecPercentile pct) {} @Override - public void visit(KeySortedFirst sortedFirst) {} + public void visit(AggSpecSortedFirst sortedFirst) {} @Override - public void visit(KeySortedLast sortedLast) {} + public void visit(AggSpecSortedLast sortedLast) {} @Override - public void visit(KeyStd std) {} + public void visit(AggSpecStd std) {} @Override - public void visit(KeySum sum) {} + public void visit(AggSpecSum sum) {} @Override - public void visit(KeyUnique unique) {} + public void visit(AggSpecUnique unique) {} @Override - public void visit(KeyWAvg wAvg) {} + public void visit(AggSpecWAvg wAvg) {} @Override - public void visit(KeyWSum wSum) {} + public void visit(AggSpecWSum wSum) {} @Override - public void visit(KeyVar var) {} + public void visit(AggSpecVar var) {} } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java index 1cc945c29d9..e55255434a4 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java @@ -4,7 +4,7 @@ import io.deephaven.api.Selectable; import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.api.filter.Filter; import io.deephaven.engine.rowset.TrackingRowSet; import io.deephaven.engine.table.MatchPair; @@ -180,8 +180,8 @@ public Table tailPct(double percent) { } @Override - public Table aggAllBy(Key key, Selectable... groupByColumns) { - return throwUnsupported("aggAllBy(" + key + ")"); + public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { + return throwUnsupported("aggAllBy(" + spec + ")"); } @Override diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 1e6703e6197..96db1eabf04 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -10,8 +10,8 @@ import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.AggregationOutputs; -import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyColumns; +import io.deephaven.api.agg.spec.AggSpec; +import io.deephaven.api.agg.spec.AggSpecColumnReferences; import io.deephaven.api.filter.Filter; import io.deephaven.base.StringUtils; import io.deephaven.base.verify.Assert; @@ -29,7 +29,6 @@ import io.deephaven.engine.util.ColumnFormattingValues; import io.deephaven.engine.util.systemicmarking.SystemicObject; import io.deephaven.qst.table.AggregateAllByTable; -import io.deephaven.qst.table.AggregationTable; import io.deephaven.vector.Vector; import io.deephaven.engine.updategraph.UpdateGraphProcessor; import io.deephaven.engine.updategraph.NotificationQueue; @@ -590,8 +589,8 @@ public Table exactJoin(Table table, MatchPair[] columnsToMatch, MatchPair[] colu } @Override - public Table aggAllBy(Key key, Selectable... groupByColumns) { - for (ColumnName name : KeyColumns.of(key)) { + public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { + for (ColumnName name : AggSpecColumnReferences.of(spec)) { if (!columns.containsKey(name.name())) { throw new IllegalArgumentException("Key references column that does not exist: " + name.name()); } @@ -599,9 +598,9 @@ public Table aggAllBy(Key key, Selectable... groupByColumns) { final List groupByList = Arrays.asList(groupByColumns); final List tableColumns = columns.keySet().stream().map(ColumnName::of).collect(Collectors.toList()); - final Optional agg = AggregateAllByTable.singleAggregation(key, groupByList, tableColumns); + final Optional agg = AggregateAllByTable.singleAggregation(spec, groupByList, tableColumns); final Table result = aggBy(agg.stream().collect(Collectors.toList()), groupByList); - key.walk(new AggAllByCopyAttributes(this, result)); + spec.walk(new AggAllByCopyAttributes(this, result)); return result; } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java index fb6e6973368..374fd6c5705 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java @@ -6,7 +6,7 @@ import io.deephaven.api.*; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.api.filter.Filter; import io.deephaven.base.Pair; import io.deephaven.base.StringUtils; @@ -665,7 +665,7 @@ default Table join(Table rightTable, Collection columnsToMa @Override @ConcurrentMethod default Table groupBy(Collection groupByColumns) { - return aggAllBy(Key.group(), groupByColumns.toArray(Selectable[]::new)); + return aggAllBy(AggSpec.group(), groupByColumns.toArray(Selectable[]::new)); } @Override @@ -682,20 +682,20 @@ default Table groupBy() { @Override @ConcurrentMethod - default Table aggAllBy(Key key) { - return aggAllBy(key, Collections.emptyList()); + default Table aggAllBy(AggSpec spec) { + return aggAllBy(spec, Collections.emptyList()); } @Override @ConcurrentMethod - default Table aggAllBy(Key key, String... groupByColumns) { - return aggAllBy(key, List.of(groupByColumns)); + default Table aggAllBy(AggSpec spec, String... groupByColumns) { + return aggAllBy(spec, List.of(groupByColumns)); } @Override @ConcurrentMethod - default Table aggAllBy(Key key, Collection groupByColumns) { - return aggAllBy(key, Selectable.from(groupByColumns).toArray(ZERO_LENGTH_SELECTABLE_ARRAY)); + default Table aggAllBy(AggSpec spec, Collection groupByColumns) { + return aggAllBy(spec, Selectable.from(groupByColumns).toArray(ZERO_LENGTH_SELECTABLE_ARRAY)); } @Override @@ -768,7 +768,7 @@ default Table applyToAllBy(String formulaColumn, String... groupByColumns) { @Override @ConcurrentMethod default Table sumBy(Selectable... groupByColumns) { - return aggAllBy(Key.sum(), groupByColumns); + return aggAllBy(AggSpec.sum(), groupByColumns); } @Override @@ -792,7 +792,7 @@ default Table sumBy() { @Override @ConcurrentMethod default Table absSumBy(Selectable... groupByColumns) { - return aggAllBy(Key.absSum(), groupByColumns); + return aggAllBy(AggSpec.absSum(), groupByColumns); } @Override @@ -816,7 +816,7 @@ default Table absSumBy() { @Override @ConcurrentMethod default Table avgBy(Selectable... groupByColumns) { - return aggAllBy(Key.avg(), groupByColumns); + return aggAllBy(AggSpec.avg(), groupByColumns); } @Override @@ -840,7 +840,7 @@ default Table avgBy() { @Override @ConcurrentMethod default Table wavgBy(String weightColumn, Selectable... groupByColumns) { - return aggAllBy(Key.wavg(weightColumn), groupByColumns); + return aggAllBy(AggSpec.wavg(weightColumn), groupByColumns); } @Override @@ -864,7 +864,7 @@ default Table wavgBy(String weightColumn) { @Override @ConcurrentMethod default Table wsumBy(String weightColumn, Selectable... groupByColumns) { - return aggAllBy(Key.wsum(weightColumn), groupByColumns); + return aggAllBy(AggSpec.wsum(weightColumn), groupByColumns); } @Override @@ -888,7 +888,7 @@ default Table wsumBy(String weightColumn, Collection groupByColumns) { @Override @ConcurrentMethod default Table stdBy(Selectable... groupByColumns) { - return aggAllBy(Key.std(), groupByColumns); + return aggAllBy(AggSpec.std(), groupByColumns); } @Override @@ -912,7 +912,7 @@ default Table stdBy() { @Override @ConcurrentMethod default Table varBy(Selectable... groupByColumns) { - return aggAllBy(Key.var(), groupByColumns); + return aggAllBy(AggSpec.var(), groupByColumns); } @Override @@ -936,7 +936,7 @@ default Table varBy() { @Override @ConcurrentMethod default Table lastBy(Selectable... groupByColumns) { - return aggAllBy(Key.last(), groupByColumns); + return aggAllBy(AggSpec.last(), groupByColumns); } @Override @@ -960,7 +960,7 @@ default Table lastBy() { @Override @ConcurrentMethod default Table firstBy(Selectable... groupByColumns) { - return aggAllBy(Key.first(), groupByColumns); + return aggAllBy(AggSpec.first(), groupByColumns); } @Override @@ -984,7 +984,7 @@ default Table firstBy() { @Override @ConcurrentMethod default Table minBy(Selectable... groupByColumns) { - return aggAllBy(Key.min(), groupByColumns); + return aggAllBy(AggSpec.min(), groupByColumns); } @Override @@ -1008,7 +1008,7 @@ default Table minBy() { @Override @ConcurrentMethod default Table maxBy(Selectable... groupByColumns) { - return aggAllBy(Key.max(), groupByColumns); + return aggAllBy(AggSpec.max(), groupByColumns); } @Override @@ -1032,7 +1032,7 @@ default Table maxBy() { @Override @ConcurrentMethod default Table medianBy(Selectable... groupByColumns) { - return aggAllBy(Key.median(), groupByColumns); + return aggAllBy(AggSpec.median(), groupByColumns); } @Override diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java index a75a8c34c4f..ae75fb49b6e 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java @@ -8,7 +8,7 @@ import io.deephaven.api.Selectable; import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.api.filter.Filter; import io.deephaven.base.verify.Assert; import io.deephaven.engine.liveness.Liveness; @@ -349,8 +349,8 @@ public Table groupBy(Collection groupByColumns) { @Override @ConcurrentMethod - public Table aggAllBy(Key key, Selectable... groupByColumns) { - return coalesce().aggAllBy(key, groupByColumns); + public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { + return coalesce().aggAllBy(spec, groupByColumns); } @Override diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java index 3ee1741c2db..3b7f4b2591e 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationElementAdapter.java @@ -2,8 +2,8 @@ import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.Count; -import io.deephaven.api.agg.KeyedAggregation; -import io.deephaven.api.agg.KeyedAggregations; +import io.deephaven.api.agg.NormalAggregation; +import io.deephaven.api.agg.NormalAggregations; import io.deephaven.engine.table.MatchPair; import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElement; import io.deephaven.engine.table.impl.by.AggregationFactory.AggregationElementImpl; @@ -31,16 +31,16 @@ public void visit(Count count) { } @Override - public void visit(KeyedAggregation keyedAgg) { - final AggregationSpec spec = AggregationSpecAdapter.of(keyedAgg.key()); - final MatchPair pair = MatchPair.of(keyedAgg.pair()); + public void visit(NormalAggregation normalAgg) { + final AggregationSpec spec = AggregationSpecAdapter.of(normalAgg.spec()); + final MatchPair pair = MatchPair.of(normalAgg.pair()); out = new AggregationElementImpl(spec, pair); } @Override - public void visit(KeyedAggregations keyedAggs) { - final AggregationSpec spec = AggregationSpecAdapter.of(keyedAggs.key()); - final MatchPair[] pairs = MatchPair.fromPairs(keyedAggs.pairs()); + public void visit(NormalAggregations normalAggs) { + final AggregationSpec spec = AggregationSpecAdapter.of(normalAggs.spec()); + final MatchPair[] pairs = MatchPair.fromPairs(normalAggs.pairs()); out = new AggregationElementImpl(spec, pairs); } } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java index 0677627a48c..c05c1572e1b 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java @@ -2,35 +2,35 @@ import io.deephaven.api.ColumnName; import io.deephaven.api.SortColumn; -import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; +import io.deephaven.api.agg.spec.AggSpec; +import io.deephaven.api.agg.spec.AggSpecAbsSum; +import io.deephaven.api.agg.spec.AggSpecAvg; +import io.deephaven.api.agg.spec.AggSpecCountDistinct; +import io.deephaven.api.agg.spec.AggSpecDistinct; +import io.deephaven.api.agg.spec.AggSpecFirst; +import io.deephaven.api.agg.spec.AggSpecGroup; +import io.deephaven.api.agg.spec.AggSpecLast; +import io.deephaven.api.agg.spec.AggSpecMax; +import io.deephaven.api.agg.spec.AggSpecMedian; +import io.deephaven.api.agg.spec.AggSpecMin; +import io.deephaven.api.agg.spec.AggSpecPercentile; +import io.deephaven.api.agg.spec.AggSpecSortedFirst; +import io.deephaven.api.agg.spec.AggSpecSortedLast; +import io.deephaven.api.agg.spec.AggSpecStd; +import io.deephaven.api.agg.spec.AggSpecSum; +import io.deephaven.api.agg.spec.AggSpecUnique; +import io.deephaven.api.agg.spec.AggSpecVar; +import io.deephaven.api.agg.spec.AggSpecWAvg; +import io.deephaven.api.agg.spec.AggSpecWSum; import java.util.Objects; import static io.deephaven.engine.table.impl.QueryTable.TRACKED_FIRST_BY; import static io.deephaven.engine.table.impl.QueryTable.TRACKED_LAST_BY; -public class AggregationSpecAdapter implements Key.Visitor { +public class AggregationSpecAdapter implements AggSpec.Visitor { - public static AggregationSpec of(Key key) { + public static AggregationSpec of(AggSpec key) { return key.walk(new AggregationSpecAdapter()).out(); } @@ -42,99 +42,99 @@ public AggregationSpec out() { } @Override - public void visit(KeyAbsSum absSum) { + public void visit(AggSpecAbsSum absSum) { out = new AbsSumSpec(); } @Override - public void visit(KeyCountDistinct countDistinct) { + public void visit(AggSpecCountDistinct countDistinct) { out = new CountDistinctSpec(countDistinct.countNulls()); } @Override - public void visit(KeyDistinct distinct) { + public void visit(AggSpecDistinct distinct) { out = new DistinctSpec(distinct.includeNulls()); } @Override - public void visit(KeyGroup group) { + public void visit(AggSpecGroup group) { out = new AggregationGroupSpec(); } @Override - public void visit(KeyAvg avg) { + public void visit(AggSpecAvg avg) { out = new AvgSpec(); } @Override - public void visit(KeyFirst first) { + public void visit(AggSpecFirst first) { out = TRACKED_FIRST_BY ? new TrackingFirstBySpecImpl() : new FirstBySpecImpl(); } @Override - public void visit(KeyLast last) { + public void visit(AggSpecLast last) { out = TRACKED_LAST_BY ? new TrackingLastBySpecImpl() : new LastBySpecImpl(); } @Override - public void visit(KeyMax max) { + public void visit(AggSpecMax max) { out = new MinMaxBySpecImpl(false); } @Override - public void visit(KeyMedian median) { + public void visit(AggSpecMedian median) { out = new PercentileBySpecImpl(0.50d, median.averageMedian()); } @Override - public void visit(KeyMin min) { + public void visit(AggSpecMin min) { out = new MinMaxBySpecImpl(true); } @Override - public void visit(KeyPct pct) { + public void visit(AggSpecPercentile pct) { out = new PercentileBySpecImpl(pct.percentile(), pct.averageMedian()); } @Override - public void visit(KeySortedFirst sortedFirst) { + public void visit(AggSpecSortedFirst sortedFirst) { out = new SortedFirstBy( sortedFirst.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); } @Override - public void visit(KeySortedLast sortedLast) { + public void visit(AggSpecSortedLast sortedLast) { out = new SortedLastBy( sortedLast.columns().stream().map(SortColumn::column).map(ColumnName::name).toArray(String[]::new)); } @Override - public void visit(KeyStd std) { + public void visit(AggSpecStd std) { out = new StdSpec(); } @Override - public void visit(KeySum sum) { + public void visit(AggSpecSum sum) { out = new SumSpec(); } @Override - public void visit(KeyUnique unique) { + public void visit(AggSpecUnique unique) { out = new UniqueSpec(unique.includeNulls()); } @Override - public void visit(KeyWAvg wAvg) { + public void visit(AggSpecWAvg wAvg) { out = new WeightedAverageSpecImpl(wAvg.weight().name()); } @Override - public void visit(KeyWSum wSum) { + public void visit(AggSpecWSum wSum) { out = new WeightedSumSpecImpl(wSum.weight().name()); } @Override - public void visit(KeyVar var) { + public void visit(AggSpecVar var) { out = new VarSpec(); } } diff --git a/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java index fe45e62dceb..187474ba1dc 100644 --- a/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java +++ b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java @@ -1,17 +1,15 @@ package io.deephaven.client.examples; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.client.impl.FlightSession; import io.deephaven.client.impl.TableHandle; import io.deephaven.qst.LabeledValue; import io.deephaven.qst.LabeledValues; import io.deephaven.qst.column.header.ColumnHeader; import io.deephaven.qst.column.header.ColumnHeaders8; -import io.deephaven.qst.column.header.ColumnHeaders8.Rows; import io.deephaven.qst.table.InMemoryKeyBackedInputTable; import io.deephaven.qst.table.LabeledTables; import io.deephaven.qst.table.LabeledTables.Builder; -import io.deephaven.qst.table.NewTable; import io.deephaven.qst.table.TableHeader; import io.deephaven.qst.table.TableSpec; import picocli.CommandLine; @@ -28,31 +26,31 @@ description = "Aggregate all examples", version = "0.1.0") class AggregateAllExample extends FlightExampleBase { - private static List keys() { + private static List keys() { return Arrays.asList( - Key.absSum(), - Key.avg(), + AggSpec.absSum(), + AggSpec.avg(), // Key.countDistinct(false), // Key.countDistinct(true), // Key.distinct(false), // Key.distinct(true), - Key.first(), - Key.group(), - Key.last(), - Key.max(), + AggSpec.first(), + AggSpec.group(), + AggSpec.last(), + AggSpec.max(), // Key.median(false), - Key.median(true), - Key.min(), + AggSpec.median(true), + AggSpec.min(), // Key.percentile(0.25, false), // Key.percentile(0.25, true), // Key.sortedFirst(...), // Key.sortedLast(...), - Key.std(), - Key.sum(), + AggSpec.std(), + AggSpec.sum(), // Key.unique(false), // Key.unique(true), - Key.var(), - Key.wavg("Z") + AggSpec.var(), + AggSpec.wavg("Z") // Key.wsum("Z") ); } @@ -91,7 +89,7 @@ protected void execute(FlightSession flight) throws Exception { Collections.singletonList(inputKey.name())); builder.putMap("base", spec); // todo: countBy - for (Key key : keys()) { + for (AggSpec key : keys()) { final String name = key.toString() .replace('=', '_') .replace('{', '_') diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java b/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java index 31a6305b450..807cb8d2d37 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/BatchTableRequestBuilder.java @@ -13,29 +13,29 @@ import io.deephaven.api.Strings; import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.Count; -import io.deephaven.api.agg.KeyedAggregation; -import io.deephaven.api.agg.KeyedAggregations; +import io.deephaven.api.agg.NormalAggregation; +import io.deephaven.api.agg.NormalAggregations; import io.deephaven.api.agg.Pair; -import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; +import io.deephaven.api.agg.spec.AggSpec; +import io.deephaven.api.agg.spec.AggSpecAbsSum; +import io.deephaven.api.agg.spec.AggSpecAvg; +import io.deephaven.api.agg.spec.AggSpecCountDistinct; +import io.deephaven.api.agg.spec.AggSpecDistinct; +import io.deephaven.api.agg.spec.AggSpecFirst; +import io.deephaven.api.agg.spec.AggSpecGroup; +import io.deephaven.api.agg.spec.AggSpecLast; +import io.deephaven.api.agg.spec.AggSpecMax; +import io.deephaven.api.agg.spec.AggSpecMedian; +import io.deephaven.api.agg.spec.AggSpecMin; +import io.deephaven.api.agg.spec.AggSpecPercentile; +import io.deephaven.api.agg.spec.AggSpecSortedFirst; +import io.deephaven.api.agg.spec.AggSpecSortedLast; +import io.deephaven.api.agg.spec.AggSpecStd; +import io.deephaven.api.agg.spec.AggSpecSum; +import io.deephaven.api.agg.spec.AggSpecUnique; +import io.deephaven.api.agg.spec.AggSpecVar; +import io.deephaven.api.agg.spec.AggSpecWAvg; +import io.deephaven.api.agg.spec.AggSpecWSum; import io.deephaven.api.filter.Filter; import io.deephaven.api.filter.FilterAnd; import io.deephaven.api.filter.FilterCondition; @@ -479,7 +479,7 @@ private SelectOrUpdateRequest selectOrUpdate(SingleParentTable x, private ComboAggregateRequest aggAllBy(AggregateAllByTable agg) { // A single aggregate without any input/output is how the protocol knows this is an "aggregate all by" // as opposed to an AggregationTable with one agg. - final Aggregate aggregate = agg.key().walk(new AggregateAdapter(Collections.emptyList())).out(); + final Aggregate aggregate = agg.spec().walk(new AggregateAdapter(Collections.emptyList())).out(); return groupByColumns(agg).addAggregates(aggregate).build(); } @@ -520,14 +520,14 @@ public void visit(Count count) { } @Override - public void visit(KeyedAggregation keyedAgg) { - out = keyedAgg.key() - .walk(new AggregateAdapter(Collections.singletonList(keyedAgg.pair()))).out(); + public void visit(NormalAggregation normalAgg) { + out = normalAgg.spec() + .walk(new AggregateAdapter(Collections.singletonList(normalAgg.pair()))).out(); } @Override - public void visit(KeyedAggregations keyedAggs) { - out = keyedAggs.key().walk(new AggregateAdapter(keyedAggs.pairs())).out(); + public void visit(NormalAggregations normalAggs) { + out = normalAggs.spec().walk(new AggregateAdapter(normalAggs.pairs())).out(); } } @@ -655,7 +655,7 @@ private static Aggregate.Builder of(AggType type, List pairs) { return builder; } - private static class AggregateAdapter implements Key.Visitor { + private static class AggregateAdapter implements AggSpec.Visitor { private final List pairs; @@ -670,49 +670,49 @@ private Aggregate out() { } @Override - public void visit(KeyAbsSum absSum) { + public void visit(AggSpecAbsSum absSum) { out = of(AggType.ABS_SUM, pairs).build(); } @Override - public void visit(KeyCountDistinct countDistinct) { + public void visit(AggSpecCountDistinct countDistinct) { throw new UnsupportedOperationException( "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); } @Override - public void visit(KeyDistinct distinct) { + public void visit(AggSpecDistinct distinct) { throw new UnsupportedOperationException( "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); } @Override - public void visit(KeyGroup group) { + public void visit(AggSpecGroup group) { out = of(AggType.GROUP, pairs).build(); } @Override - public void visit(KeyAvg avg) { + public void visit(AggSpecAvg avg) { out = of(AggType.AVG, pairs).build(); } @Override - public void visit(KeyFirst first) { + public void visit(AggSpecFirst first) { out = of(AggType.FIRST, pairs).build(); } @Override - public void visit(KeyLast last) { + public void visit(AggSpecLast last) { out = of(AggType.LAST, pairs).build(); } @Override - public void visit(KeyMax max) { + public void visit(AggSpecMax max) { out = of(AggType.MAX, pairs).build(); } @Override - public void visit(KeyMedian median) { + public void visit(AggSpecMedian median) { if (!median.averageMedian()) { throw new UnsupportedOperationException( "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); @@ -721,12 +721,12 @@ public void visit(KeyMedian median) { } @Override - public void visit(KeyMin min) { + public void visit(AggSpecMin min) { out = of(AggType.MIN, pairs).build(); } @Override - public void visit(KeyPct pct) { + public void visit(AggSpecPercentile pct) { if (pct.averageMedian()) { throw new UnsupportedOperationException( "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); @@ -735,47 +735,47 @@ public void visit(KeyPct pct) { } @Override - public void visit(KeySortedFirst sortedFirst) { + public void visit(AggSpecSortedFirst sortedFirst) { throw new UnsupportedOperationException( "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); } @Override - public void visit(KeySortedLast sortedLast) { + public void visit(AggSpecSortedLast sortedLast) { throw new UnsupportedOperationException( "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); } @Override - public void visit(KeyStd std) { + public void visit(AggSpecStd std) { out = of(AggType.STD, pairs).build(); } @Override - public void visit(KeySum sum) { + public void visit(AggSpecSum sum) { out = of(AggType.SUM, pairs).build(); } @Override - public void visit(KeyUnique unique) { + public void visit(AggSpecUnique unique) { throw new UnsupportedOperationException( "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); } @Override - public void visit(KeyWAvg wAvg) { + public void visit(AggSpecWAvg wAvg) { out = of(AggType.WEIGHTED_AVG, pairs).setColumnName(wAvg.weight().name()).build(); } @Override - public void visit(KeyWSum wSum) { + public void visit(AggSpecWSum wSum) { throw new UnsupportedOperationException( "TODO(deephaven-core#991): TableService aggregation coverage, https://github.com/deephaven/deephaven-core/issues/991"); } @Override - public void visit(KeyVar var) { + public void visit(AggSpecVar var) { out = of(AggType.VAR, pairs).build(); } } diff --git a/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java b/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java index af4d4f2917a..9379b67e338 100644 --- a/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java +++ b/qst/graphviz/src/main/java/io/deephaven/graphviz/LabelBuilder.java @@ -137,7 +137,7 @@ public void visit(WhereTable whereTable) { @Override public void visit(AggregateAllByTable aggAllByTable) { sb.append("aggAllBy("); - sb.append(aggAllByTable.key()).append(','); + sb.append(aggAllByTable.spec()).append(','); append(Strings::of, aggAllByTable.groupByColumns(), sb); sb.append(')'); } diff --git a/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java b/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java index f1078d4d6d9..333de176e3a 100644 --- a/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java +++ b/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java @@ -2,7 +2,7 @@ import io.deephaven.api.Selectable; import io.deephaven.api.TableOperations; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.qst.TableAdapterResults.Output; import io.deephaven.qst.table.AggregateAllByTable; import io.deephaven.qst.table.AggregationTable; @@ -238,7 +238,7 @@ public void visit(ReverseAsOfJoinTable raj) { @Override public void visit(AggregateAllByTable aggAllByTable) { - final Key key = aggAllByTable.key(); + final AggSpec key = aggAllByTable.spec(); final Selectable[] groupByColumns = aggAllByTable.groupByColumns().toArray(new Selectable[0]); addOp(aggAllByTable, parentOps(aggAllByTable).aggAllBy(key, groupByColumns)); } diff --git a/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java b/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java index ac60ec34870..bc8c145c7ae 100644 --- a/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java +++ b/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java @@ -2,27 +2,27 @@ import io.deephaven.api.ColumnName; import io.deephaven.api.Selectable; -import io.deephaven.api.agg.key.Key; -import io.deephaven.api.agg.key.Key.Visitor; -import io.deephaven.api.agg.key.KeyAbsSum; -import io.deephaven.api.agg.key.KeyAvg; -import io.deephaven.api.agg.key.KeyCountDistinct; -import io.deephaven.api.agg.key.KeyDistinct; -import io.deephaven.api.agg.key.KeyFirst; -import io.deephaven.api.agg.key.KeyGroup; -import io.deephaven.api.agg.key.KeyLast; -import io.deephaven.api.agg.key.KeyMax; -import io.deephaven.api.agg.key.KeyMedian; -import io.deephaven.api.agg.key.KeyMin; -import io.deephaven.api.agg.key.KeyPct; -import io.deephaven.api.agg.key.KeySortedFirst; -import io.deephaven.api.agg.key.KeySortedLast; -import io.deephaven.api.agg.key.KeyStd; -import io.deephaven.api.agg.key.KeySum; -import io.deephaven.api.agg.key.KeyUnique; -import io.deephaven.api.agg.key.KeyVar; -import io.deephaven.api.agg.key.KeyWAvg; -import io.deephaven.api.agg.key.KeyWSum; +import io.deephaven.api.agg.spec.AggSpec; +import io.deephaven.api.agg.spec.AggSpec.Visitor; +import io.deephaven.api.agg.spec.AggSpecAbsSum; +import io.deephaven.api.agg.spec.AggSpecAvg; +import io.deephaven.api.agg.spec.AggSpecCountDistinct; +import io.deephaven.api.agg.spec.AggSpecDistinct; +import io.deephaven.api.agg.spec.AggSpecFirst; +import io.deephaven.api.agg.spec.AggSpecGroup; +import io.deephaven.api.agg.spec.AggSpecLast; +import io.deephaven.api.agg.spec.AggSpecMax; +import io.deephaven.api.agg.spec.AggSpecMedian; +import io.deephaven.api.agg.spec.AggSpecMin; +import io.deephaven.api.agg.spec.AggSpecPercentile; +import io.deephaven.api.agg.spec.AggSpecSortedFirst; +import io.deephaven.api.agg.spec.AggSpecSortedLast; +import io.deephaven.api.agg.spec.AggSpecStd; +import io.deephaven.api.agg.spec.AggSpecSum; +import io.deephaven.api.agg.spec.AggSpecUnique; +import io.deephaven.api.agg.spec.AggSpecVar; +import io.deephaven.api.agg.spec.AggSpecWAvg; +import io.deephaven.api.agg.spec.AggSpecWSum; import java.util.Collection; import java.util.Collections; @@ -35,7 +35,7 @@ */ final class AggAllByExclusions implements Visitor { - public static Set of(Key key, Collection groupByColumns) { + public static Set of(AggSpec key, Collection groupByColumns) { final Set exclusions = groupByColumns.stream().map(Selectable::newColumn).collect(Collectors.toSet()); final Set otherExclusions = key.walk(new AggAllByExclusions()).out(); @@ -50,97 +50,97 @@ public Set out() { } @Override - public void visit(KeyAbsSum absSum) { + public void visit(AggSpecAbsSum absSum) { out = Collections.emptySet(); } @Override - public void visit(KeyCountDistinct countDistinct) { + public void visit(AggSpecCountDistinct countDistinct) { out = Collections.emptySet(); } @Override - public void visit(KeyDistinct distinct) { + public void visit(AggSpecDistinct distinct) { out = Collections.emptySet(); } @Override - public void visit(KeyGroup group) { + public void visit(AggSpecGroup group) { out = Collections.emptySet(); } @Override - public void visit(KeyAvg avg) { + public void visit(AggSpecAvg avg) { out = Collections.emptySet(); } @Override - public void visit(KeyFirst first) { + public void visit(AggSpecFirst first) { out = Collections.emptySet(); } @Override - public void visit(KeyLast last) { + public void visit(AggSpecLast last) { out = Collections.emptySet(); } @Override - public void visit(KeyMax max) { + public void visit(AggSpecMax max) { out = Collections.emptySet(); } @Override - public void visit(KeyMedian median) { + public void visit(AggSpecMedian median) { out = Collections.emptySet(); } @Override - public void visit(KeyMin min) { + public void visit(AggSpecMin min) { out = Collections.emptySet(); } @Override - public void visit(KeyPct pct) { + public void visit(AggSpecPercentile pct) { out = Collections.emptySet(); } @Override - public void visit(KeySortedFirst sortedFirst) { + public void visit(AggSpecSortedFirst sortedFirst) { out = Collections.emptySet(); } @Override - public void visit(KeySortedLast sortedLast) { + public void visit(AggSpecSortedLast sortedLast) { out = Collections.emptySet(); } @Override - public void visit(KeyStd std) { + public void visit(AggSpecStd std) { out = Collections.emptySet(); } @Override - public void visit(KeySum sum) { + public void visit(AggSpecSum sum) { out = Collections.emptySet(); } @Override - public void visit(KeyUnique unique) { + public void visit(AggSpecUnique unique) { out = Collections.emptySet(); } @Override - public void visit(KeyWAvg wAvg) { + public void visit(AggSpecWAvg wAvg) { out = Collections.singleton(wAvg.weight()); } @Override - public void visit(KeyWSum wSum) { + public void visit(AggSpecWSum wSum) { out = Collections.singleton(wSum.weight()); } @Override - public void visit(KeyVar var) { + public void visit(AggSpecVar var) { out = Collections.emptySet(); } } diff --git a/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java b/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java index 6bf0b2b009a..9f9dde8a9b2 100644 --- a/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java +++ b/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java @@ -4,7 +4,7 @@ import io.deephaven.api.ColumnName; import io.deephaven.api.Selectable; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import org.immutables.value.Value.Immutable; import java.util.ArrayList; @@ -31,7 +31,8 @@ public static Builder builder() { * @return the aggregation, if non-empty */ public static Optional singleAggregation( - Key key, Collection groupByColumns, Collection tableColumns) { + AggSpec key, Collection groupByColumns, + Collection tableColumns) { Set exclusions = AggAllByExclusions.of(key, groupByColumns); List columnsToAgg = new ArrayList<>(tableColumns.size()); for (ColumnName column : tableColumns) { @@ -43,7 +44,7 @@ public static Optional singleAggregation( return columnsToAgg.isEmpty() ? Optional.empty() : Optional.of(key.aggregation(columnsToAgg)); } - public abstract Key key(); + public abstract AggSpec spec(); /** * Transform {@code this} agg-all-by table into an {@link AggregationTable} by constructing the necessary @@ -51,13 +52,13 @@ public static Optional singleAggregation( * * @param tableColumns the table columns * @return the aggregation table - * @see #singleAggregation(Key, Collection, Collection) + * @see #singleAggregation(AggSpec, Collection, Collection) */ public final AggregationTable asAggregation(Collection tableColumns) { AggregationTable.Builder builder = AggregationTable.builder() .parent(parent()) .addAllGroupByColumns(groupByColumns()); - singleAggregation(key(), groupByColumns(), tableColumns).ifPresent(builder::addAggregations); + singleAggregation(spec(), groupByColumns(), tableColumns).ifPresent(builder::addAggregations); return builder.build(); } @@ -68,6 +69,6 @@ public final V walk(V visitor) { } public interface Builder extends ByTableBase.Builder { - Builder key(Key key); + Builder spec(AggSpec spec); } } diff --git a/qst/src/main/java/io/deephaven/qst/table/TableBase.java b/qst/src/main/java/io/deephaven/qst/table/TableBase.java index 4e8e3addfc1..5b1c8324c57 100644 --- a/qst/src/main/java/io/deephaven/qst/table/TableBase.java +++ b/qst/src/main/java/io/deephaven/qst/table/TableBase.java @@ -9,7 +9,7 @@ import io.deephaven.api.Selectable; import io.deephaven.api.SortColumn; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.api.filter.Filter; import io.deephaven.qst.TableCreationLogic; @@ -403,37 +403,37 @@ public final SelectTable select(Collection columns) { @Override public final AggregateAllByTable groupBy() { - return aggAllBy(Key.group()); + return aggAllBy(AggSpec.group()); } @Override public final AggregateAllByTable groupBy(String... groupByColumns) { - return aggAllBy(Key.group(), groupByColumns); + return aggAllBy(AggSpec.group(), groupByColumns); } @Override public final AggregateAllByTable groupBy(Collection groupByColumns) { - return aggAllBy(Key.group(), groupByColumns.toArray(new Selectable[0])); + return aggAllBy(AggSpec.group(), groupByColumns.toArray(new Selectable[0])); } @Override - public final AggregateAllByTable aggAllBy(Key key) { - return AggregateAllByTable.builder().parent(this).key(key).build(); + public final AggregateAllByTable aggAllBy(AggSpec spec) { + return AggregateAllByTable.builder().parent(this).spec(spec).build(); } @Override - public final AggregateAllByTable aggAllBy(Key key, String... groupByColumns) { - return aggAllBy(key, Arrays.asList(groupByColumns)); + public final AggregateAllByTable aggAllBy(AggSpec spec, String... groupByColumns) { + return aggAllBy(spec, Arrays.asList(groupByColumns)); } @Override - public final AggregateAllByTable aggAllBy(Key key, Selectable... groupByColumns) { - return AggregateAllByTable.builder().parent(this).key(key).addGroupByColumns(groupByColumns).build(); + public final AggregateAllByTable aggAllBy(AggSpec spec, Selectable... groupByColumns) { + return AggregateAllByTable.builder().parent(this).spec(spec).addGroupByColumns(groupByColumns).build(); } @Override - public final AggregateAllByTable aggAllBy(Key key, Collection groupByColumns) { - AggregateAllByTable.Builder builder = AggregateAllByTable.builder().parent(this).key(key); + public final AggregateAllByTable aggAllBy(AggSpec spec, Collection groupByColumns) { + AggregateAllByTable.Builder builder = AggregateAllByTable.builder().parent(this).spec(spec); for (String groupByColumn : groupByColumns) { builder.addGroupByColumns(Selectable.parse(groupByColumn)); } diff --git a/table-api/src/main/java/io/deephaven/api/TableOperations.java b/table-api/src/main/java/io/deephaven/api/TableOperations.java index 5e9cb7cc227..87eec4a00c5 100644 --- a/table-api/src/main/java/io/deephaven/api/TableOperations.java +++ b/table-api/src/main/java/io/deephaven/api/TableOperations.java @@ -1,7 +1,7 @@ package io.deephaven.api; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.api.filter.Filter; import java.util.Collection; @@ -549,13 +549,13 @@ TOPS raj(TABLE rightTable, Collection columnsToMatch, // ------------------------------------------------------------------------------------------- - TOPS aggAllBy(Key key); + TOPS aggAllBy(AggSpec spec); - TOPS aggAllBy(Key key, String... groupByColumns); + TOPS aggAllBy(AggSpec spec, String... groupByColumns); - TOPS aggAllBy(Key key, Selectable... groupByColumns); + TOPS aggAllBy(AggSpec spec, Selectable... groupByColumns); - TOPS aggAllBy(Key key, Collection groupByColumns); + TOPS aggAllBy(AggSpec spec, Collection groupByColumns); // ------------------------------------------------------------------------------------------- diff --git a/table-api/src/main/java/io/deephaven/api/TableOperationsAdapter.java b/table-api/src/main/java/io/deephaven/api/TableOperationsAdapter.java index afa0ada39c8..07bbe7d95b9 100644 --- a/table-api/src/main/java/io/deephaven/api/TableOperationsAdapter.java +++ b/table-api/src/main/java/io/deephaven/api/TableOperationsAdapter.java @@ -1,7 +1,7 @@ package io.deephaven.api; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.api.filter.Filter; import java.util.Collection; @@ -277,23 +277,23 @@ public final TOPS_1 groupBy(Collection groupByColumns) { } @Override - public final TOPS_1 aggAllBy(Key key) { - return adapt(delegate.aggAllBy(key)); + public final TOPS_1 aggAllBy(AggSpec spec) { + return adapt(delegate.aggAllBy(spec)); } @Override - public final TOPS_1 aggAllBy(Key key, String... groupByColumns) { - return adapt(delegate.aggAllBy(key, groupByColumns)); + public final TOPS_1 aggAllBy(AggSpec spec, String... groupByColumns) { + return adapt(delegate.aggAllBy(spec, groupByColumns)); } @Override - public final TOPS_1 aggAllBy(Key key, Selectable... groupByColumns) { - return adapt(delegate.aggAllBy(key, groupByColumns)); + public final TOPS_1 aggAllBy(AggSpec spec, Selectable... groupByColumns) { + return adapt(delegate.aggAllBy(spec, groupByColumns)); } @Override - public final TOPS_1 aggAllBy(Key key, Collection groupByColumns) { - return adapt(delegate.aggAllBy(key, groupByColumns)); + public final TOPS_1 aggAllBy(AggSpec spec, Collection groupByColumns) { + return adapt(delegate.aggAllBy(spec, groupByColumns)); } @Override diff --git a/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java b/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java index 9e98384c911..bd949b5ded2 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java +++ b/table-api/src/main/java/io/deephaven/api/agg/Aggregation.java @@ -1,7 +1,7 @@ package io.deephaven.api.agg; -import io.deephaven.api.agg.KeyedAggregations.Builder; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.NormalAggregations.Builder; +import io.deephaven.api.agg.spec.AggSpec; import java.io.Serializable; import java.util.Collection; @@ -11,20 +11,20 @@ * * @see io.deephaven.api.TableOperations#aggBy(Collection, Collection) * @see Count - * @see KeyedAggregation - * @see KeyedAggregations + * @see NormalAggregation + * @see NormalAggregations */ public interface Aggregation extends Serializable { - static KeyedAggregation of(Key key, String pair) { - return KeyedAggregation.of(key, Pair.parse(pair)); + static NormalAggregation of(AggSpec spec, String pair) { + return NormalAggregation.of(spec, Pair.parse(pair)); } - static Aggregation of(Key key, String... pairs) { + static Aggregation of(AggSpec spec, String... pairs) { if (pairs.length == 1) { - return of(key, pairs[0]); + return of(spec, pairs[0]); } - final Builder builder = KeyedAggregations.builder().key(key); + final Builder builder = NormalAggregations.builder().spec(spec); for (String pair : pairs) { builder.addPairs(Pair.parse(pair)); } @@ -32,11 +32,11 @@ static Aggregation of(Key key, String... pairs) { } static Aggregation AggAbsSum(String... pairs) { - return of(Key.absSum(), pairs); + return of(AggSpec.absSum(), pairs); } static Aggregation AggAvg(String... pairs) { - return of(Key.avg(), pairs); + return of(AggSpec.avg(), pairs); } static Aggregation AggCount(String resultColumn) { @@ -44,99 +44,99 @@ static Aggregation AggCount(String resultColumn) { } static Aggregation AggCountDistinct(String... pairs) { - return of(Key.countDistinct(), pairs); + return of(AggSpec.countDistinct(), pairs); } static Aggregation AggCountDistinct(boolean countNulls, String... pairs) { - return of(Key.countDistinct(countNulls), pairs); + return of(AggSpec.countDistinct(countNulls), pairs); } static Aggregation AggDistinct(String... pairs) { - return of(Key.distinct(), pairs); + return of(AggSpec.distinct(), pairs); } static Aggregation AggDistinct(boolean includeNulls, String... pairs) { - return of(Key.distinct(includeNulls), pairs); + return of(AggSpec.distinct(includeNulls), pairs); } static Aggregation AggFirst(String... pairs) { - return of(Key.first(), pairs); + return of(AggSpec.first(), pairs); } static Aggregation AggGroup(String... pairs) { - return of(Key.group(), pairs); + return of(AggSpec.group(), pairs); } static Aggregation AggLast(String... pairs) { - return of(Key.last(), pairs); + return of(AggSpec.last(), pairs); } static Aggregation AggMax(String... pairs) { - return of(Key.max(), pairs); + return of(AggSpec.max(), pairs); } static Aggregation AggMed(String... pairs) { - return of(Key.median(), pairs); + return of(AggSpec.median(), pairs); } static Aggregation AggMed(boolean average, String... pairs) { - return of(Key.median(average), pairs); + return of(AggSpec.median(average), pairs); } static Aggregation AggMin(String... pairs) { - return of(Key.min(), pairs); + return of(AggSpec.min(), pairs); } static Aggregation AggPct(double percentile, String... pairs) { - return of(Key.percentile(percentile), pairs); + return of(AggSpec.percentile(percentile), pairs); } static Aggregation AggPct(double percentile, boolean average, String... pairs) { - return of(Key.percentile(percentile, average), pairs); + return of(AggSpec.percentile(percentile, average), pairs); } static Aggregation AggSortedFirst(String sortedColumn, String... pairs) { - return of(Key.sortedFirst(sortedColumn), pairs); + return of(AggSpec.sortedFirst(sortedColumn), pairs); } static Aggregation AggSortedFirst(Collection sortedColumns, String... pairs) { - return of(Key.sortedFirst(sortedColumns), pairs); + return of(AggSpec.sortedFirst(sortedColumns), pairs); } static Aggregation AggSortedLast(String sortedColumn, String... pairs) { - return of(Key.sortedLast(sortedColumn), pairs); + return of(AggSpec.sortedLast(sortedColumn), pairs); } static Aggregation AggSortedLast(Collection sortedColumns, String... pairs) { - return of(Key.sortedLast(sortedColumns), pairs); + return of(AggSpec.sortedLast(sortedColumns), pairs); } static Aggregation AggStd(String... pairs) { - return of(Key.std(), pairs); + return of(AggSpec.std(), pairs); } static Aggregation AggSum(String... pairs) { - return of(Key.sum(), pairs); + return of(AggSpec.sum(), pairs); } static Aggregation AggUnique(String... pairs) { - return of(Key.unique(), pairs); + return of(AggSpec.unique(), pairs); } static Aggregation AggUnique(boolean includeNulls, String... pairs) { - return of(Key.unique(includeNulls), pairs); + return of(AggSpec.unique(includeNulls), pairs); } static Aggregation AggVar(String... pairs) { - return of(Key.var(), pairs); + return of(AggSpec.var(), pairs); } static Aggregation AggWAvg(String weightColumn, String... pairs) { - return of(Key.wavg(weightColumn), pairs); + return of(AggSpec.wavg(weightColumn), pairs); } static Aggregation AggWSum(String weightColumn, String... pairs) { - return of(Key.wsum(weightColumn), pairs); + return of(AggSpec.wsum(weightColumn), pairs); } V walk(V visitor); @@ -144,8 +144,8 @@ static Aggregation AggWSum(String weightColumn, String... pairs) { interface Visitor { void visit(Count count); - void visit(KeyedAggregation keyedAgg); + void visit(NormalAggregation normalAgg); - void visit(KeyedAggregations keyedAggs); + void visit(NormalAggregations normalAggs); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java b/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java index a9127c8aa56..66e1a2e5bc7 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java +++ b/table-api/src/main/java/io/deephaven/api/agg/AggregationOptimizer.java @@ -1,7 +1,7 @@ package io.deephaven.api.agg; import io.deephaven.api.ColumnName; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import java.util.ArrayList; import java.util.Collection; @@ -10,14 +10,14 @@ import java.util.Map.Entry; /** - * Optimizes a collection of {@link Aggregation aggregations} by grouping like-keyed aggregations together. + * Optimizes a collection of {@link Aggregation aggregations} by grouping like-speccedd aggregations together. */ public final class AggregationOptimizer implements Aggregation.Visitor { private static final Object COUNT_OBJ = new Object(); /** - * Optimizes a collection of {@link Aggregation aggregations} by grouping like-keyed aggregations together. The - * input order will be preserved based on the key-encountered order. + * Optimizes a collection of {@link Aggregation aggregations} by grouping like-specced aggregations together. The + * input order will be preserved based on the spec-encountered order. * * @param aggregations the aggregations * @return the optimized aggregations @@ -40,9 +40,9 @@ public List build() { out.add(Count.of((ColumnName) pair)); } } else if (e.getValue().size() == 1) { - out.add(KeyedAggregation.of((Key) e.getKey(), e.getValue().get(0))); + out.add(NormalAggregation.of((AggSpec) e.getKey(), e.getValue().get(0))); } else { - out.add(KeyedAggregations.builder().key((Key) e.getKey()).addAllPairs(e.getValue()).build()); + out.add(NormalAggregations.builder().spec((AggSpec) e.getKey()).addAllPairs(e.getValue()).build()); } } return out; @@ -54,13 +54,13 @@ public void visit(Count count) { } @Override - public void visit(KeyedAggregation keyedAgg) { - visitOrder.computeIfAbsent(keyedAgg.key(), k -> new ArrayList<>()).add(keyedAgg.pair()); + public void visit(NormalAggregation normalAgg) { + visitOrder.computeIfAbsent(normalAgg.spec(), k -> new ArrayList<>()).add(normalAgg.pair()); } @Override - public void visit(KeyedAggregations keyedAggs) { - visitOrder.computeIfAbsent(keyedAggs.key(), k -> new ArrayList<>()) - .addAll(keyedAggs.pairs()); + public void visit(NormalAggregations normalAggs) { + visitOrder.computeIfAbsent(normalAggs.spec(), k -> new ArrayList<>()) + .addAll(normalAggs.pairs()); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/AggregationOutputs.java b/table-api/src/main/java/io/deephaven/api/agg/AggregationOutputs.java index 83dde217b99..b145b2b37cc 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/AggregationOutputs.java +++ b/table-api/src/main/java/io/deephaven/api/agg/AggregationOutputs.java @@ -31,12 +31,12 @@ public void visit(Count count) { } @Override - public void visit(KeyedAggregation keyedAgg) { - out = Stream.of(keyedAgg.pair().output()); + public void visit(NormalAggregation normalAgg) { + out = Stream.of(normalAgg.pair().output()); } @Override - public void visit(KeyedAggregations keyedAggs) { - out = keyedAggs.pairs().stream().map(Pair::output); + public void visit(NormalAggregations normalAggs) { + out = normalAggs.pairs().stream().map(Pair::output); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregation.java b/table-api/src/main/java/io/deephaven/api/agg/NormalAggregation.java similarity index 51% rename from table-api/src/main/java/io/deephaven/api/agg/KeyedAggregation.java rename to table-api/src/main/java/io/deephaven/api/agg/NormalAggregation.java index 6a92b634a21..b115e401f73 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregation.java +++ b/table-api/src/main/java/io/deephaven/api/agg/NormalAggregation.java @@ -1,23 +1,23 @@ package io.deephaven.api.agg; import io.deephaven.annotations.SimpleStyle; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import org.immutables.value.Value.Immutable; import org.immutables.value.Value.Parameter; /** - * A keyed aggregation is an {@link Aggregation} that is composed of a {@link #key() key} and a {@link #pair() pair}. + * A normal aggregation is an {@link Aggregation} that is composed of a {@link #spec() spec} and a {@link #pair() pair}. */ @Immutable @SimpleStyle -public abstract class KeyedAggregation implements Aggregation { +public abstract class NormalAggregation implements Aggregation { - public static KeyedAggregation of(Key key, Pair pair) { - return ImmutableKeyedAggregation.of(key, pair); + public static NormalAggregation of(AggSpec spec, Pair pair) { + return ImmutableNormalAggregation.of(spec, pair); } @Parameter - public abstract Key key(); + public abstract AggSpec spec(); @Parameter public abstract Pair pair(); diff --git a/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregations.java b/table-api/src/main/java/io/deephaven/api/agg/NormalAggregations.java similarity index 66% rename from table-api/src/main/java/io/deephaven/api/agg/KeyedAggregations.java rename to table-api/src/main/java/io/deephaven/api/agg/NormalAggregations.java index bea759c36a1..0ef97956140 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/KeyedAggregations.java +++ b/table-api/src/main/java/io/deephaven/api/agg/NormalAggregations.java @@ -1,25 +1,25 @@ package io.deephaven.api.agg; import io.deephaven.annotations.BuildableStyle; -import io.deephaven.api.agg.key.Key; +import io.deephaven.api.agg.spec.AggSpec; import org.immutables.value.Value.Check; import org.immutables.value.Value.Immutable; import java.util.List; /** - * Keyed aggregations is an {@link Aggregation} that is composed of a {@link #key() key} and multiple {@link #pairs() + * Normal aggregations is an {@link Aggregation} that is composed of a {@link #spec() spec} and multiple {@link #pairs() * pairs}. */ @Immutable @BuildableStyle -public abstract class KeyedAggregations implements Aggregation { +public abstract class NormalAggregations implements Aggregation { public static Builder builder() { - return ImmutableKeyedAggregations.builder(); + return ImmutableNormalAggregations.builder(); } - public abstract Key key(); + public abstract AggSpec spec(); public abstract List pairs(); @@ -33,12 +33,12 @@ public final V walk(V visitor) { final void checkSize() { if (pairs().size() < 2) { throw new IllegalArgumentException( - String.format("%s should have at least two pairs", KeyedAggregations.class)); + String.format("%s should have at least two pairs", NormalAggregations.class)); } } public interface Builder { - Builder key(Key key); + Builder spec(AggSpec key); Builder addPairs(Pair element); @@ -46,6 +46,6 @@ public interface Builder { Builder addAllPairs(Iterable elements); - KeyedAggregations build(); + NormalAggregations build(); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/Pair.java b/table-api/src/main/java/io/deephaven/api/agg/Pair.java index cc5161a4ea5..bd527bbb50f 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/Pair.java +++ b/table-api/src/main/java/io/deephaven/api/agg/Pair.java @@ -7,8 +7,8 @@ /** * A column pair represents an {@link #input() input} and an {@link #output() output} column. * - * @see KeyedAggregation - * @see KeyedAggregations + * @see NormalAggregation + * @see NormalAggregations */ public interface Pair extends Serializable { diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/Key.java b/table-api/src/main/java/io/deephaven/api/agg/key/Key.java deleted file mode 100644 index 3b8a4e1d506..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/key/Key.java +++ /dev/null @@ -1,176 +0,0 @@ -package io.deephaven.api.agg.key; - -import io.deephaven.api.ColumnName; -import io.deephaven.api.SortColumn; -import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.KeyedAggregation; -import io.deephaven.api.agg.Pair; - -import java.util.Arrays; -import java.util.Collection; - -/** - * A key represents the configurable options for {@link KeyedAggregation}, except for the input/output {@link Pair}. - */ -public interface Key { - - static KeyAbsSum absSum() { - return KeyAbsSum.of(); - } - - static KeyAvg avg() { - return KeyAvg.of(); - } - - static KeyCountDistinct countDistinct() { - return KeyCountDistinct.of(); - } - - static KeyCountDistinct countDistinct(boolean countNulls) { - return KeyCountDistinct.of(countNulls); - } - - static KeyDistinct distinct() { - return KeyDistinct.of(); - } - - static KeyDistinct distinct(boolean includeNulls) { - return KeyDistinct.of(includeNulls); - } - - static KeyFirst first() { - return KeyFirst.of(); - } - - static KeyGroup group() { - return KeyGroup.of(); - } - - static KeyLast last() { - return KeyLast.of(); - } - - static KeyMax max() { - return KeyMax.of(); - } - - static KeyMedian median() { - return KeyMedian.of(); - } - - static KeyMedian median(boolean averageMedian) { - return KeyMedian.of(averageMedian); - } - - static KeyMin min() { - return KeyMin.of(); - } - - static KeyPct percentile(double percentile) { - return KeyPct.of(percentile); - } - - static KeyPct percentile(double percentile, boolean averageMedian) { - return KeyPct.of(percentile, averageMedian); - } - - static KeySortedFirst sortedFirst(String... columns) { - return sortedFirst(Arrays.asList(columns)); - } - - static KeySortedFirst sortedFirst(Collection columns) { - final KeySortedFirst.Builder builder = KeySortedFirst.builder(); - for (String column : columns) { - builder.addColumns(SortColumn.asc(ColumnName.of(column))); - } - return builder.build(); - } - - static KeySortedLast sortedLast(String... columns) { - return sortedLast(Arrays.asList(columns)); - } - - static KeySortedLast sortedLast(Collection columns) { - final KeySortedLast.Builder builder = KeySortedLast.builder(); - for (String column : columns) { - builder.addColumns(SortColumn.asc(ColumnName.of(column))); - } - return builder.build(); - } - - static KeyStd std() { - return KeyStd.of(); - } - - static KeySum sum() { - return KeySum.of(); - } - - static KeyUnique unique() { - return KeyUnique.of(); - } - - static KeyUnique unique(boolean includeNulls) { - return KeyUnique.of(includeNulls); - } - - static KeyVar var() { - return KeyVar.of(); - } - - static KeyWAvg wavg(String weightColumn) { - return KeyWAvg.of(ColumnName.of(weightColumn)); - } - - static KeyWSum wsum(String weightColumn) { - return KeyWSum.of(ColumnName.of(weightColumn)); - } - - KeyedAggregation aggregation(Pair pair); - - Aggregation aggregation(Pair... pairs); - - Aggregation aggregation(Collection pairs); - - V walk(V visitor); - - interface Visitor { - void visit(KeyAbsSum absSum); - - void visit(KeyCountDistinct countDistinct); - - void visit(KeyDistinct distinct); - - void visit(KeyGroup group); - - void visit(KeyAvg avg); - - void visit(KeyFirst first); - - void visit(KeyLast last); - - void visit(KeyMax max); - - void visit(KeyMedian median); - - void visit(KeyMin min); - - void visit(KeyPct pct); - - void visit(KeySortedFirst sortedFirst); - - void visit(KeySortedLast sortedLast); - - void visit(KeyStd std); - - void visit(KeySum sum); - - void visit(KeyUnique unique); - - void visit(KeyWAvg wAvg); - - void visit(KeyWSum wSum); - - void visit(KeyVar var); - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyDistinct.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyDistinct.java deleted file mode 100644 index dfe51eda561..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyDistinct.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.deephaven.api.agg.key; - -import io.deephaven.annotations.BuildableStyle; -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Default; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@BuildableStyle -public abstract class KeyDistinct extends KeyBase { - - public static KeyDistinct of() { - return ImmutableKeyDistinct.builder().build(); - } - - public static KeyDistinct of(boolean includeNulls) { - return ImmutableKeyDistinct.builder().includeNulls(includeNulls).build(); - } - - @Default - public boolean includeNulls() { - return false; - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyLast.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyLast.java deleted file mode 100644 index f023620e806..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyLast.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.deephaven.api.agg.key; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; - -@Immutable -@SimpleStyle -public abstract class KeyLast extends KeyEmptyBase { - - public static KeyLast of() { - return ImmutableKeyLast.of(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMax.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMax.java deleted file mode 100644 index 44a240f6e59..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMax.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.deephaven.api.agg.key; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; - -@Immutable -@SimpleStyle -public abstract class KeyMax extends KeyEmptyBase { - - public static KeyMax of() { - return ImmutableKeyMax.of(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMin.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyMin.java deleted file mode 100644 index 89f3ee371f7..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMin.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.deephaven.api.agg.key; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; - -@Immutable -@SimpleStyle -public abstract class KeyMin extends KeyEmptyBase { - - public static KeyMin of() { - return ImmutableKeyMin.of(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyStd.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyStd.java deleted file mode 100644 index 0529515de77..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyStd.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.deephaven.api.agg.key; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; - -@Immutable -@SimpleStyle -public abstract class KeyStd extends KeyEmptyBase { - - public static KeyStd of() { - return ImmutableKeyStd.of(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeySum.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeySum.java deleted file mode 100644 index 52357fc05bd..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeySum.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.deephaven.api.agg.key; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; - -@Immutable -@SimpleStyle -public abstract class KeySum extends KeyEmptyBase { - - public static KeySum of() { - return ImmutableKeySum.of(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyUnique.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyUnique.java deleted file mode 100644 index 88c8fa88857..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyUnique.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.deephaven.api.agg.key; - -import io.deephaven.annotations.BuildableStyle; -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Default; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@BuildableStyle -public abstract class KeyUnique extends KeyBase { - - public static KeyUnique of() { - return ImmutableKeyUnique.builder().build(); - } - - public static KeyUnique of(boolean includeNulls) { - return ImmutableKeyUnique.builder().includeNulls(includeNulls).build(); - } - - @Default - public boolean includeNulls() { - return false; - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyVar.java b/table-api/src/main/java/io/deephaven/api/agg/key/KeyVar.java deleted file mode 100644 index 32f74ad4191..00000000000 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyVar.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.deephaven.api.agg.key; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; - -@Immutable -@SimpleStyle -public abstract class KeyVar extends KeyEmptyBase { - - public static KeyVar of() { - return ImmutableKeyVar.of(); - } - - @Override - public final V walk(V visitor) { - visitor.visit(this); - return visitor; - } -} diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpec.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpec.java new file mode 100644 index 00000000000..eead6eef1e8 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpec.java @@ -0,0 +1,176 @@ +package io.deephaven.api.agg.spec; + +import io.deephaven.api.ColumnName; +import io.deephaven.api.SortColumn; +import io.deephaven.api.agg.Aggregation; +import io.deephaven.api.agg.NormalAggregation; +import io.deephaven.api.agg.Pair; + +import java.util.Arrays; +import java.util.Collection; + +/** + * An aggregation specification represents the configurable options for aggregations. + */ +public interface AggSpec { + + static AggSpecAbsSum absSum() { + return AggSpecAbsSum.of(); + } + + static AggSpecAvg avg() { + return AggSpecAvg.of(); + } + + static AggSpecCountDistinct countDistinct() { + return AggSpecCountDistinct.of(); + } + + static AggSpecCountDistinct countDistinct(boolean countNulls) { + return AggSpecCountDistinct.of(countNulls); + } + + static AggSpecDistinct distinct() { + return AggSpecDistinct.of(); + } + + static AggSpecDistinct distinct(boolean includeNulls) { + return AggSpecDistinct.of(includeNulls); + } + + static AggSpecFirst first() { + return AggSpecFirst.of(); + } + + static AggSpecGroup group() { + return AggSpecGroup.of(); + } + + static AggSpecLast last() { + return AggSpecLast.of(); + } + + static AggSpecMax max() { + return AggSpecMax.of(); + } + + static AggSpecMedian median() { + return AggSpecMedian.of(); + } + + static AggSpecMedian median(boolean averageMedian) { + return AggSpecMedian.of(averageMedian); + } + + static AggSpecMin min() { + return AggSpecMin.of(); + } + + static AggSpecPercentile percentile(double percentile) { + return AggSpecPercentile.of(percentile); + } + + static AggSpecPercentile percentile(double percentile, boolean averageMedian) { + return AggSpecPercentile.of(percentile, averageMedian); + } + + static AggSpecSortedFirst sortedFirst(String... columns) { + return sortedFirst(Arrays.asList(columns)); + } + + static AggSpecSortedFirst sortedFirst(Collection columns) { + final AggSpecSortedFirst.Builder builder = AggSpecSortedFirst.builder(); + for (String column : columns) { + builder.addColumns(SortColumn.asc(ColumnName.of(column))); + } + return builder.build(); + } + + static AggSpecSortedLast sortedLast(String... columns) { + return sortedLast(Arrays.asList(columns)); + } + + static AggSpecSortedLast sortedLast(Collection columns) { + final AggSpecSortedLast.Builder builder = AggSpecSortedLast.builder(); + for (String column : columns) { + builder.addColumns(SortColumn.asc(ColumnName.of(column))); + } + return builder.build(); + } + + static AggSpecStd std() { + return AggSpecStd.of(); + } + + static AggSpecSum sum() { + return AggSpecSum.of(); + } + + static AggSpecUnique unique() { + return AggSpecUnique.of(); + } + + static AggSpecUnique unique(boolean includeNulls) { + return AggSpecUnique.of(includeNulls); + } + + static AggSpecVar var() { + return AggSpecVar.of(); + } + + static AggSpecWAvg wavg(String weightColumn) { + return AggSpecWAvg.of(ColumnName.of(weightColumn)); + } + + static AggSpecWSum wsum(String weightColumn) { + return AggSpecWSum.of(ColumnName.of(weightColumn)); + } + + NormalAggregation aggregation(Pair pair); + + Aggregation aggregation(Pair... pairs); + + Aggregation aggregation(Collection pairs); + + V walk(V visitor); + + interface Visitor { + void visit(AggSpecAbsSum absSum); + + void visit(AggSpecCountDistinct countDistinct); + + void visit(AggSpecDistinct distinct); + + void visit(AggSpecGroup group); + + void visit(AggSpecAvg avg); + + void visit(AggSpecFirst first); + + void visit(AggSpecLast last); + + void visit(AggSpecMax max); + + void visit(AggSpecMedian median); + + void visit(AggSpecMin min); + + void visit(AggSpecPercentile pct); + + void visit(AggSpecSortedFirst sortedFirst); + + void visit(AggSpecSortedLast sortedLast); + + void visit(AggSpecStd std); + + void visit(AggSpecSum sum); + + void visit(AggSpecUnique unique); + + void visit(AggSpecWAvg wAvg); + + void visit(AggSpecWSum wSum); + + void visit(AggSpecVar var); + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecAbsSum.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecAbsSum.java new file mode 100644 index 00000000000..e0427a8e6c0 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecAbsSum.java @@ -0,0 +1,20 @@ +package io.deephaven.api.agg.spec; + +import io.deephaven.annotations.SimpleStyle; +import io.deephaven.api.agg.spec.ImmutableAggSpecAbsSum; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class AggSpecAbsSum extends AggSpecEmptyBase { + + public static AggSpecAbsSum of() { + return ImmutableAggSpecAbsSum.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyGroup.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecAvg.java similarity index 59% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyGroup.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecAvg.java index cf5de3d161e..899fe996db9 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyGroup.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecAvg.java @@ -1,14 +1,14 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.SimpleStyle; import org.immutables.value.Value.Immutable; @Immutable @SimpleStyle -public abstract class KeyGroup extends KeyEmptyBase { +public abstract class AggSpecAvg extends AggSpecEmptyBase { - public static KeyGroup of() { - return ImmutableKeyGroup.of(); + public static AggSpecAvg of() { + return ImmutableAggSpecAvg.of(); } @Override diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecBase.java similarity index 51% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecBase.java index d179b0be043..3facbb66fe9 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyBase.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecBase.java @@ -1,17 +1,17 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.api.agg.Aggregation; -import io.deephaven.api.agg.KeyedAggregation; -import io.deephaven.api.agg.KeyedAggregations; +import io.deephaven.api.agg.NormalAggregation; +import io.deephaven.api.agg.NormalAggregations; import io.deephaven.api.agg.Pair; import java.util.Collection; -public abstract class KeyBase implements Key { +public abstract class AggSpecBase implements AggSpec { @Override - public final KeyedAggregation aggregation(Pair pair) { - return KeyedAggregation.of(this, pair); + public final NormalAggregation aggregation(Pair pair) { + return NormalAggregation.of(this, pair); } @Override @@ -19,7 +19,7 @@ public final Aggregation aggregation(Pair... pairs) { if (pairs.length == 1) { return aggregation(pairs[0]); } - return KeyedAggregations.builder().key(this).addPairs(pairs).build(); + return NormalAggregations.builder().spec(this).addPairs(pairs).build(); } @Override @@ -27,6 +27,6 @@ public final Aggregation aggregation(Collection pairs) { if (pairs.size() == 1) { return aggregation(pairs.iterator().next()); } - return KeyedAggregations.builder().key(this).addAllPairs(pairs).build(); + return NormalAggregations.builder().spec(this).addAllPairs(pairs).build(); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyColumns.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecColumnReferences.java similarity index 59% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyColumns.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecColumnReferences.java index 1cbee996575..ce6fd7c7559 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyColumns.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecColumnReferences.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.api.ColumnName; import io.deephaven.api.SortColumn; @@ -8,10 +8,10 @@ import java.util.Set; import java.util.stream.Collectors; -public class KeyColumns implements Key.Visitor { +public class AggSpecColumnReferences implements AggSpec.Visitor { - public static Set of(Key key) { - return key.walk(new KeyColumns()).out(); + public static Set of(AggSpec key) { + return key.walk(new AggSpecColumnReferences()).out(); } private Set out; @@ -21,97 +21,97 @@ public Set out() { } @Override - public void visit(KeyAbsSum absSum) { + public void visit(AggSpecAbsSum absSum) { out = Collections.emptySet(); } @Override - public void visit(KeyCountDistinct countDistinct) { + public void visit(AggSpecCountDistinct countDistinct) { out = Collections.emptySet(); } @Override - public void visit(KeyDistinct distinct) { + public void visit(AggSpecDistinct distinct) { out = Collections.emptySet(); } @Override - public void visit(KeyGroup group) { + public void visit(AggSpecGroup group) { out = Collections.emptySet(); } @Override - public void visit(KeyAvg avg) { + public void visit(AggSpecAvg avg) { out = Collections.emptySet(); } @Override - public void visit(KeyFirst first) { + public void visit(AggSpecFirst first) { out = Collections.emptySet(); } @Override - public void visit(KeyLast last) { + public void visit(AggSpecLast last) { out = Collections.emptySet(); } @Override - public void visit(KeyMax max) { + public void visit(AggSpecMax max) { out = Collections.emptySet(); } @Override - public void visit(KeyMedian median) { + public void visit(AggSpecMedian median) { out = Collections.emptySet(); } @Override - public void visit(KeyMin min) { + public void visit(AggSpecMin min) { out = Collections.emptySet(); } @Override - public void visit(KeyPct pct) { + public void visit(AggSpecPercentile pct) { out = Collections.emptySet(); } @Override - public void visit(KeySortedFirst sortedFirst) { + public void visit(AggSpecSortedFirst sortedFirst) { out = sortedFirst.columns().stream().map(SortColumn::column).collect(Collectors.toSet()); } @Override - public void visit(KeySortedLast sortedLast) { + public void visit(AggSpecSortedLast sortedLast) { out = sortedLast.columns().stream().map(SortColumn::column).collect(Collectors.toSet()); } @Override - public void visit(KeyStd std) { + public void visit(AggSpecStd std) { out = Collections.emptySet(); } @Override - public void visit(KeySum sum) { + public void visit(AggSpecSum sum) { out = Collections.emptySet(); } @Override - public void visit(KeyUnique unique) { + public void visit(AggSpecUnique unique) { out = Collections.emptySet(); } @Override - public void visit(KeyWAvg wAvg) { + public void visit(AggSpecWAvg wAvg) { out = Collections.singleton(wAvg.weight()); } @Override - public void visit(KeyWSum wSum) { + public void visit(AggSpecWSum wSum) { out = Collections.singleton(wSum.weight()); } @Override - public void visit(KeyVar var) { + public void visit(AggSpecVar var) { out = Collections.emptySet(); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyCountDistinct.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecCountDistinct.java similarity index 51% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyCountDistinct.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecCountDistinct.java index 005c58b7873..33a28a645d3 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyCountDistinct.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecCountDistinct.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.BuildableStyle; import org.immutables.value.Value.Default; @@ -6,14 +6,14 @@ @Immutable @BuildableStyle -public abstract class KeyCountDistinct extends KeyBase { +public abstract class AggSpecCountDistinct extends AggSpecBase { - public static KeyCountDistinct of() { - return ImmutableKeyCountDistinct.builder().build(); + public static AggSpecCountDistinct of() { + return ImmutableAggSpecCountDistinct.builder().build(); } - public static KeyCountDistinct of(boolean countNulls) { - return ImmutableKeyCountDistinct.builder().countNulls(countNulls).build(); + public static AggSpecCountDistinct of(boolean countNulls) { + return ImmutableAggSpecCountDistinct.builder().countNulls(countNulls).build(); } @Default diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecDistinct.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecDistinct.java new file mode 100644 index 00000000000..8d0df906a5c --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecDistinct.java @@ -0,0 +1,29 @@ +package io.deephaven.api.agg.spec; + +import io.deephaven.annotations.BuildableStyle; +import org.immutables.value.Value.Default; +import org.immutables.value.Value.Immutable; + +@Immutable +@BuildableStyle +public abstract class AggSpecDistinct extends AggSpecBase { + + public static AggSpecDistinct of() { + return ImmutableAggSpecDistinct.builder().build(); + } + + public static AggSpecDistinct of(boolean includeNulls) { + return ImmutableAggSpecDistinct.builder().includeNulls(includeNulls).build(); + } + + @Default + public boolean includeNulls() { + return false; + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyEmptyBase.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecEmptyBase.java similarity index 76% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyEmptyBase.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecEmptyBase.java index 928423f1ce0..719d6fd0f04 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyEmptyBase.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecEmptyBase.java @@ -1,6 +1,6 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; -public abstract class KeyEmptyBase extends KeyBase { +public abstract class AggSpecEmptyBase extends AggSpecBase { @Override public final int hashCode() { diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecFirst.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecFirst.java new file mode 100644 index 00000000000..b624f535faa --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecFirst.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.spec; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class AggSpecFirst extends AggSpecEmptyBase { + + public static AggSpecFirst of() { + return ImmutableAggSpecFirst.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecGroup.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecGroup.java new file mode 100644 index 00000000000..6134dacee5f --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecGroup.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.spec; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class AggSpecGroup extends AggSpecEmptyBase { + + public static AggSpecGroup of() { + return ImmutableAggSpecGroup.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecLast.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecLast.java new file mode 100644 index 00000000000..3f2590629f8 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecLast.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.spec; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class AggSpecLast extends AggSpecEmptyBase { + + public static AggSpecLast of() { + return ImmutableAggSpecLast.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyAvg.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecMax.java similarity index 59% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyAvg.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecMax.java index 6399c942c56..1f332aebbeb 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyAvg.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecMax.java @@ -1,14 +1,14 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.SimpleStyle; import org.immutables.value.Value.Immutable; @Immutable @SimpleStyle -public abstract class KeyAvg extends KeyEmptyBase { +public abstract class AggSpecMax extends AggSpecEmptyBase { - public static KeyAvg of() { - return ImmutableKeyAvg.of(); + public static AggSpecMax of() { + return ImmutableAggSpecMax.of(); } @Override diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecMedian.java similarity index 53% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecMedian.java index efd12538e0b..1cc4a5bd950 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyMedian.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecMedian.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.BuildableStyle; import org.immutables.value.Value.Default; @@ -6,14 +6,14 @@ @Immutable @BuildableStyle -public abstract class KeyMedian extends KeyBase { +public abstract class AggSpecMedian extends AggSpecBase { - public static KeyMedian of() { - return ImmutableKeyMedian.builder().build(); + public static AggSpecMedian of() { + return ImmutableAggSpecMedian.builder().build(); } - public static KeyMedian of(boolean averageMedian) { - return ImmutableKeyMedian.builder().averageMedian(averageMedian).build(); + public static AggSpecMedian of(boolean averageMedian) { + return ImmutableAggSpecMedian.builder().averageMedian(averageMedian).build(); } @Default diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyFirst.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecMin.java similarity index 59% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyFirst.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecMin.java index 42c070fc69f..9bda455a44d 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyFirst.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecMin.java @@ -1,14 +1,14 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.SimpleStyle; import org.immutables.value.Value.Immutable; @Immutable @SimpleStyle -public abstract class KeyFirst extends KeyEmptyBase { +public abstract class AggSpecMin extends AggSpecEmptyBase { - public static KeyFirst of() { - return ImmutableKeyFirst.of(); + public static AggSpecMin of() { + return ImmutableAggSpecMin.of(); } @Override diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecPercentile.java similarity index 60% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecPercentile.java index 83b8e8ed915..161fafd3481 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyPct.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecPercentile.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.BuildableStyle; import org.immutables.value.Value.Check; @@ -7,14 +7,14 @@ @Immutable @BuildableStyle -public abstract class KeyPct extends KeyBase { +public abstract class AggSpecPercentile extends AggSpecBase { - public static KeyPct of(double percentile) { - return ImmutableKeyPct.builder().percentile(percentile).build(); + public static AggSpecPercentile of(double percentile) { + return ImmutableAggSpecPercentile.builder().percentile(percentile).build(); } - public static KeyPct of(double percentile, boolean averageMedian) { - return ImmutableKeyPct.builder().percentile(percentile).averageMedian(averageMedian).build(); + public static AggSpecPercentile of(double percentile, boolean averageMedian) { + return ImmutableAggSpecPercentile.builder().percentile(percentile).averageMedian(averageMedian).build(); } public abstract double percentile(); diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeySortedFirst.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedFirst.java similarity index 87% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeySortedFirst.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedFirst.java index 558ee5f2abd..b09704cfd32 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeySortedFirst.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedFirst.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.BuildableStyle; import io.deephaven.api.SortColumn; @@ -15,10 +15,10 @@ */ @Immutable @BuildableStyle -public abstract class KeySortedFirst extends KeyBase { +public abstract class AggSpecSortedFirst extends AggSpecBase { public static Builder builder() { - return ImmutableKeySortedFirst.builder(); + return ImmutableAggSpecSortedFirst.builder(); } public abstract List columns(); @@ -39,7 +39,7 @@ final void nonEmptyColumns() { @Check final void checkSortOrder() { // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction - if (!columns().stream().map(SortColumn::order).allMatch(KeySortedFirst::isAscending)) { + if (!columns().stream().map(SortColumn::order).allMatch(AggSpecSortedFirst::isAscending)) { throw new IllegalArgumentException( "Can only construct KeySortedFirst with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); } @@ -56,6 +56,6 @@ public interface Builder { Builder addAllColumns(Iterable elements); - KeySortedFirst build(); + AggSpecSortedFirst build(); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeySortedLast.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedLast.java similarity index 88% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeySortedLast.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedLast.java index 79ece78a6da..af78a89f20e 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeySortedLast.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedLast.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.BuildableStyle; import io.deephaven.api.SortColumn; @@ -15,10 +15,10 @@ */ @Immutable @BuildableStyle -public abstract class KeySortedLast extends KeyBase { +public abstract class AggSpecSortedLast extends AggSpecBase { public static Builder builder() { - return ImmutableKeySortedLast.builder(); + return ImmutableAggSpecSortedLast.builder(); } public abstract List columns(); @@ -39,7 +39,7 @@ final void nonEmptyColumns() { @Check final void checkSortOrder() { // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction - if (!columns().stream().map(SortColumn::order).allMatch(KeySortedLast::isAscending)) { + if (!columns().stream().map(SortColumn::order).allMatch(AggSpecSortedLast::isAscending)) { throw new IllegalArgumentException( "Can only construct KeySortedLast with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); } @@ -56,6 +56,6 @@ public interface Builder { Builder addAllColumns(Iterable elements); - KeySortedLast build(); + AggSpecSortedLast build(); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyAbsSum.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecStd.java similarity index 59% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyAbsSum.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecStd.java index 60e036fc0e5..2698bcf18f5 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyAbsSum.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecStd.java @@ -1,14 +1,14 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.SimpleStyle; import org.immutables.value.Value.Immutable; @Immutable @SimpleStyle -public abstract class KeyAbsSum extends KeyEmptyBase { +public abstract class AggSpecStd extends AggSpecEmptyBase { - public static KeyAbsSum of() { - return ImmutableKeyAbsSum.of(); + public static AggSpecStd of() { + return ImmutableAggSpecStd.of(); } @Override diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSum.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSum.java new file mode 100644 index 00000000000..b33e471913c --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSum.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.spec; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class AggSpecSum extends AggSpecEmptyBase { + + public static AggSpecSum of() { + return ImmutableAggSpecSum.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecUnique.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecUnique.java new file mode 100644 index 00000000000..08bb12b3d57 --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecUnique.java @@ -0,0 +1,29 @@ +package io.deephaven.api.agg.spec; + +import io.deephaven.annotations.BuildableStyle; +import org.immutables.value.Value.Default; +import org.immutables.value.Value.Immutable; + +@Immutable +@BuildableStyle +public abstract class AggSpecUnique extends AggSpecBase { + + public static AggSpecUnique of() { + return ImmutableAggSpecUnique.builder().build(); + } + + public static AggSpecUnique of(boolean includeNulls) { + return ImmutableAggSpecUnique.builder().includeNulls(includeNulls).build(); + } + + @Default + public boolean includeNulls() { + return false; + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecVar.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecVar.java new file mode 100644 index 00000000000..80d22d75b4d --- /dev/null +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecVar.java @@ -0,0 +1,19 @@ +package io.deephaven.api.agg.spec; + +import io.deephaven.annotations.SimpleStyle; +import org.immutables.value.Value.Immutable; + +@Immutable +@SimpleStyle +public abstract class AggSpecVar extends AggSpecEmptyBase { + + public static AggSpecVar of() { + return ImmutableAggSpecVar.of(); + } + + @Override + public final V walk(V visitor) { + visitor.visit(this); + return visitor; + } +} diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyWAvg.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecWAvg.java similarity index 67% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyWAvg.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecWAvg.java index bd7ae46beea..5789950add3 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyWAvg.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecWAvg.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.SimpleStyle; import io.deephaven.api.ColumnName; @@ -7,10 +7,10 @@ @Immutable @SimpleStyle -public abstract class KeyWAvg extends KeyBase { +public abstract class AggSpecWAvg extends AggSpecBase { - public static KeyWAvg of(ColumnName weight) { - return ImmutableKeyWAvg.of(weight); + public static AggSpecWAvg of(ColumnName weight) { + return ImmutableAggSpecWAvg.of(weight); } @Parameter diff --git a/table-api/src/main/java/io/deephaven/api/agg/key/KeyWSum.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecWSum.java similarity index 67% rename from table-api/src/main/java/io/deephaven/api/agg/key/KeyWSum.java rename to table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecWSum.java index 2e1c95a50bc..c2dcbc265b5 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/key/KeyWSum.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecWSum.java @@ -1,4 +1,4 @@ -package io.deephaven.api.agg.key; +package io.deephaven.api.agg.spec; import io.deephaven.annotations.SimpleStyle; import io.deephaven.api.ColumnName; @@ -7,10 +7,10 @@ @Immutable @SimpleStyle -public abstract class KeyWSum extends KeyBase { +public abstract class AggSpecWSum extends AggSpecBase { - public static KeyWSum of(ColumnName weight) { - return ImmutableKeyWSum.of(weight); + public static AggSpecWSum of(ColumnName weight) { + return ImmutableAggSpecWSum.of(weight); } @Parameter From 16261d352fa527a1d8601695b4e37657e839b3e2 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 2 Dec 2021 13:33:00 -0800 Subject: [PATCH 15/20] select distinct impl routing --- .../deephaven/engine/table/impl/BaseTable.java | 18 ++++++++++++++++++ .../engine/table/impl/DeferredViewTable.java | 2 +- .../engine/table/impl/HierarchicalTable.java | 7 +------ .../table/impl/PartitionAwareSourceTable.java | 2 +- .../engine/table/impl/QueryTable.java | 8 ++------ .../engine/table/impl/TableWithDefaults.java | 5 +++++ .../engine/table/impl/UncoalescedTable.java | 2 +- 7 files changed, 29 insertions(+), 15 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java index 7449c56c61b..feda2c058fc 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java @@ -6,6 +6,8 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; +import io.deephaven.api.Selectable; +import io.deephaven.api.agg.Aggregation; import io.deephaven.base.Base64; import io.deephaven.base.StringUtils; import io.deephaven.base.log.LogOutput; @@ -1000,6 +1002,22 @@ protected Table getParent() { } } + @Override + public final Table aggBy(Collection aggregations, + Collection groupByColumns) { + if (aggregations.isEmpty()) { + return selectDistinctImpl(groupByColumns); + } + return aggByImpl(aggregations, groupByColumns); + } + + protected Table selectDistinctImpl(Collection columns) { + return aggByImpl(List.of(), columns); + } + + protected abstract Table aggByImpl(Collection aggregations, + Collection groupByColumns); + @Override public Table withKeys(String... columns) { if (columns == null || columns.length == 0) { diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/DeferredViewTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/DeferredViewTable.java index 561c55dba60..b1280ab8b78 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/DeferredViewTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/DeferredViewTable.java @@ -220,7 +220,7 @@ protected Table doCoalesce() { } @Override - public Table selectDistinct(Collection selectables) { + protected Table selectDistinctImpl(Collection selectables) { final SelectColumn[] columns = SelectColumn.from(selectables); /* If the cachedResult table has already been created, we can just use that. */ if (getCoalesced() != null) { diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java index e55255434a4..94aad2af70e 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java @@ -185,7 +185,7 @@ public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { } @Override - public Table aggBy(Collection aggregations, + protected Table aggByImpl(Collection aggregations, Collection groupByColumns) { return throwUnsupported("aggBy()"); } @@ -226,11 +226,6 @@ public Table select(Collection selectColumns) { return throwUnsupported("select()"); } - @Override - public Table selectDistinct(Collection columns) { - return throwUnsupported("selectDistinct()"); - } - @Override public Table update(Collection columns) { return throwUnsupported("update()"); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/PartitionAwareSourceTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/PartitionAwareSourceTable.java index dd8056f65d1..ea1e9e49e9d 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/PartitionAwareSourceTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/PartitionAwareSourceTable.java @@ -319,7 +319,7 @@ public final Table where(final Collection filters) { } @Override - public final Table selectDistinct(Collection groupByColumns) { + protected final Table selectDistinctImpl(Collection groupByColumns) { final SelectColumn[] selectColumns = SelectColumn.from(groupByColumns); for (SelectColumn selectColumn : selectColumns) { selectColumn.initDef(definition.getColumnNameMap()); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 96db1eabf04..a3431649a00 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -605,12 +605,8 @@ public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { } @Override - public Table aggBy(final Collection aggregations, + protected Table aggByImpl(final Collection aggregations, final Collection groupByColumns) { - if (aggregations.isEmpty()) { - return selectDistinct(groupByColumns); - } - final List optimized = AggregationFactory.AggregationElement.optimizeAndConvert(aggregations); @@ -2990,7 +2986,7 @@ private RowSetBuilderRandom getUngroupIndex( } @Override - public Table selectDistinct(Collection groupByColumns) { + protected Table selectDistinctImpl(Collection groupByColumns) { return QueryPerformanceRecorder.withNugget("selectDistinct(" + groupByColumns + ")", sizeForInstrumentation(), () -> by(new SelectDistinctSpecImpl(), SelectColumn.from(groupByColumns))); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java index 374fd6c5705..05038dff93d 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java @@ -259,6 +259,11 @@ default Table select() { return select(getDefinition().getColumnNamesArray()); } + @Override + default Table selectDistinct(Collection columns) { + return aggBy(Collections.emptyList(), columns); + } + @Override @ConcurrentMethod default Table selectDistinct(Selectable... columns) { diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java index ae75fb49b6e..1a20918059a 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java @@ -355,7 +355,7 @@ public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { @Override @ConcurrentMethod - public Table aggBy(Collection aggregations, + protected Table aggByImpl(Collection aggregations, Collection groupByColumns) { return coalesce().aggBy(aggregations, groupByColumns); } From cfcf7a475c4fc958d78fed6f76999891f49755ce Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 2 Dec 2021 16:10:45 -0800 Subject: [PATCH 16/20] Final cleanup --- .../api/agg/NormalAggregations/Builder.json | 2 +- .../api/agg/spec/AggSpecColumnReferences.json | 2 +- .../table/impl/by/AggregationSpecAdapter.json | 2 +- .../deephaven/qst/table/AggregateAllByTable.json | 4 ++-- .../io/deephaven/engine/table/impl/QueryTable.java | 7 ++++--- .../table/impl/by/AggregationSpecAdapter.java | 4 ++-- .../client/examples/AggregateAllExample.java | 8 ++++---- .../java/io/deephaven/qst/TableAdapterImpl.java | 4 ++-- .../io/deephaven/qst/table/AggAllByExclusions.java | 4 ++-- .../deephaven/qst/table/AggregateAllByTable.java | 14 +++++++------- .../io/deephaven/api/agg/NormalAggregations.java | 2 +- .../api/agg/spec/AggSpecColumnReferences.java | 4 ++-- .../deephaven/api/agg/spec/AggSpecSortedFirst.java | 2 +- .../deephaven/api/agg/spec/AggSpecSortedLast.java | 2 +- 14 files changed, 31 insertions(+), 30 deletions(-) diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/NormalAggregations/Builder.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/NormalAggregations/Builder.json index a69ec97e6d9..07cba69fcc3 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/NormalAggregations/Builder.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/NormalAggregations/Builder.json @@ -4,7 +4,7 @@ "addAllPairs": ":param elements: java.lang.Iterable\n:return: io.deephaven.api.agg.NormalAggregations.Builder", "addPairs": "*Overload 1* \n :param element: io.deephaven.api.agg.Pair\n :return: io.deephaven.api.agg.NormalAggregations.Builder\n \n*Overload 2* \n :param elements: io.deephaven.api.agg.Pair...\n :return: io.deephaven.api.agg.NormalAggregations.Builder", "build": ":return: io.deephaven.api.agg.NormalAggregations", - "spec": ":param key: io.deephaven.api.agg.spec.AggSpec\n:return: io.deephaven.api.agg.NormalAggregations.Builder" + "spec": ":param spec: io.deephaven.api.agg.spec.AggSpec\n:return: io.deephaven.api.agg.NormalAggregations.Builder" }, "path": "io.deephaven.api.agg.NormalAggregations.Builder", "typeName": "interface" diff --git a/Integrations/python/deephaven/doc/io/deephaven/api/agg/spec/AggSpecColumnReferences.json b/Integrations/python/deephaven/doc/io/deephaven/api/agg/spec/AggSpecColumnReferences.json index f7b08136bf1..f5f4cd44047 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/api/agg/spec/AggSpecColumnReferences.json +++ b/Integrations/python/deephaven/doc/io/deephaven/api/agg/spec/AggSpecColumnReferences.json @@ -1,7 +1,7 @@ { "className": "io.deephaven.api.agg.spec.AggSpecColumnReferences", "methods": { - "of": ":param key: io.deephaven.api.agg.spec.AggSpec\n:return: java.util.Set", + "of": ":param spec: io.deephaven.api.agg.spec.AggSpec\n:return: java.util.Set", "out": ":return: java.util.Set", "visit": "*Overload 1* \n :param absSum: io.deephaven.api.agg.spec.AggSpecAbsSum\n \n*Overload 2* \n :param countDistinct: io.deephaven.api.agg.spec.AggSpecCountDistinct\n \n*Overload 3* \n :param distinct: io.deephaven.api.agg.spec.AggSpecDistinct\n \n*Overload 4* \n :param group: io.deephaven.api.agg.spec.AggSpecGroup\n \n*Overload 5* \n :param avg: io.deephaven.api.agg.spec.AggSpecAvg\n \n*Overload 6* \n :param first: io.deephaven.api.agg.spec.AggSpecFirst\n \n*Overload 7* \n :param last: io.deephaven.api.agg.spec.AggSpecLast\n \n*Overload 8* \n :param max: io.deephaven.api.agg.spec.AggSpecMax\n \n*Overload 9* \n :param median: io.deephaven.api.agg.spec.AggSpecMedian\n \n*Overload 10* \n :param min: io.deephaven.api.agg.spec.AggSpecMin\n \n*Overload 11* \n :param pct: io.deephaven.api.agg.spec.AggSpecPercentile\n \n*Overload 12* \n :param sortedFirst: io.deephaven.api.agg.spec.AggSpecSortedFirst\n \n*Overload 13* \n :param sortedLast: io.deephaven.api.agg.spec.AggSpecSortedLast\n \n*Overload 14* \n :param std: io.deephaven.api.agg.spec.AggSpecStd\n \n*Overload 15* \n :param sum: io.deephaven.api.agg.spec.AggSpecSum\n \n*Overload 16* \n :param unique: io.deephaven.api.agg.spec.AggSpecUnique\n \n*Overload 17* \n :param wAvg: io.deephaven.api.agg.spec.AggSpecWAvg\n \n*Overload 18* \n :param wSum: io.deephaven.api.agg.spec.AggSpecWSum\n \n*Overload 19* \n :param var: io.deephaven.api.agg.spec.AggSpecVar" }, diff --git a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.json b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.json index 6a7f3a6b648..b68ad03f094 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.json +++ b/Integrations/python/deephaven/doc/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.json @@ -1,7 +1,7 @@ { "className": "io.deephaven.engine.table.impl.by.AggregationSpecAdapter", "methods": { - "of": ":param key: io.deephaven.api.agg.spec.AggSpec\n:return: io.deephaven.engine.table.impl.by.AggregationSpec", + "of": ":param spec: io.deephaven.api.agg.spec.AggSpec\n:return: io.deephaven.engine.table.impl.by.AggregationSpec", "out": ":return: io.deephaven.engine.table.impl.by.AggregationSpec", "visit": "*Overload 1* \n :param absSum: io.deephaven.api.agg.spec.AggSpecAbsSum\n \n*Overload 2* \n :param countDistinct: io.deephaven.api.agg.spec.AggSpecCountDistinct\n \n*Overload 3* \n :param distinct: io.deephaven.api.agg.spec.AggSpecDistinct\n \n*Overload 4* \n :param group: io.deephaven.api.agg.spec.AggSpecGroup\n \n*Overload 5* \n :param avg: io.deephaven.api.agg.spec.AggSpecAvg\n \n*Overload 6* \n :param first: io.deephaven.api.agg.spec.AggSpecFirst\n \n*Overload 7* \n :param last: io.deephaven.api.agg.spec.AggSpecLast\n \n*Overload 8* \n :param max: io.deephaven.api.agg.spec.AggSpecMax\n \n*Overload 9* \n :param median: io.deephaven.api.agg.spec.AggSpecMedian\n \n*Overload 10* \n :param min: io.deephaven.api.agg.spec.AggSpecMin\n \n*Overload 11* \n :param pct: io.deephaven.api.agg.spec.AggSpecPercentile\n \n*Overload 12* \n :param sortedFirst: io.deephaven.api.agg.spec.AggSpecSortedFirst\n \n*Overload 13* \n :param sortedLast: io.deephaven.api.agg.spec.AggSpecSortedLast\n \n*Overload 14* \n :param std: io.deephaven.api.agg.spec.AggSpecStd\n \n*Overload 15* \n :param sum: io.deephaven.api.agg.spec.AggSpecSum\n \n*Overload 16* \n :param unique: io.deephaven.api.agg.spec.AggSpecUnique\n \n*Overload 17* \n :param wAvg: io.deephaven.api.agg.spec.AggSpecWAvg\n \n*Overload 18* \n :param wSum: io.deephaven.api.agg.spec.AggSpecWSum\n \n*Overload 19* \n :param var: io.deephaven.api.agg.spec.AggSpecVar" }, diff --git a/Integrations/python/deephaven/doc/io/deephaven/qst/table/AggregateAllByTable.json b/Integrations/python/deephaven/doc/io/deephaven/qst/table/AggregateAllByTable.json index cd0907ba952..899842e5929 100644 --- a/Integrations/python/deephaven/doc/io/deephaven/qst/table/AggregateAllByTable.json +++ b/Integrations/python/deephaven/doc/io/deephaven/qst/table/AggregateAllByTable.json @@ -1,9 +1,9 @@ { "className": "io.deephaven.qst.table.AggregateAllByTable", "methods": { - "asAggregation": "Transform this agg-all-by table into an AggregationTable by constructing the necessary\n Aggregation from the key and tableColumns.\n\n:param tableColumns: (java.util.Collection) - the table columns\n:return: (io.deephaven.qst.table.AggregationTable) the aggregation table", + "asAggregation": "Transform this agg-all-by table into an AggregationTable by constructing the necessary\n Aggregation from the spec() and tableColumns.\n\n:param tableColumns: (java.util.Collection) - the table columns\n:return: (io.deephaven.qst.table.AggregationTable) the aggregation table", "builder": ":return: io.deephaven.qst.table.AggregateAllByTable.Builder", - "singleAggregation": "Computes the single-aggregation from the agg-all implied by the key and groupByColumns by\n removing the groupByColumns and any extra columns implied by the key.\n\n:param key: (io.deephaven.api.agg.spec.AggSpec) - the key\n:param groupByColumns: (java.util.Collection) - the group by columns\n:param tableColumns: (java.util.Collection) - the table columns\n:return: (java.util.Optional) the aggregation, if non-empty", + "singleAggregation": "Computes the single-aggregation from the agg-all implied by the spec and groupByColumns by\n removing the groupByColumns and any extra columns implied by the spec.\n\n:param spec: (io.deephaven.api.agg.spec.AggSpec) - the spec\n:param groupByColumns: (java.util.Collection) - the group by columns\n:param tableColumns: (java.util.Collection) - the table columns\n:return: (java.util.Optional) the aggregation, if non-empty", "spec": ":return: io.deephaven.api.agg.spec.AggSpec", "walk": "Note: Java generics information - \n\n:param visitor: V\n:return: V" }, diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 49fbec91fca..19a7bea502e 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -575,13 +575,14 @@ public Table exactJoin(Table table, MatchPair[] columnsToMatch, MatchPair[] colu @Override public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { for (ColumnName name : AggSpecColumnReferences.of(spec)) { - if (!columns.containsKey(name.name())) { - throw new IllegalArgumentException("Key references column that does not exist: " + name.name()); + if (!hasColumns(name.name())) { + throw new IllegalArgumentException( + "Spec references column that does not exist: " + name.name() + " / " + spec); } } final List groupByList = Arrays.asList(groupByColumns); final List tableColumns = - columns.keySet().stream().map(ColumnName::of).collect(Collectors.toList()); + definition.getColumnNames().stream().map(ColumnName::of).collect(Collectors.toList()); final Optional agg = AggregateAllByTable.singleAggregation(spec, groupByList, tableColumns); final Table result = aggBy(agg.stream().collect(Collectors.toList()), groupByList); spec.walk(new AggAllByCopyAttributes(this, result)); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java index c05c1572e1b..b95f1627841 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/by/AggregationSpecAdapter.java @@ -30,8 +30,8 @@ public class AggregationSpecAdapter implements AggSpec.Visitor { - public static AggregationSpec of(AggSpec key) { - return key.walk(new AggregationSpecAdapter()).out(); + public static AggregationSpec of(AggSpec spec) { + return spec.walk(new AggregationSpecAdapter()).out(); } private AggregationSpec out; diff --git a/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java index 187474ba1dc..2c41107e86a 100644 --- a/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java +++ b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/AggregateAllExample.java @@ -26,7 +26,7 @@ description = "Aggregate all examples", version = "0.1.0") class AggregateAllExample extends FlightExampleBase { - private static List keys() { + private static List aggSpecs() { return Arrays.asList( AggSpec.absSum(), AggSpec.avg(), @@ -89,14 +89,14 @@ protected void execute(FlightSession flight) throws Exception { Collections.singletonList(inputKey.name())); builder.putMap("base", spec); // todo: countBy - for (AggSpec key : keys()) { - final String name = key.toString() + for (AggSpec aggSpec : aggSpecs()) { + final String name = aggSpec.toString() .replace('=', '_') .replace('{', '_') .replace('}', '_') .replace(' ', '_') .replace('.', '_'); - final TableSpec tableSpec = spec.aggAllBy(key, groupKey.name()); + final TableSpec tableSpec = spec.aggAllBy(aggSpec, groupKey.name()); builder.putMap(name, tableSpec); } final LabeledTables tables = builder.build(); diff --git a/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java b/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java index 8a83531c8be..b8e6a2e8693 100644 --- a/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java +++ b/qst/src/main/java/io/deephaven/qst/TableAdapterImpl.java @@ -229,9 +229,9 @@ public void visit(ReverseAsOfJoinTable raj) { @Override public void visit(AggregateAllByTable aggAllByTable) { - final AggSpec key = aggAllByTable.spec(); + final AggSpec spec = aggAllByTable.spec(); final Selectable[] groupByColumns = aggAllByTable.groupByColumns().toArray(new Selectable[0]); - addOp(aggAllByTable, parentOps(aggAllByTable).aggAllBy(key, groupByColumns)); + addOp(aggAllByTable, parentOps(aggAllByTable).aggAllBy(spec, groupByColumns)); } @Override diff --git a/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java b/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java index bc8c145c7ae..a33bf906b5f 100644 --- a/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java +++ b/qst/src/main/java/io/deephaven/qst/table/AggAllByExclusions.java @@ -35,10 +35,10 @@ */ final class AggAllByExclusions implements Visitor { - public static Set of(AggSpec key, Collection groupByColumns) { + public static Set of(AggSpec spec, Collection groupByColumns) { final Set exclusions = groupByColumns.stream().map(Selectable::newColumn).collect(Collectors.toSet()); - final Set otherExclusions = key.walk(new AggAllByExclusions()).out(); + final Set otherExclusions = spec.walk(new AggAllByExclusions()).out(); exclusions.addAll(otherExclusions); return exclusions; } diff --git a/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java b/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java index 9f9dde8a9b2..d03c6552382 100644 --- a/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java +++ b/qst/src/main/java/io/deephaven/qst/table/AggregateAllByTable.java @@ -22,18 +22,18 @@ public static Builder builder() { } /** - * Computes the single-aggregation from the agg-all implied by the {@code key} and {@code groupByColumns} by - * removing the {@code groupByColumns} and any extra columns implied by the {@code key}. + * Computes the single-aggregation from the agg-all implied by the {@code spec} and {@code groupByColumns} by + * removing the {@code groupByColumns} and any extra columns implied by the {@code spec}. * - * @param key the key + * @param spec the spec * @param groupByColumns the group by columns * @param tableColumns the table columns * @return the aggregation, if non-empty */ public static Optional singleAggregation( - AggSpec key, Collection groupByColumns, + AggSpec spec, Collection groupByColumns, Collection tableColumns) { - Set exclusions = AggAllByExclusions.of(key, groupByColumns); + Set exclusions = AggAllByExclusions.of(spec, groupByColumns); List columnsToAgg = new ArrayList<>(tableColumns.size()); for (ColumnName column : tableColumns) { if (exclusions.contains(column)) { @@ -41,14 +41,14 @@ public static Optional singleAggregation( } columnsToAgg.add(column); } - return columnsToAgg.isEmpty() ? Optional.empty() : Optional.of(key.aggregation(columnsToAgg)); + return columnsToAgg.isEmpty() ? Optional.empty() : Optional.of(spec.aggregation(columnsToAgg)); } public abstract AggSpec spec(); /** * Transform {@code this} agg-all-by table into an {@link AggregationTable} by constructing the necessary - * {@link Aggregation} from the {@code key} and {@code tableColumns}. + * {@link Aggregation} from the {@link #spec()} and {@code tableColumns}. * * @param tableColumns the table columns * @return the aggregation table diff --git a/table-api/src/main/java/io/deephaven/api/agg/NormalAggregations.java b/table-api/src/main/java/io/deephaven/api/agg/NormalAggregations.java index 0ef97956140..bf05ddc5b25 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/NormalAggregations.java +++ b/table-api/src/main/java/io/deephaven/api/agg/NormalAggregations.java @@ -38,7 +38,7 @@ final void checkSize() { } public interface Builder { - Builder spec(AggSpec key); + Builder spec(AggSpec spec); Builder addPairs(Pair element); diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecColumnReferences.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecColumnReferences.java index ce6fd7c7559..87a126be017 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecColumnReferences.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecColumnReferences.java @@ -10,8 +10,8 @@ public class AggSpecColumnReferences implements AggSpec.Visitor { - public static Set of(AggSpec key) { - return key.walk(new AggSpecColumnReferences()).out(); + public static Set of(AggSpec spec) { + return spec.walk(new AggSpecColumnReferences()).out(); } private Set out; diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedFirst.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedFirst.java index b09704cfd32..07429e32f2b 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedFirst.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedFirst.java @@ -41,7 +41,7 @@ final void checkSortOrder() { // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction if (!columns().stream().map(SortColumn::order).allMatch(AggSpecSortedFirst::isAscending)) { throw new IllegalArgumentException( - "Can only construct KeySortedFirst with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); + "Can only construct AggSpecSortedFirst with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); } } diff --git a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedLast.java b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedLast.java index af78a89f20e..e8306b1f8db 100644 --- a/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedLast.java +++ b/table-api/src/main/java/io/deephaven/api/agg/spec/AggSpecSortedLast.java @@ -41,7 +41,7 @@ final void checkSortOrder() { // TODO(deephaven-core#821): SortedFirst / SortedLast aggregations with sort direction if (!columns().stream().map(SortColumn::order).allMatch(AggSpecSortedLast::isAscending)) { throw new IllegalArgumentException( - "Can only construct KeySortedLast with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); + "Can only construct AggSpecSortedLast with ascending, see https://github.com/deephaven/deephaven-core/issues/821"); } } From c0ccbe669d1897814255ee110b5cb3af1c98afaa Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 3 Dec 2021 07:17:01 -0800 Subject: [PATCH 17/20] Undo selectDistinct delegation to aggBy. aggBy will still route into selectDistinct when appropriate. --- .../java/io/deephaven/engine/table/impl/BaseTable.java | 8 ++------ .../io/deephaven/engine/table/impl/DeferredViewTable.java | 2 +- .../engine/table/impl/PartitionAwareSourceTable.java | 2 +- .../java/io/deephaven/engine/table/impl/QueryTable.java | 2 +- .../io/deephaven/engine/table/impl/TableWithDefaults.java | 5 ----- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java index feda2c058fc..86e43afc882 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java @@ -1005,16 +1005,12 @@ protected Table getParent() { @Override public final Table aggBy(Collection aggregations, Collection groupByColumns) { - if (aggregations.isEmpty()) { - return selectDistinctImpl(groupByColumns); + if (aggregations.isEmpty() && !groupByColumns.isEmpty()) { + return selectDistinct(groupByColumns); } return aggByImpl(aggregations, groupByColumns); } - protected Table selectDistinctImpl(Collection columns) { - return aggByImpl(List.of(), columns); - } - protected abstract Table aggByImpl(Collection aggregations, Collection groupByColumns); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/DeferredViewTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/DeferredViewTable.java index b1280ab8b78..561c55dba60 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/DeferredViewTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/DeferredViewTable.java @@ -220,7 +220,7 @@ protected Table doCoalesce() { } @Override - protected Table selectDistinctImpl(Collection selectables) { + public Table selectDistinct(Collection selectables) { final SelectColumn[] columns = SelectColumn.from(selectables); /* If the cachedResult table has already been created, we can just use that. */ if (getCoalesced() != null) { diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/PartitionAwareSourceTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/PartitionAwareSourceTable.java index ea1e9e49e9d..dd8056f65d1 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/PartitionAwareSourceTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/PartitionAwareSourceTable.java @@ -319,7 +319,7 @@ public final Table where(final Collection filters) { } @Override - protected final Table selectDistinctImpl(Collection groupByColumns) { + public final Table selectDistinct(Collection groupByColumns) { final SelectColumn[] selectColumns = SelectColumn.from(groupByColumns); for (SelectColumn selectColumn : selectColumns) { selectColumn.initDef(definition.getColumnNameMap()); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 19a7bea502e..0dde08b95c0 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -2971,7 +2971,7 @@ private RowSetBuilderRandom getUngroupIndex( } @Override - protected Table selectDistinctImpl(Collection groupByColumns) { + public Table selectDistinct(Collection groupByColumns) { return QueryPerformanceRecorder.withNugget("selectDistinct(" + groupByColumns + ")", sizeForInstrumentation(), () -> by(new SelectDistinctSpecImpl(), SelectColumn.from(groupByColumns))); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java index b6bab6a14a7..118dd547ae2 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/TableWithDefaults.java @@ -259,11 +259,6 @@ default Table select() { return select(getDefinition().getColumnNamesArray()); } - @Override - default Table selectDistinct(Collection columns) { - return aggBy(Collections.emptyList(), columns); - } - @Override @ConcurrentMethod default Table selectDistinct(Selectable... columns) { From c04f69316ce6a483340952745f5c1a8532947d9a Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 3 Dec 2021 08:09:57 -0800 Subject: [PATCH 18/20] Add more AnnotatedTableTest for aggAllBy variants --- .../io/deephaven/client/AnnotatedTables.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTables.java b/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTables.java index a27daaa96bc..29547529150 100644 --- a/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTables.java +++ b/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTables.java @@ -1,6 +1,7 @@ package io.deephaven.client; import io.deephaven.api.TableOperations; +import io.deephaven.api.agg.spec.AggSpec; import io.deephaven.qst.TableCreationLogic; import io.deephaven.qst.TableCreationLogic1Input; import io.deephaven.qst.TableCreator; @@ -123,7 +124,21 @@ public static Map adapters() { map.put("TAIL_0", TAIL_0_ADAPTER); map.put("TAIL_1", TAIL_1_ADAPTER); map.put("TAIL_2", TAIL_2_ADAPTER); - map.put("BY", GROUP_BY_ADAPTER); + map.put("GROUP_BY", GROUP_BY_ADAPTER); + + // Some of these aggs don't make sense with our testing framework, given the DateTime column. + // map.put("AGGALL_BY_ABS_SUM", a -> aggAllBy(a, AggSpec.absSum())); + // map.put("AGGALL_BY_AVG", a -> aggAllBy(a, AggSpec.avg())); + map.put("AGGALL_BY_FIRST", a -> aggAllBy(a, AggSpec.first())); + map.put("AGGALL_BY_GROUP", a -> aggAllBy(a, AggSpec.group())); + map.put("AGGALL_BY_LAST", a -> aggAllBy(a, AggSpec.last())); + map.put("AGGALL_BY_MAX", a -> aggAllBy(a, AggSpec.max())); + map.put("AGGALL_BY_MEDIAN", a -> aggAllBy(a, AggSpec.median())); + map.put("AGGALL_BY_MIN", a -> aggAllBy(a, AggSpec.min())); + // map.put("AGGALL_BY_STD", a -> aggAllBy(a, AggSpec.std())); + // map.put("AGGALL_BY_SUM", a -> aggAllBy(a, AggSpec.sum())); + // map.put("AGGALL_BY_VAR", a -> aggAllBy(a, AggSpec.var())); + map.put("MERGE_2", MERGE_2); map.put("MERGE_3", MERGE_3); return map; @@ -262,10 +277,24 @@ public static AnnotatedTable reverse(AnnotatedTable in) { return new AnnotatedTable(in.logic().andThen(TableOperations::reverse), in.isStatic(), in.size()); } + public static AnnotatedTable aggAllBy(AnnotatedTable in, AggSpec spec) { + return new AnnotatedTable(in.logic().andThen(aggAllBy(spec)), in.isStatic(), Math.min(in.size(), 1)); + } + public static AnnotatedTable groupBy(AnnotatedTable in) { return new AnnotatedTable(in.logic().andThen(TableOperations::groupBy), in.isStatic(), Math.min(in.size(), 1)); } + private static TableCreationLogic1Input aggAllBy(AggSpec spec) { + return new TableCreationLogic1Input() { + @Override + public > T create(T t1) { + return t1.aggAllBy(spec); + } + }; + } + + public static AnnotatedTable head(AnnotatedTable in, int size) { final TableCreationLogic1Input op = new TableCreationLogic1Input() { @Override From 8d09ee19e7b4ba6a19cb3deff5210fc2149b9ce6 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 3 Dec 2021 10:33:45 -0800 Subject: [PATCH 19/20] Error on 'bad' aggs --- .../engine/table/impl/BaseTable.java | 12 -- .../engine/table/impl/HierarchicalTable.java | 2 +- .../engine/table/impl/QueryTable.java | 22 +++- .../engine/table/impl/UncoalescedTable.java | 2 +- .../io/deephaven/client/AnnotatedTable.java | 17 ++- .../deephaven/client/AnnotatedTableTest.java | 22 ++++ .../io/deephaven/client/AnnotatedTables.java | 124 +++++++++--------- 7 files changed, 120 insertions(+), 81 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java index 86e43afc882..ceaaea47138 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/BaseTable.java @@ -1002,18 +1002,6 @@ protected Table getParent() { } } - @Override - public final Table aggBy(Collection aggregations, - Collection groupByColumns) { - if (aggregations.isEmpty() && !groupByColumns.isEmpty()) { - return selectDistinct(groupByColumns); - } - return aggByImpl(aggregations, groupByColumns); - } - - protected abstract Table aggByImpl(Collection aggregations, - Collection groupByColumns); - @Override public Table withKeys(String... columns) { if (columns == null || columns.length == 0) { diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java index 074a1ed1efa..ca46a8aa6f1 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/HierarchicalTable.java @@ -180,7 +180,7 @@ public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { } @Override - protected Table aggByImpl(Collection aggregations, + public Table aggBy(Collection aggregations, Collection groupByColumns) { return throwUnsupported("aggBy()"); } diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java index 0dde08b95c0..fc75bd8e747 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/QueryTable.java @@ -8,6 +8,7 @@ import io.deephaven.api.JoinMatch; import io.deephaven.api.Selectable; import io.deephaven.api.SortColumn; +import io.deephaven.api.Strings; import io.deephaven.api.agg.Aggregation; import io.deephaven.api.agg.AggregationOutputs; import io.deephaven.api.agg.spec.AggSpec; @@ -572,26 +573,41 @@ public Table exactJoin(Table table, MatchPair[] columnsToMatch, MatchPair[] colu () -> naturalJoinInternal(table, columnsToMatch, columnsToAdd, true)); } + private static String toString(Collection groupByList) { + return groupByList.stream().map(Strings::of).collect(Collectors.joining(",", "[", "]")); + } + @Override public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { for (ColumnName name : AggSpecColumnReferences.of(spec)) { if (!hasColumns(name.name())) { throw new IllegalArgumentException( - "Spec references column that does not exist: " + name.name() + " / " + spec); + "aggAllBy spec references column that does not exist: spec=" + spec + ", groupByColumns=" + + toString(Arrays.asList(groupByColumns))); } } final List groupByList = Arrays.asList(groupByColumns); final List tableColumns = definition.getColumnNames().stream().map(ColumnName::of).collect(Collectors.toList()); final Optional agg = AggregateAllByTable.singleAggregation(spec, groupByList, tableColumns); - final Table result = aggBy(agg.stream().collect(Collectors.toList()), groupByList); + if (agg.isEmpty()) { + throw new IllegalArgumentException( + "aggAllBy has no columns to aggregate: spec=" + spec + ", groupByColumns=" + toString(groupByList)); + } + final Table result = aggBy(agg.get(), groupByList); spec.walk(new AggAllByCopyAttributes(this, result)); return result; } @Override - protected Table aggByImpl(final Collection aggregations, + public Table aggBy(final Collection aggregations, final Collection groupByColumns) { + if (aggregations.isEmpty()) { + throw new IllegalArgumentException( + "aggBy must have at least one aggregation, none specified. groupByColumns=" + + toString(groupByColumns)); + } + final List optimized = AggregationFactory.AggregationElement.optimizeAndConvert(aggregations); diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java index 6c250e6c72a..2c12dbcb76b 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/UncoalescedTable.java @@ -350,7 +350,7 @@ public Table aggAllBy(AggSpec spec, Selectable... groupByColumns) { @Override @ConcurrentMethod - protected Table aggByImpl(Collection aggregations, + public Table aggBy(Collection aggregations, Collection groupByColumns) { return coalesce().aggBy(aggregations, groupByColumns); } diff --git a/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTable.java b/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTable.java index f02e4679f0f..175ce618cb5 100644 --- a/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTable.java +++ b/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTable.java @@ -1,29 +1,36 @@ package io.deephaven.client; import io.deephaven.qst.TableCreationLogic; +import io.deephaven.qst.table.TableHeader; import java.util.Objects; public class AnnotatedTable { - public static AnnotatedTable ofStatic(TableCreationLogic logic, long size) { - return new AnnotatedTable(logic, true, size); + public static AnnotatedTable ofStatic(TableHeader header, TableCreationLogic logic, long size) { + return new AnnotatedTable(header, logic, true, size); } - public static AnnotatedTable ofDynamic(TableCreationLogic logic) { - return new AnnotatedTable(logic, false, 0); + public static AnnotatedTable ofDynamic(TableHeader header, TableCreationLogic logic) { + return new AnnotatedTable(header, logic, false, 0); } + private final TableHeader header; private final TableCreationLogic logic; private final boolean isStatic; private final long size; - AnnotatedTable(TableCreationLogic logic, boolean isStatic, long size) { + AnnotatedTable(TableHeader header, TableCreationLogic logic, boolean isStatic, long size) { + this.header = Objects.requireNonNull(header); this.logic = Objects.requireNonNull(logic); this.isStatic = isStatic; this.size = size; } + public TableHeader header() { + return header; + } + public TableCreationLogic logic() { return logic; } diff --git a/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTableTest.java b/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTableTest.java index b5f34b3dba8..6ea0b17e3b3 100644 --- a/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTableTest.java +++ b/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTableTest.java @@ -1,17 +1,22 @@ package io.deephaven.client; +import io.deephaven.client.impl.SchemaAdapter; import io.deephaven.client.impl.TableHandle; import io.deephaven.client.impl.TableHandle.TableHandleException; +import io.deephaven.grpc_api.util.SchemaHelper; import io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse; import io.deephaven.qst.table.ParentsVisitor; import io.deephaven.qst.table.TableCreatorImpl; import io.deephaven.qst.table.TableSpec; +import org.apache.arrow.vector.types.pojo.Field; +import org.apache.arrow.vector.types.pojo.Schema; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.Set; @@ -82,5 +87,22 @@ private void checkResponse(TableHandle handle) { assertThat(response.getSuccess()).isTrue(); assertThat(response.getIsStatic()).isFalse(); } + final Schema expected = SchemaAdapter.of(table.header()); + final Schema actual = SchemaHelper.schema(response); + checkLax(expected, actual); + } + + private static void checkLax(Schema expected, Schema actual) { + final Iterator i1 = expected.getFields().iterator(); + final Iterator i2 = actual.getFields().iterator(); + while (i1.hasNext() && i2.hasNext()) { + final Field f1 = i1.next(); + final Field f2 = i2.next(); + assertThat(f1.getName()).isEqualTo(f2.getName()); + assertThat(f1.getType()).isEqualTo(f2.getType()); + assertThat(f1.isNullable()).isEqualTo(f2.isNullable()); + } + assertThat(i1).isExhausted(); + assertThat(i2).isExhausted(); } } diff --git a/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTables.java b/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTables.java index 29547529150..f3e0a014fbd 100644 --- a/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTables.java +++ b/java-client/session-dagger/src/test/java/io/deephaven/client/AnnotatedTables.java @@ -5,6 +5,8 @@ import io.deephaven.qst.TableCreationLogic; import io.deephaven.qst.TableCreationLogic1Input; import io.deephaven.qst.TableCreator; +import io.deephaven.qst.column.header.ColumnHeader; +import io.deephaven.qst.table.TableHeader; import java.time.Duration; import java.util.LinkedHashMap; @@ -16,33 +18,40 @@ public class AnnotatedTables { - public static final AnnotatedTable EMPTY_0 = ofStatic(AnnotatedTables::empty0, 0); - public static final AnnotatedTable EMPTY_1 = ofStatic(AnnotatedTables::empty1, 1); - public static final AnnotatedTable EMPTY_2 = ofStatic(AnnotatedTables::empty2, 2); + public static final TableHeader TIME = TableHeader.of(ColumnHeader.ofInstant("Timestamp")); - public static final AnnotatedTable TIME_1 = ofDynamic(AnnotatedTables::time1); - public static final AnnotatedTable TIME_2 = ofDynamic(AnnotatedTables::time2); + public static final TableHeader INDEX = TableHeader.of(ColumnHeader.ofLong("I")); - public static final AnnotatedTable MERGE_STATIC = ofStatic(AnnotatedTables::mergeStatic, 3); - public static final AnnotatedTable MERGE = ofDynamic(AnnotatedTables::merge); + public static final TableHeader TIME_INDEX = + TableHeader.of(ColumnHeader.ofInstant("Timestamp"), ColumnHeader.ofLong("I")); - public static final AnnotatedTable VIEW_STATIC = ofStatic(AnnotatedTables::viewStatic, 1); - public static final AnnotatedTable VIEW = ofDynamic(AnnotatedTables::view); + public static final AnnotatedTable EMPTY_0 = ofStatic(TableHeader.empty(), AnnotatedTables::empty0, 0); + public static final AnnotatedTable EMPTY_1 = ofStatic(TableHeader.empty(), AnnotatedTables::empty1, 1); + public static final AnnotatedTable EMPTY_2 = ofStatic(TableHeader.empty(), AnnotatedTables::empty2, 2); - public static final AnnotatedTable UPDATE_VIEW_STATIC = ofStatic(AnnotatedTables::updateViewStatic, 1); - public static final AnnotatedTable UPDATE_VIEW = ofDynamic(AnnotatedTables::updateView); + public static final AnnotatedTable TIME_1 = ofDynamic(TIME, AnnotatedTables::time1); + public static final AnnotatedTable TIME_2 = ofDynamic(TIME, AnnotatedTables::time2); - public static final AnnotatedTable UPDATE_STATIC = ofStatic(AnnotatedTables::updateStatic, 1); - public static final AnnotatedTable UPDATE = ofDynamic(AnnotatedTables::update); + public static final AnnotatedTable MERGE_STATIC = ofStatic(TableHeader.empty(), AnnotatedTables::mergeStatic, 3); + public static final AnnotatedTable MERGE = ofDynamic(TIME, AnnotatedTables::merge); - public static final AnnotatedTable SELECT_STATIC = ofStatic(AnnotatedTables::selectStatic, 1); - public static final AnnotatedTable SELECT = ofDynamic(AnnotatedTables::select); + public static final AnnotatedTable VIEW_STATIC = ofStatic(INDEX, AnnotatedTables::viewStatic, 1); + public static final AnnotatedTable VIEW = ofDynamic(INDEX, AnnotatedTables::view); - public static final AnnotatedTable HEAD_STATIC = ofStatic(AnnotatedTables::headStatic, 1); - public static final AnnotatedTable HEAD = ofDynamic(AnnotatedTables::head); + public static final AnnotatedTable UPDATE_VIEW_STATIC = ofStatic(INDEX, AnnotatedTables::updateViewStatic, 1); + public static final AnnotatedTable UPDATE_VIEW = ofDynamic(TIME_INDEX, AnnotatedTables::updateView); - public static final AnnotatedTable TAIL_STATIC = ofStatic(AnnotatedTables::tailStatic, 1); - public static final AnnotatedTable TAIL = ofDynamic(AnnotatedTables::tail); + public static final AnnotatedTable UPDATE_STATIC = ofStatic(INDEX, AnnotatedTables::updateStatic, 1); + public static final AnnotatedTable UPDATE = ofDynamic(TIME_INDEX, AnnotatedTables::update); + + public static final AnnotatedTable SELECT_STATIC = ofStatic(INDEX, AnnotatedTables::selectStatic, 1); + public static final AnnotatedTable SELECT = ofDynamic(INDEX, AnnotatedTables::select); + + public static final AnnotatedTable HEAD_STATIC = ofStatic(TableHeader.empty(), AnnotatedTables::headStatic, 1); + public static final AnnotatedTable HEAD = ofDynamic(TIME, AnnotatedTables::head); + + public static final AnnotatedTable TAIL_STATIC = ofStatic(TableHeader.empty(), AnnotatedTables::tailStatic, 1); + public static final AnnotatedTable TAIL = ofDynamic(TIME, AnnotatedTables::tail); public static final Adapter REVERSE_ADAPTER = AnnotatedTables::reverse; @@ -58,8 +67,6 @@ public class AnnotatedTables { public static final Adapter TAIL_2_ADAPTER = in -> tail(in, 2); - public static final Adapter GROUP_BY_ADAPTER = AnnotatedTables::groupBy; - public static final Adapter MERGE_2 = in -> { final TableCreationLogic merge2 = new TableCreationLogic() { @Override @@ -69,9 +76,9 @@ public > T create(TableCreator creation) { } }; if (in.isStatic()) { - return AnnotatedTable.ofStatic(merge2, in.size() * 2); + return AnnotatedTable.ofStatic(in.header(), merge2, in.size() * 2); } else { - return AnnotatedTable.ofDynamic(merge2); + return AnnotatedTable.ofDynamic(in.header(), merge2); } }; @@ -84,9 +91,9 @@ public > T create(TableCreator creation) { } }; if (in.isStatic()) { - return AnnotatedTable.ofStatic(merge3, in.size() * 3); + return AnnotatedTable.ofStatic(in.header(), merge3, in.size() * 3); } else { - return AnnotatedTable.ofDynamic(merge3); + return AnnotatedTable.ofDynamic(in.header(), merge3); } }; @@ -124,26 +131,20 @@ public static Map adapters() { map.put("TAIL_0", TAIL_0_ADAPTER); map.put("TAIL_1", TAIL_1_ADAPTER); map.put("TAIL_2", TAIL_2_ADAPTER); - map.put("GROUP_BY", GROUP_BY_ADAPTER); - - // Some of these aggs don't make sense with our testing framework, given the DateTime column. - // map.put("AGGALL_BY_ABS_SUM", a -> aggAllBy(a, AggSpec.absSum())); - // map.put("AGGALL_BY_AVG", a -> aggAllBy(a, AggSpec.avg())); - map.put("AGGALL_BY_FIRST", a -> aggAllBy(a, AggSpec.first())); - map.put("AGGALL_BY_GROUP", a -> aggAllBy(a, AggSpec.group())); - map.put("AGGALL_BY_LAST", a -> aggAllBy(a, AggSpec.last())); - map.put("AGGALL_BY_MAX", a -> aggAllBy(a, AggSpec.max())); - map.put("AGGALL_BY_MEDIAN", a -> aggAllBy(a, AggSpec.median())); - map.put("AGGALL_BY_MIN", a -> aggAllBy(a, AggSpec.min())); - // map.put("AGGALL_BY_STD", a -> aggAllBy(a, AggSpec.std())); - // map.put("AGGALL_BY_SUM", a -> aggAllBy(a, AggSpec.sum())); - // map.put("AGGALL_BY_VAR", a -> aggAllBy(a, AggSpec.var())); - map.put("MERGE_2", MERGE_2); map.put("MERGE_3", MERGE_3); return map; } + public static Map headerPreservingAggAllBy() { + final Map map = new LinkedHashMap<>(); + map.put("AGGALL_BY_FIRST", a -> headerPreservingAgg(a, AggSpec.first())); + map.put("AGGALL_BY_LAST", a -> headerPreservingAgg(a, AggSpec.last())); + map.put("AGGALL_BY_MAX", a -> headerPreservingAgg(a, AggSpec.max())); + map.put("AGGALL_BY_MIN", a -> headerPreservingAgg(a, AggSpec.min())); + return map; + } + public static Map annotatedTables() { final Map explicit = explicitlyAnnotatedTables(); @@ -171,6 +172,14 @@ private static void addDoubleDips(Map explicit, Map 0) { + for (Entry a1 : headerPreservingAggAllBy().entrySet()) { + final String doubleKey = key + " + " + a1.getKey(); + final AnnotatedTable derivativeSpec = a1.getValue().apply(value); + out.put(doubleKey, derivativeSpec); + } + } } } @@ -222,35 +231,35 @@ public static > T merge(TableCreator c) { } public static > T viewStatic(TableCreator c) { - return empty1(c).view("I=i"); + return empty1(c).view("I=ii"); } public static > T updateStatic(TableCreator c) { - return empty1(c).update("I=i"); + return empty1(c).update("I=ii"); } public static > T updateViewStatic(TableCreator c) { - return empty1(c).updateView("I=i"); + return empty1(c).updateView("I=ii"); } public static > T selectStatic(TableCreator c) { - return empty1(c).select("I=i"); + return empty1(c).select("I=ii"); } public static > T view(TableCreator c) { - return time1(c).view("I=i"); + return time1(c).view("I=ii"); } public static > T update(TableCreator c) { - return time1(c).update("I=i"); + return time1(c).update("I=ii"); } public static > T updateView(TableCreator c) { - return time1(c).updateView("I=i"); + return time1(c).updateView("I=ii"); } public static > T select(TableCreator c) { - return time1(c).select("I=i"); + return time1(c).select("I=ii"); } public static > T headStatic(TableCreator c) { @@ -274,15 +283,12 @@ public interface Adapter { } public static AnnotatedTable reverse(AnnotatedTable in) { - return new AnnotatedTable(in.logic().andThen(TableOperations::reverse), in.isStatic(), in.size()); - } - - public static AnnotatedTable aggAllBy(AnnotatedTable in, AggSpec spec) { - return new AnnotatedTable(in.logic().andThen(aggAllBy(spec)), in.isStatic(), Math.min(in.size(), 1)); + return new AnnotatedTable(in.header(), in.logic().andThen(TableOperations::reverse), in.isStatic(), in.size()); } - public static AnnotatedTable groupBy(AnnotatedTable in) { - return new AnnotatedTable(in.logic().andThen(TableOperations::groupBy), in.isStatic(), Math.min(in.size(), 1)); + public static AnnotatedTable headerPreservingAgg(AnnotatedTable in, AggSpec spec) { + return new AnnotatedTable(in.header(), in.logic().andThen(aggAllBy(spec)), in.isStatic(), + Math.min(in.size(), 1)); } private static TableCreationLogic1Input aggAllBy(AggSpec spec) { @@ -304,9 +310,9 @@ public > T create(T t1) { }; final TableCreationLogic headLogic = in.logic().andThen(op); if (in.isStatic() || size == 0) { - return AnnotatedTable.ofStatic(headLogic, Math.min(in.size(), size)); + return AnnotatedTable.ofStatic(in.header(), headLogic, Math.min(in.size(), size)); } else { - return AnnotatedTable.ofDynamic(headLogic); + return AnnotatedTable.ofDynamic(in.header(), headLogic); } } @@ -319,9 +325,9 @@ public > T create(T t1) { }; final TableCreationLogic tailLogic = in.logic().andThen(op); if (in.isStatic() || size == 0) { - return AnnotatedTable.ofStatic(tailLogic, Math.min(in.size(), size)); + return AnnotatedTable.ofStatic(in.header(), tailLogic, Math.min(in.size(), size)); } else { - return AnnotatedTable.ofDynamic(tailLogic); + return AnnotatedTable.ofDynamic(in.header(), tailLogic); } } } From 96d3c3ef2ba21b965efc06cf2c10af48c588494b Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 3 Dec 2021 11:21:14 -0800 Subject: [PATCH 20/20] Fix testMixedFillChunk --- .../engine/table/impl/util/TestRedirectedColumnSource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/table/src/test/java/io/deephaven/engine/table/impl/util/TestRedirectedColumnSource.java b/engine/table/src/test/java/io/deephaven/engine/table/impl/util/TestRedirectedColumnSource.java index 7e2f47b06a1..a5fba4eb96e 100644 --- a/engine/table/src/test/java/io/deephaven/engine/table/impl/util/TestRedirectedColumnSource.java +++ b/engine/table/src/test/java/io/deephaven/engine/table/impl/util/TestRedirectedColumnSource.java @@ -119,10 +119,10 @@ public void testMixedFillChunk() { final Table a = TableTools.emptyTable(1_000_000L).update("A=(long) (Math.random() * 1_000_000L)"); final Table ab = a.update("B=A % 2"); - final Table expected = ab.groupBy("B", "A").sort("A"); + final Table expected = ab.selectDistinct("B", "A").sort("A"); final Table redirected = a.sort("A").update("B=A % 2"); - final Table actual = redirected.groupBy("B", "A"); + final Table actual = redirected.selectDistinct("B", "A"); assertTableEquals(expected, actual); }