All Downloads are FREE. Search and download functionalities are using the official Maven repository.

prerna.query.interpreters.sql.H2SqlInterpreter Maven / Gradle / Ivy

The newest version!
package prerna.query.interpreters.sql;

import java.util.List;

import prerna.algorithm.api.ITableDataFrame;
import prerna.engine.api.IDatabaseEngine;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.selectors.IQuerySelector;
import prerna.query.querystruct.selectors.QueryColumnSelector;
import prerna.query.querystruct.selectors.QueryFunctionSelector;

public class H2SqlInterpreter extends NoOuterJoinSqlInterpreter {

	public H2SqlInterpreter() {
		
	}

	public H2SqlInterpreter(IDatabaseEngine engine) {
		super(engine);
	}
	
	public H2SqlInterpreter(ITableDataFrame frame) {
		super(frame);
	}
	
	////////////////////////////////////// append group by  ////////////////////////////////////////////
	
	@Override
	public StringBuilder appendGroupBy(StringBuilder query) {
		//grab the order by and get the corresponding display name for that order by column
		List groupBy = ((SelectQueryStruct) this.qs).getGroupBy();
		int numGroups = groupBy.size();
		
		StringBuilder groupByName = new StringBuilder();
		if(this.outerJoinsRequested) {
			boolean first = true;
			
			for(int i = 0; i < numGroups; i++) {
				IQuerySelector groupBySelector = groupBy.get(i);
				
				QueryColumnSelector queryColumnSelector = null;
				QueryFunctionSelector queryFunctionSelector = null;
				
				String colAlias = null;
				
				if(groupBySelector.getSelectorType() == IQuerySelector.SELECTOR_TYPE.COLUMN) {
					queryColumnSelector = (QueryColumnSelector) groupBySelector;
					colAlias = queryColumnSelector.getAlias();
				} else if (groupBySelector.getSelectorType() == IQuerySelector.SELECTOR_TYPE.FUNCTION) {
					queryFunctionSelector = (QueryFunctionSelector) groupBySelector;
					colAlias = queryFunctionSelector.getAlias();
				}
				else {
					String errorMessage = "Cannot group by non QueryColumnSelector and QueryFunctionSelector types yet...";
					logger.error(errorMessage);
					throw new IllegalArgumentException(errorMessage);
				}
				
				//if the groupBy selector is not among the user-requested selectors, then 
				//cannot be used as a groupBy selector
				if (selectorAliases.contains(colAlias)){
					if(!first) {
						groupByName.append(", ");
					} else {
						first = false;
					}
					groupByName.append(colAlias);
				} else {
					continue;
				}
			}
		} else {
			
			for(int i = 0; i < numGroups; i++) {
				IQuerySelector groupBySelector = groupBy.get(i);
				
				QueryColumnSelector queryColumnSelector = null;
				QueryFunctionSelector queryFunctionSelector = null;
				
				String tableConceptualName = null;
				String columnConceptualName = null;
				
				if(groupBySelector.getSelectorType() == IQuerySelector.SELECTOR_TYPE.COLUMN) {
					queryColumnSelector = (QueryColumnSelector) groupBySelector;
					tableConceptualName = queryColumnSelector.getTable();
					columnConceptualName = queryColumnSelector.getColumn();
				} else if (groupBySelector.getSelectorType() == IQuerySelector.SELECTOR_TYPE.FUNCTION) {
					if(i > 0) {
						groupByName.append(", ");
					}
					queryFunctionSelector = (QueryFunctionSelector) groupBySelector;
					groupByName.append(processFunctionSelector(queryFunctionSelector));
					continue;
				}
				else {
					String errorMessage = "Error: Cannot group by non QueryColumnSelector and QueryFunctionSelector types yet...";
					logger.error(errorMessage);
					throw new IllegalArgumentException(errorMessage);
				}
				
				// these are the physical names
				String groupByTable = null;
				String groupByColumn = null;

				// account for custom from
				
				if(this.customFromAliasName != null && !this.customFromAliasName.isEmpty()) {
					groupByTable = this.customFromAliasName;
					groupByColumn = queryUtil.escapeReferencedAlias(columnConceptualName);
				} else {
					groupByTable = getAlias(getPhysicalTableNameFromConceptualName(tableConceptualName));
					if(columnConceptualName.equals(SelectQueryStruct.PRIM_KEY_PLACEHOLDER)){
						groupByColumn = getPrimKey4Table(tableConceptualName);
					} else {
						groupByColumn = getPhysicalPropertyNameFromConceptualName(tableConceptualName, columnConceptualName);
					}
				}
				
				// escape reserved words
				if(queryUtil.isSelectorKeyword(groupByTable)) {
					groupByTable = queryUtil.getEscapeKeyword(groupByTable);
				}
				if(queryUtil.isSelectorKeyword(groupByColumn)) {
					groupByColumn = queryUtil.getEscapeKeyword(groupByColumn);
				}
				
				if(i > 0) {
					groupByName.append(", ");
				}
				
				groupByName.append(groupByTable).append(".").append(groupByColumn);
				
			}
		}
		
		if(numGroups > 0 && groupByName.length() > 0) {
			query.append(" GROUP BY ").append(groupByName);
		}
		return query;
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy