From bfa47c3fd27a93a1d2cb525c7d92b452d28a9d12 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Wed, 27 Apr 2022 16:29:23 +0200 Subject: [PATCH] [#60] Fix constant inlining for execl serializer to inline like a literal --- .../excel/ExcelExpressionSerializer.java | 14 ++++++-------- .../excel/ExcelExpressionSerializerTest.java | 7 ++++++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/excel/src/main/java/com/blazebit/expression/excel/ExcelExpressionSerializer.java b/excel/src/main/java/com/blazebit/expression/excel/ExcelExpressionSerializer.java index 5e71a254..9ff959d9 100644 --- a/excel/src/main/java/com/blazebit/expression/excel/ExcelExpressionSerializer.java +++ b/excel/src/main/java/com/blazebit/expression/excel/ExcelExpressionSerializer.java @@ -174,12 +174,7 @@ private Boolean inlineIfConstant(Expression expression, int startIndex, boolean try { Object value = interpreter.evaluateAsModelType(expression, interpreterContextForInlining); sb.setLength(startIndex); - if (value instanceof CharSequence) { - renderStringLiteral((CharSequence) value); - } else { - sb.append(value); - } - return Boolean.TRUE; + return visitLiteral(value, expression.getType()); } catch (RuntimeException ex) { throw new IllegalArgumentException("Could not inline expression '" + expression + "'", ex); } @@ -216,15 +211,18 @@ public Boolean visit(FunctionInvocation e) { @Override public Boolean visit(Literal e) { + return visitLiteral(e.getValue(), e.getType()); + } + + private Boolean visitLiteral(Object value, DomainType type) { // TODO: implement some kind of SPI contract for literal rendering which can be replaced i.e. there should be a default impl that can be replaced - if (e.getType().getKind() == DomainType.DomainTypeKind.COLLECTION) { + if (type.getKind() == DomainType.DomainTypeKind.COLLECTION) { if (interpreterContextForInlining != null) { // This could be a problem if the literal was the root expression, but we assume this is not the case return Boolean.TRUE; } throw new UnsupportedOperationException("No support for collections in Excel"); } else { - Object value = e.getValue(); if (value instanceof CharSequence) { renderStringLiteral((CharSequence) value); } else if (value instanceof Boolean) { diff --git a/excel/src/test/java/com/blazebit/expression/excel/ExcelExpressionSerializerTest.java b/excel/src/test/java/com/blazebit/expression/excel/ExcelExpressionSerializerTest.java index 0321619d..6fd0d9bf 100644 --- a/excel/src/test/java/com/blazebit/expression/excel/ExcelExpressionSerializerTest.java +++ b/excel/src/test/java/com/blazebit/expression/excel/ExcelExpressionSerializerTest.java @@ -120,7 +120,7 @@ private String serialize(String expressionString) { rootDomainTypes.put("u", domainModel.getType("User")); rootDomainTypes.put("g", domainModel.getType("GlobalState")); ExpressionCompiler.Context compilerContext = compiler.createContext(rootDomainTypes); - Expression expression = compiler.createExpression(expressionString, compilerContext); + Expression expression = compiler.createExpressionOrPredicate(expressionString, compilerContext); ExpressionSerializer excelSerializer = expressionService.createSerializer(StringBuilder.class, "excel"); ExpressionInterpreter.Context interpreterContext = ExpressionInterpreterContext.create(expressionService) .withRoot("g", new GlobalState("The root")); @@ -152,4 +152,9 @@ public void testInlineGlobalSimple() { public void testInlineGlobalExpression() { Assert.assertEquals("A1 & \"The\"", serialize("u.name + SUBSTRING(g.rootName, 1, 3)")); } + + @Test + public void testBooleanLiteral() { + Assert.assertEquals("E1 = TRUE()", serialize("u.active = true")); + } }