diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java index 84428b1c..0ca600cf 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java @@ -51,6 +51,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryJoin; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryOutput; import com.kingsrook.qqq.backend.core.model.data.QRecord; +import com.kingsrook.qqq.backend.core.model.data.SparseQRecord; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; @@ -177,7 +178,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf { setQueryStatFirstResultTime(); - QRecord record = new QRecord(); + QRecord record = queryInput.getFieldNamesToInclude() == null ? new QRecord() : new SparseQRecord(queryInput.getFieldNamesToInclude()); record.setTableName(table.getName()); LinkedHashMap values = new LinkedHashMap<>(); record.setValues(values); @@ -330,6 +331,8 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf StringBuilder selectClause = new StringBuilder((requiresDistinct) ? "SELECT DISTINCT " : "SELECT ").append(columns); List selectionFieldList = new ArrayList<>(fieldList); + boolean needCommaBeforeJoinFields = !columns.isEmpty(); + /////////////////////////////////// // add any 'selected' queryJoins // /////////////////////////////////// @@ -350,6 +353,10 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf List joinFieldList = joinTable.getFields().values() .stream().filter(field -> fieldNamesToInclude == null || fieldNamesToInclude.contains(tableNameOrAlias + "." + field.getName())) .toList(); + if(joinFieldList.isEmpty()) + { + continue; + } ///////////////////////////////////////////////////// // map to columns, wrapping heavy fields as needed // @@ -363,7 +370,13 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf // append to output objects. // // note that fields are cloned, since we are changing their names to have table/alias prefix. // //////////////////////////////////////////////////////////////////////////////////////////////// - selectClause.append(", ").append(joinColumns); + if(needCommaBeforeJoinFields) + { + selectClause.append(", "); + } + selectClause.append(joinColumns); + needCommaBeforeJoinFields = true; + selectionFieldList.addAll(joinFieldList.stream().map(field -> field.clone().withName(tableNameOrAlias + "." + field.getName())).toList()); } } diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryActionJoinsTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryActionJoinsTest.java index 867b4726..ae659653 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryActionJoinsTest.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryActionJoinsTest.java @@ -1077,6 +1077,24 @@ public class RDBMSQueryActionJoinsTest extends RDBMSActionTest assertThat(queryOutput.getRecords()).allMatch(r -> r.getValues().containsKey("firstName")); assertThat(queryOutput.getRecords()).allMatch(r -> r.getValues().containsKey(TestUtils.TABLE_NAME_PERSONAL_ID_CARD + ".idNumber")); assertThat(queryOutput.getRecords()).allMatch(r -> r.getValues().size() > 2); + + //////////////////////////////////////////////////////////////////////////// + // regression from original build - where only join fields made sql error // + //////////////////////////////////////////////////////////////////////////// + queryInput.withFieldNamesToInclude(Set.of(TestUtils.TABLE_NAME_PERSONAL_ID_CARD + ".idNumber")); + queryOutput = new QueryAction().execute(queryInput); + assertThat(queryOutput.getRecords()).allMatch(r -> r.getValues().containsKey(TestUtils.TABLE_NAME_PERSONAL_ID_CARD + ".idNumber")); + assertThat(queryOutput.getRecords()).allMatch(r -> r.getValues().size() == 1); + + ////////////////////////////////////////////////////////////////////////////////////////// + // similar regression to above, if one of the join tables didn't have anything selected // + ////////////////////////////////////////////////////////////////////////////////////////// + queryInput.withQueryJoin(new QueryJoin(TestUtils.TABLE_NAME_PERSONAL_ID_CARD).withAlias("id2").withSelect(true)); + queryInput.withFieldNamesToInclude(Set.of("firstName", "id2.idNumber")); + queryOutput = new QueryAction().execute(queryInput); + assertThat(queryOutput.getRecords()).allMatch(r -> r.getValues().containsKey("firstName")); + assertThat(queryOutput.getRecords()).allMatch(r -> r.getValues().containsKey("id2.idNumber")); + assertThat(queryOutput.getRecords()).allMatch(r -> r.getValues().size() == 2); } }