Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 8 additions & 26 deletions Model/src/main/java/org/gusdb/wdk/model/query/SqlQuery.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import org.apache.log4j.Logger;
import org.gusdb.fgputil.Timer;
import org.gusdb.fgputil.db.platform.SupportedPlatform;
import org.gusdb.fgputil.validation.ValidObjectFactory.RunnableObj;
import org.gusdb.wdk.model.AttributeMetaQueryHandler;
import org.gusdb.wdk.model.WdkModel;
Expand Down Expand Up @@ -318,16 +317,21 @@ public void resolveReferences(WdkModel wdkModel) throws WdkModelException {
// IMPORTANT: Must populate macro BEFORE super.resolveReferences() which validates macros
if (_attributeMetaQueryRef != null) {
Timer timer = new Timer();
List<String> metaColumnDefs = new ArrayList<>();
for (Map<String,Object> row : getDynamicallyDefinedAttributes(_attributeMetaQueryRef, wdkModel)) {
Column column = new Column();
// Need to set this here since this column originates from the database
column.setQuery(SqlQuery.this);
AttributeMetaQueryHandler.populate(column, row);
_columnMap.put(column.getName(), column);
metaColumnDefs.add(column.getName() + " " + column.getType().getPostgresType());
}

populateCrosstabMacroWithDiscoveredColumns(wdkModel);

// Populate the crosstab macro with ordered column definitions from the meta query
// If no columns returned, use a placeholder to prevent SQL parse errors
String macroValue = metaColumnDefs.isEmpty() ?
"_no_columns_defined text" :
String.join(", ", metaColumnDefs);
addSqlParamValue(META_ATTRIBUTE_COLUMNS_FOR_CROSSTAB, macroValue);
LOG.debug("Took " + timer.getElapsedString() + " to resolve AttributeMetaQuery: " + _attributeMetaQueryRef);
}

Expand All @@ -342,28 +346,6 @@ public void resolveReferences(WdkModel wdkModel) throws WdkModelException {
}
}

private void populateCrosstabMacroWithDiscoveredColumns(WdkModel wdkModel) throws WdkModelException {
// check if this query's SQL contains a crosstab macro that needs to be filled in with columns discovered by the meta query
if (_sql.contains(META_ATTRIBUTE_COLUMNS_FOR_CROSSTAB)) {

// This macro is only supported on Postgres
if (wdkModel.getModelConfig().getAppDB().getPlatformEnum() != SupportedPlatform.POSTGRESQL) {
throw new WdkModelException("SQL Query " + getName() + ": Crosstab macro is only supported on Postgres App DBs.");
}

// Populate the crosstab macro with ordered column definitions from the meta query
// If no columns returned, use a placeholder to prevent SQL parse errors
List<String> metaColumnDefs = new ArrayList<>();
for (Column column : _columnMap.values()) {
metaColumnDefs.add(column.getName() + " " + column.getType().getPostgresType());
}
String macroValue = metaColumnDefs.isEmpty() ?
"_no_columns_defined text" :
String.join(", ", metaColumnDefs);
addSqlParamValue(META_ATTRIBUTE_COLUMNS_FOR_CROSSTAB, macroValue);
}
}

@Override
public Map<String, AttributeFieldDataType> resolveColumnTypes() throws WdkModelException {
var types = new LinkedHashMap<String, AttributeFieldDataType>();
Expand Down