Jugen commented on code in PR #610:
URL: https://github.com/apache/cayenne/pull/610#discussion_r1530698772
##########
cayenne/src/main/java/org/apache/cayenne/access/translator/select/OrderingAbstractStage.java:
##########
@@ -57,51 +57,154 @@ protected void processOrdering(QualifierTranslator
qualifierTranslator, Translat
}
}
- private DbAttribute getOrderDbAttribute(Node translatedOrderNode)
+ private boolean orderColumnAbsent(TranslatorContext context, NodeBuilder
nodeBuilder)
{
- DbAttribute[] orderDbAttribute = {null};
- translatedOrderNode.visit(new SimpleNodeTreeVisitor() {
- @Override
- public boolean onNodeStart(Node node) {
- if (node.getType() == NodeType.COLUMN) {
- orderDbAttribute[0] = ((ColumnNode) node).getAttribute();
- return false;
- }
- return true;
+ OrderNodeVisitor orderVisitor = new OrderNodeVisitor();
+ nodeBuilder.build().visit( orderVisitor );
+ List<CharSequence> orderParts = orderVisitor.getParts();
+
+ return context.getResultNodeList().stream()
+ .noneMatch( result -> {
+ ResultNodeVisitor resultVisitor = new
ResultNodeVisitor(orderParts);
+ // Visitor aborts as soon as there's a mismatch with orderParts
+ result.getNode().visit(resultVisitor);
+ return resultVisitor.matches();
+ });
+ }
+
+ private class OrderNodeVisitor extends AppendableVisitor // see below
+ {
+ @Override
+ public boolean onNodeStart(Node node) {
+ node.append( this );
+ node.appendChildrenStart(this);
+ return true;
+ }
+
+ @Override
+ public void onChildNodeEnd(Node parent, Node child, int index, boolean
hasMore) {
+ if (hasMore && parent != null) {
+ parent.appendChildrenSeparator(this, index);
}
- });
- return orderDbAttribute[0];
+ }
+
+ @Override
+ public void onNodeEnd(Node node) {
+ node.appendChildrenEnd(this);
+ }
+
+ List<CharSequence> getParts() {
+ return partList;
+ }
}
- private boolean orderColumnAbsent(TranslatorContext context, NodeBuilder
nodeBuilder)
+ private class ResultNodeVisitor extends AppendableVisitor // see below
{
- var orderDbAttribute = getOrderDbAttribute(nodeBuilder.build());
- if (orderDbAttribute == null) return false; // Alias ?
+ private List<CharSequence> orderItemParts;
+ private boolean itemsMatch = true;
+ private int lastIndex = 0;
- var orderEntity = orderDbAttribute.getEntity().getName();
- var orderColumn = orderDbAttribute.getName();
+ ResultNodeVisitor(List<CharSequence> orderParts) {
+ orderItemParts = orderParts;
+ }
- Predicate<DbAttribute> columnAndEntity = dba -> dba != null
- && orderColumn.equals(dba.getName())
- &&
orderEntity.equals(dba.getEntity().getName());
+ @Override
+ public boolean onNodeStart(Node node) {
+ node.append(this);
+ if (node instanceof ColumnNode && ((ColumnNode) node).getAlias()
!= null) {
+ partList.remove(partList.size()-1); // Remove appended alias
Review Comment:
ArrayList has now been changed to LinkedList.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]