From a832b6d0b739111f2fb43d1e5069a738e477b2f2 Mon Sep 17 00:00:00 2001 From: Yan Levin Date: Sat, 22 Aug 2026 19:31:10 -0500 Subject: [PATCH] handle Cypher double properties on CREATE, and test mixed-type nodes --- .../compiler/create/CreateLabelPropNode.java | 2 ++ .../org/estore/planner/LogicalPlanBuilder.java | 15 +++++++++++++++ .../planner/create/CreateLabelPropNode.java | 2 ++ .../test/java/org/estore/CreateInstanceTest.java | 12 ++++++++++++ .../java/org/estore/compiler/CodeGenTest.java | 12 ++++++++++++ 5 files changed, 43 insertions(+) diff --git a/estore/src/main/java/org/estore/compiler/create/CreateLabelPropNode.java b/estore/src/main/java/org/estore/compiler/create/CreateLabelPropNode.java index 6195b55..b1bf721 100644 --- a/estore/src/main/java/org/estore/compiler/create/CreateLabelPropNode.java +++ b/estore/src/main/java/org/estore/compiler/create/CreateLabelPropNode.java @@ -93,6 +93,8 @@ public static String codegen(String dbname, NodePattern nodePattern) { res += "Field f = klass.getDeclaredField(property.getName());"; res += "if (property.getType() == long.class) {"; res += "f.setLong(obj, ((Long) property.getValue()));"; + res += "} else if (property.getType() == double.class) {"; + res += "f.setDouble(obj, ((Double) property.getValue()));"; res += "} else if (property.getType() == String.class) {"; res += "f.set(obj, property.getValue());"; res += "}"; diff --git a/estore/src/main/java/org/estore/planner/LogicalPlanBuilder.java b/estore/src/main/java/org/estore/planner/LogicalPlanBuilder.java index 66c2a45..af26543 100644 --- a/estore/src/main/java/org/estore/planner/LogicalPlanBuilder.java +++ b/estore/src/main/java/org/estore/planner/LogicalPlanBuilder.java @@ -720,6 +720,21 @@ public Object visitOC_IntegerLiteral(CypherParser.OC_IntegerLiteralContext ctx) return null; } + @Override + public Object visitOC_DoubleLiteral(CypherParser.OC_DoubleLiteralContext ctx) { + if (ctx.RegularDecimalReal() != null) { + return new LiteralExpr( + Double.TYPE, + Double.parseDouble(ctx.RegularDecimalReal().getSymbol().getText())); + } + if (ctx.ExponentDecimalReal() != null) { + return new LiteralExpr( + Double.TYPE, + Double.parseDouble(ctx.ExponentDecimalReal().getSymbol().getText())); + } + return null; + } + @Override public Object visitOC_BooleanLiteral(CypherParser.OC_BooleanLiteralContext ctx) { if (ctx.TRUE() != null) { diff --git a/estore/src/main/java/org/estore/planner/create/CreateLabelPropNode.java b/estore/src/main/java/org/estore/planner/create/CreateLabelPropNode.java index 2e5157f..10f6d44 100644 --- a/estore/src/main/java/org/estore/planner/create/CreateLabelPropNode.java +++ b/estore/src/main/java/org/estore/planner/create/CreateLabelPropNode.java @@ -100,6 +100,8 @@ public Table execute(Table input) { Field f = klass.getDeclaredField(property.getName()); if (property.getType() == long.class) { f.setLong(obj, ((Long) property.getValue())); + } else if (property.getType() == double.class) { + f.setDouble(obj, ((Double) property.getValue())); } else if (property.getType() == String.class) { f.set(obj, property.getValue()); } diff --git a/estore/src/test/java/org/estore/CreateInstanceTest.java b/estore/src/test/java/org/estore/CreateInstanceTest.java index 3f6bc9c..ffe70aa 100644 --- a/estore/src/test/java/org/estore/CreateInstanceTest.java +++ b/estore/src/test/java/org/estore/CreateInstanceTest.java @@ -426,6 +426,18 @@ void testNodeAddPropertyCypher2() throws ReflectiveOperationException { assertEquals(f1.getLong(obj), 30L); } + @Test + void createObjectWithManyTypes() throws EstoreException { + estore.query("CREATE (n:`ValManyTypes` {i: 30, d: 30.0, s: 'something'}) RETURN n"); + Table result = estore.query("MATCH (n:`ValManyTypes`) RETURN n"); + + assertEquals(1, result.getSize()); + Object obj = result.get("n").get(0); + assertEquals(30, estore.getLong(obj, "i")); + assertEquals(30.0, estore.getDouble(obj, "d"), 0.01); + assertEquals("something", estore.getString(obj, "s")); + } + @Test void testArrayList() throws EstoreException { ArrayList a = new ArrayList(); diff --git a/estore/src/test/java/org/estore/compiler/CodeGenTest.java b/estore/src/test/java/org/estore/compiler/CodeGenTest.java index 74ab011..6cb2749 100644 --- a/estore/src/test/java/org/estore/compiler/CodeGenTest.java +++ b/estore/src/test/java/org/estore/compiler/CodeGenTest.java @@ -208,6 +208,18 @@ void testNodeAddPropertyCypher2() throws ReflectiveOperationException { assertEquals(f1.getLong(obj), 30L); } + @Test + void createObjectWithManyTypes() throws EstoreException { + estore.query("CREATE (n:`ValManyTypes2` {i: 30, d: 30.0, s: 'something'}) RETURN n"); + Table result = estore.query("MATCH (n:`ValManyTypes2`) RETURN n"); + + assertEquals(1, result.getSize()); + Object obj = result.get("n").get(0); + assertEquals(30, estore.getLong(obj, "i")); + assertEquals(30.0, estore.getDouble(obj, "d"), 0.01); + assertEquals("something", estore.getString(obj, "s")); + } + @Test void testCreateTwoNodeRelation() throws EstoreException { Table result =