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

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

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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.IQuerySort;
import prerna.query.querystruct.selectors.QueryColumnOrderBySelector;
import prerna.query.querystruct.selectors.QueryColumnOrderBySelector.ORDER_BY_DIRECTION;

public class DatabricksSqlInterpreter extends SqlInterpreter {

	private Map qsSelectorToAlias = new HashMap<>();
	
	public DatabricksSqlInterpreter() {

	}

	public DatabricksSqlInterpreter(IDatabaseEngine engine) {
		super(engine);
	}

	public DatabricksSqlInterpreter(ITableDataFrame frame) {
		super(frame);
	}

	@Override
	public void addSelector(IQuerySelector selector) {
		String alias = selector.getAlias();
		String newSelector = processSelector(selector, true) + " AS `" + alias + "`";
		if(selectors.length() == 0) {
			selectors = newSelector;
		} else {
			selectors += " , " + newSelector;
		}
		selectorList.add(newSelector);
		selectorAliases.add(alias);
		
		this.qsSelectorToAlias.put(selector.getQueryStructName(), alias);
	}
	
	@Override
	protected void addOrderBySelector() {
		int counter = 0;
		for(StringBuilder orderBySelector : this.orderBySelectors) {
			String alias = "o"+counter++;
			String newSelector = "("+orderBySelector+") AS " + "\""+alias+"\"";
			if(selectors.length() == 0) {
				selectors = newSelector;
			} else {
				selectors += " , " + newSelector;
			}
			selectorList.add(newSelector);
			selectorAliases.add(alias);
		}
	}

	@Override
	public StringBuilder appendOrderBy(StringBuilder query) {
		//grab the order by and get the corresponding display name for that order by column
		List orderByList = ((SelectQueryStruct) this.qs).getCombinedOrderBy();
		List validOrderBys = new ArrayList<>();
		for(IQuerySort orderBy : orderByList) {
			if(orderBy.getQuerySortType() == IQuerySort.QUERY_SORT_TYPE.COLUMN) {
				QueryColumnOrderBySelector orderBySelector = (QueryColumnOrderBySelector) orderBy;
				String tableConceptualName = orderBySelector.getTable();
				String columnConceptualName = orderBySelector.getColumn();
				ORDER_BY_DIRECTION orderByDir = orderBySelector.getSortDir();

				boolean origPrim = false;
				if(columnConceptualName.equals(SelectQueryStruct.PRIM_KEY_PLACEHOLDER)){
					origPrim = true;
					columnConceptualName = getPrimKey4Table(tableConceptualName);
				} else if(this.customFromAliasName==null || this.customFromAliasName.isEmpty()){
					columnConceptualName = getPhysicalPropertyNameFromConceptualName(tableConceptualName, columnConceptualName);
				}

				StringBuilder thisOrderBy = new StringBuilder();

				// might want to order by a derived column being returned
				if(origPrim && this.selectorAliases.contains(tableConceptualName)) {
					// either instantiate the string builder or add a comma for multi sort
					if(queryUtil.isSelectorKeyword(tableConceptualName)) {
						thisOrderBy.append(queryUtil.getEscapeKeyword(tableConceptualName));
					} else {
						thisOrderBy.append(queryUtil.escapeReferencedAlias(tableConceptualName));
					}
				}
				// account for custom from + sort is a valid column being returned
				else if(this.customFromAliasName != null && !this.customFromAliasName.isEmpty()) {
					String orderByTable = this.customFromAliasName;
					String orderByColumn = queryUtil.escapeReferencedAlias(columnConceptualName);

					if(this.retTableToCols.get(orderByTable).contains(orderByColumn)) {
						thisOrderBy.append(orderByTable).append(".").append(orderByColumn);
					} else {
						continue;
					}
				}
				// account for sort being on table/column being returned
				else if(this.retTableToCols.containsKey(tableConceptualName) && 
						this.retTableToCols.get(tableConceptualName).contains(columnConceptualName) &&
						orderBy.getQuerySortType() == IQuerySort.QUERY_SORT_TYPE.COLUMN && 
						this.qsSelectorToAlias.containsKey( ((QueryColumnOrderBySelector) orderBy).getQueryStructName()) ) 
				{
					// we need to find the alias for this column and order by the alias
					String alias = this.qsSelectorToAlias.get(((QueryColumnOrderBySelector) orderBy).getQueryStructName());
					thisOrderBy.append("`").append(alias).append("`");
				}
				// well, this is not a valid order by to add
				else {
					continue;
				}

				if(orderByDir == ORDER_BY_DIRECTION.ASC) {
					thisOrderBy.append(" ASC ");
				} else {
					thisOrderBy.append(" DESC ");
				}
				validOrderBys.add(thisOrderBy);
			}
		}

		int size = validOrderBys.size();
		for(int i = 0; i < size; i++) {
			if(i == 0) {
				query.append(" ORDER BY ");
			} else {
				query.append(", ");
			}
			query.append(validOrderBys.get(i).toString());
		}
		return query;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy