This is an automated email from the ASF dual-hosted git repository. ntimofeev pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push: new 01c3b45a8 Minor code cleanup and additional tests 01c3b45a8 is described below commit 01c3b45a8d822793f99c0d14373e76a1538c97f9 Author: Nikita Timofeev <stari...@gmail.com> AuthorDate: Tue May 17 20:03:50 2022 +0300 Minor code cleanup and additional tests --- .../apache/cayenne/exp/parser/ExpressionUtils.java | 37 ++++++----- .../cayenne/exp/parser/ExpressionUtilsTest.java | 73 ++++++++++++++++++++++ 2 files changed, 93 insertions(+), 17 deletions(-) diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionUtils.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionUtils.java index 3839f9e0c..e5700c025 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionUtils.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ExpressionUtils.java @@ -26,27 +26,30 @@ import java.util.Map; * @since 4.2 */ class ExpressionUtils { + static void parsePath(ASTPath pathExp, String path) throws ParseException { + if(path == null || !path.contains("#")) { + pathExp.setPath(path); + return; + } - static void parsePath(ASTPath pathExp, Object path) throws ParseException { - if (path != null && path.toString().contains("#")) { - String[] pathSegments = path.toString().split("\\."); - Map<String, String> aliasMap = new HashMap<>(); - for (int i = 0; i < pathSegments.length; i++) { - if (pathSegments[i].contains("#")) { - String[] splitedSegment = pathSegments[i].split("#"); - splitedSegment[0] += splitedSegment[1].endsWith("+") ? "+" : ""; - splitedSegment[1] = splitedSegment[1].endsWith("+") ? splitedSegment[1].substring(0, splitedSegment[1].length() - 1) : splitedSegment[1]; - if (aliasMap.putIfAbsent(splitedSegment[1], splitedSegment[0]) != null && !aliasMap.get(splitedSegment[1]).equals(splitedSegment[0])) { - throw new ParseException("Can't add the same alias to different path segments."); - } - pathSegments[i] = splitedSegment[1]; + String[] pathSegments = path.split("\\."); + Map<String, String> aliasMap = new HashMap<>(); + for (int i = 0; i < pathSegments.length; i++) { + if (pathSegments[i].contains("#")) { + String[] splitSegment = pathSegments[i].split("#"); + if(splitSegment[1].endsWith("+")) { + splitSegment[0] += '+'; + splitSegment[1] = splitSegment[1].substring(0, splitSegment[1].length() - 1); } + String previousAlias = aliasMap.putIfAbsent(splitSegment[1], splitSegment[0]); + if (previousAlias != null && !previousAlias.equals(splitSegment[0])) { + throw new ParseException("Can't add the same alias to different path segments."); + } + pathSegments[i] = splitSegment[1]; } - pathExp.setPath(String.join(".", pathSegments)); - pathExp.setPathAliases(aliasMap); - } else { - pathExp.setPath(path); } + pathExp.setPath(String.join(".", pathSegments)); + pathExp.setPathAliases(aliasMap); } } diff --git a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ExpressionUtilsTest.java b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ExpressionUtilsTest.java new file mode 100644 index 000000000..4c3c57798 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ExpressionUtilsTest.java @@ -0,0 +1,73 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +package org.apache.cayenne.exp.parser; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ExpressionUtilsTest { + + @Test + public void testParsePath() throws ParseException { + ASTPath path = new ASTObjPath(); + ExpressionUtils.parsePath(path, "a.b.c.d"); + + assertEquals("a.b.c.d", path.getPath()); + assertEquals(0, path.getPathAliases().size()); + } + + @Test + public void testParsePathOuterJoin() throws ParseException { + ASTPath path = new ASTObjPath(); + ExpressionUtils.parsePath(path, "a.b+.c+.d"); + + assertEquals("a.b+.c+.d", path.getPath()); + assertEquals(0, path.getPathAliases().size()); + } + + @Test + public void testParsePathWithAlias() throws ParseException { + ASTPath path = new ASTObjPath(); + ExpressionUtils.parsePath(path, "a.b.c#p1.d#p2"); + + assertEquals("a.b.p1.p2", path.getPath()); + assertEquals(2, path.getPathAliases().size()); + assertEquals("c", path.getPathAliases().get("p1")); + assertEquals("d", path.getPathAliases().get("p2")); + } + + @Test + public void testParsePathWithAliasAndOuterJoin() throws ParseException { + ASTPath path = new ASTObjPath(); + ExpressionUtils.parsePath(path, "a.b+.c#p1+.d#p2"); + + assertEquals("a.b+.p1.p2", path.getPath()); + assertEquals(2, path.getPathAliases().size()); + assertEquals("c+", path.getPathAliases().get("p1")); + assertEquals("d", path.getPathAliases().get("p2")); + } + + @Test(expected = ParseException.class) + public void testParseInvalidPath() throws ParseException { + ASTPath path = new ASTObjPath(); + ExpressionUtils.parsePath(path, "a.b.c#p1.d#p1"); + } +} \ No newline at end of file