Cleanup code
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/e616dc14 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/e616dc14 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/e616dc14 Branch: refs/heads/master Commit: e616dc140150e016c486cb671998e35e632ab606 Parents: d7acbe8 Author: Nikita Timofeev <stari...@gmail.com> Authored: Tue Jul 31 15:08:02 2018 +0300 Committer: Nikita Timofeev <stari...@gmail.com> Committed: Tue Jul 31 15:08:02 2018 +0300 ---------------------------------------------------------------------- .../cayenne/access/DataDomainQueryAction.java | 6 +- .../access/PrefetchProcessorJointNode.java | 3 +- .../cayenne/access/jdbc/SelectAction.java | 5 +- .../translator/ejbql/EJBQLFromTranslator.java | 10 +- .../apache/cayenne/ejbql/parser/Compiler.java | 23 ++-- .../java/org/apache/cayenne/map/DbEntity.java | 24 +--- .../java/org/apache/cayenne/map/ObjEntity.java | 7 +- .../cayenne/map/PathComponentIterator.java | 122 +++++++++---------- 8 files changed, 83 insertions(+), 117 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/e616dc14/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java index 13b1961..57458a9 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java @@ -743,9 +743,9 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver { // with resolved objects List<PrefetchProcessorNode> segmentNodes = new ArrayList<>(width); for (int i = 0; i < width; i++) { - - if (rsMapping.get(i) instanceof EntityResultSegment) { - EntityResultSegment entitySegment = (EntityResultSegment) rsMapping.get(i); + Object mapping = rsMapping.get(i); + if (mapping instanceof EntityResultSegment) { + EntityResultSegment entitySegment = (EntityResultSegment) mapping; PrefetchProcessorNode nextResult = toResultsTree(entitySegment.getClassDescriptor(), metadata.getPrefetchTree(), mainRows, i); http://git-wip-us.apache.org/repos/asf/cayenne/blob/e616dc14/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java index 784453a..dc7003a 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java @@ -171,8 +171,7 @@ class PrefetchProcessorJointNode extends PrefetchProcessorNode { // make sure we do not include "db:" prefix prefix = translated.getOperand(0) + "."; - } - else { + } else { prefix = ""; } http://git-wip-us.apache.org/repos/asf/cayenne/blob/e616dc14/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java index 0cb1ea7..51f373b 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java @@ -168,8 +168,9 @@ public class SelectAction extends BaseSQLAction { // number of objects returned from Cayenne. int fetchLimit = query.getFetchLimit(); - int offset = translator.isSuppressingDistinct() ? query.getFetchOffset() : getInMemoryOffset(query - .getFetchOffset()); + int offset = translator.isSuppressingDistinct() + ? query.getFetchOffset() + : getInMemoryOffset(query.getFetchOffset()); if (fetchLimit > 0 || offset > 0) { return new LimitResultIterator<>(iterator, offset, fetchLimit); http://git-wip-us.apache.org/repos/asf/cayenne/blob/e616dc14/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLFromTranslator.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLFromTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLFromTranslator.java index e1f3740..f1fc202 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLFromTranslator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLFromTranslator.java @@ -21,9 +21,7 @@ package org.apache.cayenne.access.translator.ejbql; import org.apache.cayenne.ejbql.EJBQLBaseVisitor; import org.apache.cayenne.ejbql.EJBQLExpression; import org.apache.cayenne.ejbql.parser.EJBQLFromItem; -import org.apache.cayenne.ejbql.parser.EJBQLInnerFetchJoin; import org.apache.cayenne.ejbql.parser.EJBQLJoin; -import org.apache.cayenne.ejbql.parser.EJBQLOuterFetchJoin; /** * @since 3.0 @@ -71,10 +69,10 @@ public class EJBQLFromTranslator extends EJBQLBaseVisitor { joinAppender.appendInnerJoin( null, new EJBQLTableId(join.getLeftHandSideId()), - new EJBQLTableId(((EJBQLInnerFetchJoin) join).getRightHandSideId())); + new EJBQLTableId(join.getRightHandSideId())); context.markCurrentPosition(EJBQLJoinAppender - .makeJoinTailMarker(((EJBQLInnerFetchJoin) join).getRightHandSideId())); + .makeJoinTailMarker(join.getRightHandSideId())); return false; } @@ -95,10 +93,10 @@ public class EJBQLFromTranslator extends EJBQLBaseVisitor { joinAppender.appendOuterJoin( null, new EJBQLTableId(join.getLeftHandSideId()), - new EJBQLTableId(((EJBQLOuterFetchJoin) join).getRightHandSideId())); + new EJBQLTableId(join.getRightHandSideId())); context.markCurrentPosition(EJBQLJoinAppender - .makeJoinTailMarker(((EJBQLOuterFetchJoin) join).getRightHandSideId())); + .makeJoinTailMarker(join.getRightHandSideId())); return false; } http://git-wip-us.apache.org/repos/asf/cayenne/blob/e616dc14/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java b/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java index 3908ff3..47eef55 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java @@ -233,26 +233,21 @@ class Compiler { return compiled; } - private EntityResult compileEntityResultWithPrefetch( - EntityResult compiledResult, - EJBQLExpression prefetchExpression) { - final EntityResult result = compiledResult; + private EntityResult compileEntityResultWithPrefetch(EntityResult compiledResult, EJBQLExpression prefetchExpression) { String id = prefetchExpression.getText().toLowerCase(); ClassDescriptor descriptor = descriptorsById.get(id); if (descriptor == null) { descriptor = descriptorsById.get(prefetchExpression.getText()); } - final String prefix = prefetchExpression.getText().substring( - prefetchExpression.getText().indexOf(".") + 1); - - final Set<String> visited = new HashSet<String>(); + String prefix = prefetchExpression.getText().substring(prefetchExpression.getText().indexOf(".") + 1); + Set<String> visited = new HashSet<>(); PropertyVisitor visitor = new PropertyVisitor() { public boolean visitAttribute(AttributeProperty property) { ObjAttribute oa = property.getAttribute(); if (visited.add(oa.getDbAttributePath())) { - result.addObjectField(oa.getEntity().getName(), "fetch." + compiledResult.addObjectField(oa.getEntity().getName(), "fetch." + prefix + "." + oa.getName(), prefix + "." + oa.getDbAttributeName()); @@ -271,7 +266,7 @@ class Compiler { for (DbJoin join : dbRel.getJoins()) { DbAttribute src = join.getSource(); if (src.isForeignKey() && visited.add(src.getName())) { - result.addDbField("fetch." + prefix + "." + src.getName(), prefix + compiledResult.addDbField("fetch." + prefix + "." + src.getName(), prefix + "." + src.getName()); } @@ -286,7 +281,7 @@ class Compiler { // append id columns ... (some may have been appended already via relationships) for (String pkName : descriptor.getEntity().getPrimaryKeyNames()) { if (visited.add(pkName)) { - result + compiledResult .addDbField("fetch." + prefix + "." + pkName, prefix + "." + pkName); @@ -297,13 +292,13 @@ class Compiler { for (ObjAttribute column : descriptor.getDiscriminatorColumns()) { if (visited.add(column.getName())) { - result.addDbField( + compiledResult.addDbField( "fetch." + prefix + "." + column.getDbAttributePath(), prefix + "." + column.getDbAttributePath()); } } - return result; + return compiledResult; } private EntityResult compileEntityResult(EJBQLExpression expression, int position) { @@ -321,7 +316,7 @@ class Compiler { 0 }; - final Set<String> visited = new HashSet<String>(); + final Set<String> visited = new HashSet<>(); PropertyVisitor visitor = new PropertyVisitor() { http://git-wip-us.apache.org/repos/asf/cayenne/blob/e616dc14/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java index 51fefa4..0626655 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java @@ -34,6 +34,7 @@ import org.apache.cayenne.map.event.EntityEvent; import org.apache.cayenne.map.event.MapEvent; import org.apache.cayenne.map.event.RelationshipEvent; import org.apache.cayenne.util.CayenneMapEntry; +import org.apache.cayenne.util.Util; import org.apache.cayenne.util.XMLEncoder; import java.util.ArrayList; @@ -669,7 +670,7 @@ public class DbEntity extends Entity implements ConfigurationNode, DbEntityListe } private PathComponentIterator createPathIterator(String path) { - return new PathComponentIterator(DbEntity.this, path, new HashMap<>()); + return new PathComponentIterator(DbEntity.this, path, Collections.emptyMap()); // TODO: do we need aliases here? } @@ -713,7 +714,7 @@ public class DbEntity extends Entity implements ConfigurationNode, DbEntityListe appendPath(finalPath, component); } - return convertToPath(finalPath); + return Util.join(finalPath, Entity.PATH_SEPARATOR); } // case (1) if (path.equals(relationshipPath)) { @@ -736,7 +737,7 @@ public class DbEntity extends Entity implements ConfigurationNode, DbEntityListe appendPath(finalPath, lastDBR); } - return convertToPath(finalPath); + return Util.join(finalPath, Entity.PATH_SEPARATOR); } // case (2) @@ -751,7 +752,6 @@ public class DbEntity extends Entity implements ConfigurationNode, DbEntityListe // for inserts from the both ends use LinkedList LinkedList<String> finalPath = new LinkedList<>(); - while (relationshipIt.hasNext() && pathIt.hasNext()) { // relationship path components must be DbRelationships DbRelationship nextDBR = (DbRelationship) relationshipIt.next(); @@ -783,21 +783,7 @@ public class DbEntity extends Entity implements ConfigurationNode, DbEntityListe appendPath(finalPath, component); } - return convertToPath(finalPath); - } - - private String convertToPath(List<String> path) { - StringBuilder converted = new StringBuilder(); - int len = path.size(); - for (int i = 0; i < len; i++) { - if (i > 0) { - converted.append(Entity.PATH_SEPARATOR); - } - - converted.append(path.get(i)); - } - - return converted.toString(); + return Util.join(finalPath, Entity.PATH_SEPARATOR); } private void prependReversedPath(LinkedList<String> finalPath, DbRelationship relationship) { http://git-wip-us.apache.org/repos/asf/cayenne/blob/e616dc14/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java index 02eb43e..74e793d 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java @@ -1010,7 +1010,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio } private PathComponentIterator createPathIterator(String path) { - return new PathComponentIterator(ObjEntity.this, path, new HashMap<String, String>()); + return new PathComponentIterator(ObjEntity.this, path, Collections.emptyMap()); // TODO: do we need aliases here? } @@ -1077,11 +1077,8 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio } // convert obj_path to db_path - String converted = toDbPath(createPathIterator((String) expression.getOperand(0))); - Expression exp = ExpressionFactory.expressionOfType(Expression.DB_PATH); - exp.setOperand(0, converted); - return exp; + return ExpressionFactory.dbPathExp(converted); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/e616dc14/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponentIterator.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponentIterator.java b/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponentIterator.java index e631156..a23a281 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponentIterator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponentIterator.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.Map; +import java.util.Objects; import java.util.StringTokenizer; /** @@ -32,16 +33,17 @@ import java.util.StringTokenizer; */ class PathComponentIterator implements Iterator<PathComponent<Attribute, Relationship>> { - private StringTokenizer toks; + private final StringTokenizer toks; + private final String path; + private final Map<String, String> aliasMap; + private Entity currentEntity; - private String path; - private Map<String, String> aliasMap; PathComponentIterator(Entity root, String path, Map<String, String> aliasMap) { - currentEntity = root; - toks = new StringTokenizer(path, Entity.PATH_SEPARATOR); - this.path = path; - this.aliasMap = aliasMap; + this.currentEntity = Objects.requireNonNull(root); + this.path = Objects.requireNonNull(path); + this.aliasMap = Objects.requireNonNull(aliasMap); + this.toks = new StringTokenizer(path, Entity.PATH_SEPARATOR); } public boolean hasNext() { @@ -56,8 +58,7 @@ class PathComponentIterator implements Iterator<PathComponent<Attribute, Relatio // we only support LEFT JOINS for now... if (pathComp.endsWith(Entity.OUTER_JOIN_INDICATOR)) { relationshipJoinType = JoinType.LEFT_OUTER; - pathComp = pathComp.substring(0, pathComp.length() - - Entity.OUTER_JOIN_INDICATOR.length()); + pathComp = pathComp.substring(0, pathComp.length() - Entity.OUTER_JOIN_INDICATOR.length()); } // see if this is an attribute @@ -66,79 +67,68 @@ class PathComponentIterator implements Iterator<PathComponent<Attribute, Relatio // do a sanity check... if (toks.hasMoreTokens()) { throw new ExpressionException( - "Attribute must be the last component of the path: '" - + pathComp - + "'.", - path, - null); + "Attribute must be the last component of the path: '" + pathComp + "'.", path, null); } - return new AttributePathComponent<Attribute, Relationship>(attr); + return new AttributePathComponent<>(attr); } Relationship rel = currentEntity.getRelationship(pathComp); if (rel != null) { currentEntity = rel.getTargetEntity(); - return new RelationshipPathComponent<Attribute, Relationship>( - rel, - relationshipJoinType, - !hasNext()); + return new RelationshipPathComponent<>(rel, relationshipJoinType, !hasNext()); + } + + PathComponent<Attribute, Relationship> aliasedPathComponent = getAliasedPathComponent(pathComp); + if (aliasedPathComponent != null) { + return aliasedPathComponent; + } + + throw invalidPathException("Can't resolve path component", pathComp); + } + + private PathComponent<Attribute, Relationship> getAliasedPathComponent(String pathComp) { + String aliasedPath = aliasMap.get(pathComp); + if(aliasedPath == null) { + return null; } - String aliasedPath = (aliasMap != null) ? aliasMap.get(pathComp) : null; - if (aliasedPath != null) { - - // a few fairly arbitrary assumptions.... if we find that they restrict valid - // and useful cases, we can change this behavior: - // - // 1. No nested aliases. Aliased path must contain only unaliased component - // names. - // 2. Subpath must be relationship-only. Aliasing attributes doesn't seem - // useful, so we don't handle this case for simplicity... - - // fully resolve subpath here... since we need to know the target entity of - // the subpath, we have to fully traverse it, hence instead of lazy iterator - // we might as well reuse obtained information in the AliasPathComponent - - Iterator<PathComponent<Attribute, Relationship>> subpathIt = new PathComponentIterator( - currentEntity, - aliasedPath, - Collections.<String, String>emptyMap()); - - Collection<PathComponent<Attribute, Relationship>> parsedSubpath = new ArrayList<>(4); - - while (subpathIt.hasNext()) { - PathComponent<Attribute, Relationship> subpathComponent = subpathIt.next(); - - Relationship subpathRelationship = subpathComponent.getRelationship(); - if (subpathRelationship == null) { - throw invalidPathException( - "Expected a relationship in the aliased subpath. Alias [" - + pathComp - + "]", - subpathComponent.getName()); - } - - currentEntity = subpathRelationship.getTargetEntity(); - parsedSubpath.add(subpathComponent); + // a few fairly arbitrary assumptions.... if we find that they restrict valid + // and useful cases, we can change this behavior: + // + // 1. No nested aliases. Aliased path must contain only unaliased component names. + // 2. Subpath must be relationship-only. Aliasing attributes doesn't seem + // useful, so we don't handle this case for simplicity... + + // fully resolve subpath here... since we need to know the target entity of + // the subpath, we have to fully traverse it, hence instead of lazy iterator + // we might as well reuse obtained information in the AliasPathComponent + + Iterator<PathComponent<Attribute, Relationship>> subpathIt = + new PathComponentIterator(currentEntity, aliasedPath, Collections.emptyMap()); + + Collection<PathComponent<Attribute, Relationship>> parsedSubpath = new ArrayList<>(4); + + while (subpathIt.hasNext()) { + PathComponent<Attribute, Relationship> subpathComponent = subpathIt.next(); + + Relationship subpathRelationship = subpathComponent.getRelationship(); + if (subpathRelationship == null) { + throw invalidPathException( + "Expected a relationship in the aliased subpath. Alias [" + pathComp + "]", + subpathComponent.getName()); } - return new AliasPathComponent<>(pathComp, parsedSubpath, !hasNext()); + currentEntity = subpathRelationship.getTargetEntity(); + parsedSubpath.add(subpathComponent); } - throw invalidPathException("Can't resolve path component", pathComp); + return new AliasPathComponent<>(pathComp, parsedSubpath, !hasNext()); } private ExpressionException invalidPathException(String message, String pathComponent) { - StringBuilder buffer = new StringBuilder(); - buffer - .append(message) - .append(": [") - .append(currentEntity.getName()) - .append('.') - .append(pathComponent) - .append("]."); - return new ExpressionException(buffer.toString(), path, null); + String buffer = message + ": [" + currentEntity.getName() + '.' + pathComponent + "]."; + return new ExpressionException(buffer, path, null); } public void remove() {