From 916c8c3ba69a2ef2fca9c4b6e3ab2b7a2b234c27 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 19 Mar 2025 16:43:23 -0500 Subject: [PATCH] Add support for orderBys on child-joins --- .../metadata/MetaDataProducerHelper.java | 2 +- ...omRecordEntityGenericMetaDataProducer.java | 47 +++++++++++++++---- .../producers/annotations/ChildJoin.java | 9 ++++ 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerHelper.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerHelper.java index ec41e0b6..14a056ba 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerHelper.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/MetaDataProducerHelper.java @@ -417,7 +417,7 @@ public class MetaDataProducerHelper return (null); } - ChildJoinFromRecordEntityGenericMetaDataProducer producer = new ChildJoinFromRecordEntityGenericMetaDataProducer(childTableName, parentTableName, possibleValueFieldName); + ChildJoinFromRecordEntityGenericMetaDataProducer producer = new ChildJoinFromRecordEntityGenericMetaDataProducer(childTableName, parentTableName, possibleValueFieldName, childTable.childJoin().orderBy()); producer.setSourceClass(entityClass); return producer; } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildJoinFromRecordEntityGenericMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildJoinFromRecordEntityGenericMetaDataProducer.java index c1bc51cf..958b4900 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildJoinFromRecordEntityGenericMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/ChildJoinFromRecordEntityGenericMetaDataProducer.java @@ -24,11 +24,13 @@ package com.kingsrook.qqq.backend.core.model.metadata.producers; import java.util.Objects; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterOrderBy; import com.kingsrook.qqq.backend.core.model.metadata.MetaDataProducerInterface; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.joins.JoinOn; import com.kingsrook.qqq.backend.core.model.metadata.joins.JoinType; import com.kingsrook.qqq.backend.core.model.metadata.joins.QJoinMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.ChildJoin; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; @@ -39,12 +41,11 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; ** ** e.g., Orders & LineItems - on the Order entity ** - @QMetaDataProducingEntity( - childTables = { @ChildTable( - childTableEntityClass = LineItem.class, - childJoin = @ChildJoin(enabled = true), - childRecordListWidget = @ChildRecordListWidget(enabled = true, label = "Order Lines")) - } + @QMetaDataProducingEntity( childTables = { @ChildTable( + childTableEntityClass = LineItem.class, + childJoin = @ChildJoin(enabled = true), + childRecordListWidget = @ChildRecordListWidget(enabled = true, label = "Order Lines")) + } ) public class Order extends QRecordEntity ** @@ -62,13 +63,16 @@ public class ChildJoinFromRecordEntityGenericMetaDataProducer implements MetaDat private String parentTableName; // e.g., order private String foreignKeyFieldName; // e.g., orderId + private ChildJoin.OrderBy[] orderBys; + private Class sourceClass; + /*************************************************************************** ** ***************************************************************************/ - public ChildJoinFromRecordEntityGenericMetaDataProducer(String childTableName, String parentTableName, String foreignKeyFieldName) + public ChildJoinFromRecordEntityGenericMetaDataProducer(String childTableName, String parentTableName, String foreignKeyFieldName, ChildJoin.OrderBy[] orderBys) { Objects.requireNonNull(childTableName, "childTableName cannot be null"); Objects.requireNonNull(parentTableName, "parentTableName cannot be null"); @@ -77,6 +81,7 @@ public class ChildJoinFromRecordEntityGenericMetaDataProducer implements MetaDat this.childTableName = childTableName; this.parentTableName = parentTableName; this.foreignKeyFieldName = foreignKeyFieldName; + this.orderBys = orderBys; } @@ -87,18 +92,39 @@ public class ChildJoinFromRecordEntityGenericMetaDataProducer implements MetaDat @Override public QJoinMetaData produce(QInstance qInstance) throws QException { - QTableMetaData possibleValueTable = qInstance.getTable(parentTableName); - if(possibleValueTable == null) + QTableMetaData parentTable = qInstance.getTable(parentTableName); + if(parentTable == null) { throw (new QException("Could not find tableMetaData " + parentTableName)); } + QTableMetaData childTable = qInstance.getTable(childTableName); + if(childTable == null) + { + throw (new QException("Could not find tableMetaData " + childTable)); + } + QJoinMetaData join = new QJoinMetaData() .withLeftTable(parentTableName) .withRightTable(childTableName) .withInferredName() .withType(JoinType.ONE_TO_MANY) - .withJoinOn(new JoinOn(possibleValueTable.getPrimaryKeyField(), foreignKeyFieldName)); + .withJoinOn(new JoinOn(parentTable.getPrimaryKeyField(), foreignKeyFieldName)); + + if(orderBys != null && orderBys.length > 0) + { + for(ChildJoin.OrderBy orderBy : orderBys) + { + join.withOrderBy(new QFilterOrderBy(orderBy.fieldName(), orderBy.isAscending())); + } + } + else + { + ////////////////////////////////////////////////////////// + // by default, sort by the id of the child table... mmm // + ////////////////////////////////////////////////////////// + join.withOrderBy(new QFilterOrderBy(childTable.getPrimaryKeyField())); + } return (join); } @@ -126,6 +152,7 @@ public class ChildJoinFromRecordEntityGenericMetaDataProducer implements MetaDat } + /******************************************************************************* ** Fluent setter for sourceClass ** diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/annotations/ChildJoin.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/annotations/ChildJoin.java index 2266679e..41f6158d 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/annotations/ChildJoin.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/producers/annotations/ChildJoin.java @@ -35,4 +35,13 @@ import java.lang.annotation.RetentionPolicy; public @interface ChildJoin { boolean enabled(); + + OrderBy[] orderBy() default { }; + + @interface OrderBy + { + String fieldName(); + + boolean isAscending() default true; + } }