From ecebae97a54e2fce997b1fcc7a4bf9b1c338b7e1 Mon Sep 17 00:00:00 2001 From: George Wan Date: Mon, 25 Dec 2023 13:16:55 -0800 Subject: [PATCH] fix: Add BigInteger and BigDecimal types to MatchFilter.java (#4912) * Add BigInteger and BigDecimal types to MatchFilter.java * Add tests for BigInteger and BigDecimal MatchFilter * Update engine/table/src/test/java/io/deephaven/engine/table/impl/select/WhereFilterFactoryTest.java Co-authored-by: Colin Alworth * Update engine/table/src/test/java/io/deephaven/engine/table/impl/select/WhereFilterFactoryTest.java Co-authored-by: Colin Alworth --------- Co-authored-by: Colin Alworth --- .../engine/table/impl/select/MatchFilter.java | 18 +++++ .../impl/select/WhereFilterFactoryTest.java | 78 +++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/engine/table/src/main/java/io/deephaven/engine/table/impl/select/MatchFilter.java b/engine/table/src/main/java/io/deephaven/engine/table/impl/select/MatchFilter.java index 74fb3080b2b..27b7e671973 100644 --- a/engine/table/src/main/java/io/deephaven/engine/table/impl/select/MatchFilter.java +++ b/engine/table/src/main/java/io/deephaven/engine/table/impl/select/MatchFilter.java @@ -19,6 +19,8 @@ import org.jetbrains.annotations.NotNull; import org.jpy.PyObject; +import java.math.BigDecimal; +import java.math.BigInteger; import java.time.Instant; import java.util.*; @@ -284,6 +286,22 @@ Object convertStringLiteral(String str) { } }; } + if (cls == BigDecimal.class) { + return new ColumnTypeConvertor() { + @Override + Object convertStringLiteral(String str) { + return new BigDecimal(str); + } + }; + } + if (cls == BigInteger.class) { + return new ColumnTypeConvertor() { + @Override + Object convertStringLiteral(String str) { + return new BigInteger(str); + } + }; + } if (cls == String.class) { return new ColumnTypeConvertor() { @Override diff --git a/engine/table/src/test/java/io/deephaven/engine/table/impl/select/WhereFilterFactoryTest.java b/engine/table/src/test/java/io/deephaven/engine/table/impl/select/WhereFilterFactoryTest.java index 5ff89d4cf9b..c8e6ae3b7d5 100644 --- a/engine/table/src/test/java/io/deephaven/engine/table/impl/select/WhereFilterFactoryTest.java +++ b/engine/table/src/test/java/io/deephaven/engine/table/impl/select/WhereFilterFactoryTest.java @@ -239,6 +239,84 @@ public void testInInstants() { assertEquals(0, idx.size()); } + public void testBigDecimal() { + BigDecimal a = new BigDecimal("-914.9539"); // not in the table + + BigDecimal b = new BigDecimal("618.2686"); + BigDecimal c = new BigDecimal("89.3824"); + BigDecimal d = new BigDecimal("-471.0881"); + Table t = TableTools.newTable(TableTools.col("BigDecimal", b, c, d)); + // match one item + WhereFilter f = WhereFilterFactory.getExpression("BigDecimal = " + b); + f.init(t.getDefinition()); + assertEquals(MatchFilter.class, f.getClass()); + RowSet idx = f.filter(t.getRowSet().copy(), t.getRowSet(), t, false); + assertEquals(1, idx.size()); + assertEquals(b, DataAccessHelpers.getColumn(t, 0).get(idx.firstRowKey())); + // match one of two items + f = WhereFilterFactory.getExpression("BigDecimal in " + a + ", " + b); + f.init(t.getDefinition()); + assertEquals(MatchFilter.class, f.getClass()); + idx = f.filter(t.getRowSet().copy(), t.getRowSet(), t, false); + assertEquals(1, idx.size()); + assertEquals(b, DataAccessHelpers.getColumn(t, 0).get(idx.firstRowKey())); + + // match two of two items + f = WhereFilterFactory.getExpression("BigDecimal in " + c + ", " + d); + f.init(t.getDefinition()); + assertEquals(MatchFilter.class, f.getClass()); + idx = f.filter(t.getRowSet().copy(), t.getRowSet(), t, false); + assertEquals(2, idx.size()); + assertEquals(c, DataAccessHelpers.getColumn(t, 0).get(idx.firstRowKey())); + assertEquals(d, DataAccessHelpers.getColumn(t, 0).get(idx.lastRowKey())); + + // match zero of one item + f = WhereFilterFactory.getExpression("BigDecimal == " + a); + f.init(t.getDefinition()); + assertEquals(MatchFilter.class, f.getClass()); + idx = f.filter(t.getRowSet().copy(), t.getRowSet(), t, false); + assertEquals(0, idx.size()); + } + + public void testBigIntegerl() { + BigInteger a = new BigInteger("-914"); // not in the table + + BigInteger b = new BigInteger("618"); + BigInteger c = new BigInteger("89"); + BigInteger d = new BigInteger("-471"); + Table t = TableTools.newTable(TableTools.col("BigInteger", b, c, d)); + // match one item + WhereFilter f = WhereFilterFactory.getExpression("BigInteger = " + b); + f.init(t.getDefinition()); + assertEquals(MatchFilter.class, f.getClass()); + RowSet idx = f.filter(t.getRowSet().copy(), t.getRowSet(), t, false); + assertEquals(1, idx.size()); + assertEquals(b, DataAccessHelpers.getColumn(t, 0).get(idx.firstRowKey())); + // match one of two items + f = WhereFilterFactory.getExpression("BigInteger in " + a + ", " + b); + f.init(t.getDefinition()); + assertEquals(MatchFilter.class, f.getClass()); + idx = f.filter(t.getRowSet().copy(), t.getRowSet(), t, false); + assertEquals(1, idx.size()); + assertEquals(b, DataAccessHelpers.getColumn(t, 0).get(idx.firstRowKey())); + + // match two of two items + f = WhereFilterFactory.getExpression("BigInteger in " + c + ", " + d); + f.init(t.getDefinition()); + assertEquals(MatchFilter.class, f.getClass()); + idx = f.filter(t.getRowSet().copy(), t.getRowSet(), t, false); + assertEquals(2, idx.size()); + assertEquals(c, DataAccessHelpers.getColumn(t, 0).get(idx.firstRowKey())); + assertEquals(d, DataAccessHelpers.getColumn(t, 0).get(idx.lastRowKey())); + + // match zero of one item + f = WhereFilterFactory.getExpression("BigInteger == " + a); + f.init(t.getDefinition()); + assertEquals(MatchFilter.class, f.getClass()); + idx = f.filter(t.getRowSet().copy(), t.getRowSet(), t, false); + assertEquals(0, idx.size()); + } + public void testTypeInference() { checkResult("1", true, true, true, true, true, true, false, true, true, (byte) 1, (short) 1, 1, 1, new BigInteger("1"), 1.0, new BigDecimal("1"), '1');