Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
package prerna.query.querystruct;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import prerna.ds.nativeframe.NativeFrame;
import prerna.masterdatabase.utility.MasterDatabaseUtility;
import prerna.om.InsightPanel;
import prerna.query.querystruct.selectors.IQuerySelector;
import prerna.query.querystruct.selectors.IQuerySort;
import prerna.query.querystruct.selectors.QueryColumnOrderBySelector;
import prerna.query.querystruct.selectors.QueryColumnSelector;
import prerna.query.querystruct.selectors.QueryCustomOrderBy;
import prerna.query.querystruct.selectors.QueryFunctionHelper;
import prerna.query.querystruct.selectors.QueryFunctionSelector;
public class SelectQueryStruct extends AbstractQueryStruct {
protected boolean isDistinct = true;
protected List orderByOperations = new Vector<>();
protected List groupBy = new Vector<>();
// panel specific
protected transient List panelOrderByOperations = new Vector<>();
protected long limit = -1;
protected long offset = -1;
// query is the complete query overhall
public enum Query_Part {
SELECT, FILTER, HAVING, SORT, GROUP, AGGREGATE, QUERY;
}
protected transient Map queryPartHash = new HashMap();
////////////////////////////////////////////////////
///////////////////// ORDERING /////////////////////
////////////////////////////////////////////////////
public void setOrderBy(List orderByOperations) {
this.orderByOperations = orderByOperations;
}
public void addOrderBy(List orderByOperations) {
for(IQuerySort orderBy : orderByOperations) {
addOrderBy(orderBy);
}
}
public void addOrderBy(String concept, String property, String sortDir) {
if(property == null) {
property = AbstractQueryStruct.PRIM_KEY_PLACEHOLDER;
}
QueryColumnOrderBySelector selector = new QueryColumnOrderBySelector();
selector.setTable(concept);
selector.setColumn(property);
selector.setSortDir(sortDir);
this.orderByOperations.add(selector);
}
public void addOrderBy(String qsName) {
QueryColumnOrderBySelector selector = new QueryColumnOrderBySelector(qsName);
this.orderByOperations.add(selector);
}
public void addOrderBy(String qsName, String sortDir) {
QueryColumnOrderBySelector selector = new QueryColumnOrderBySelector(qsName);
selector.setSortDir(sortDir);
this.orderByOperations.add(selector);
}
public void addOrderBy(IQuerySort selector) {
this.orderByOperations.add(selector);
}
/**
* Returns order bys defined in the qs
* NOTE - USE COMBINED ORDER BY TO COMBINE PANEL ORDER BY ON VISUALIZATIONS
* @return
*/
public List getOrderBy() {
return this.orderByOperations;
}
public List getCombinedOrderBy() {
List combinedSorts = new ArrayList<>();
combinedSorts.addAll(this.orderByOperations);
combinedSorts.addAll(this.panelOrderByOperations);
return combinedSorts;
}
public void setPanelOrderBy(List panelOrderByOperations) {
this.panelOrderByOperations = panelOrderByOperations;
}
public List getPanelOrderBy() {
return this.panelOrderByOperations;
}
// overriding methods for ordering with panels
@Override
public void addPanel(InsightPanel panel) {
if(!this.panelList.contains(panel)) {
this.panelList.add(panel);
this.panelIdList.add(panel.getPanelId());
// also add in the current panel state
this.panelImplicitFilters.merge(panel.getPanelFilters());
this.panelOrderByOperations.addAll(panel.getPanelOrderBys());
}
}
@Override
public void setPanelList(List panelList) {
// this method is same as the super
// but we are also doing the order by
this.panelList = panelList;
this.panelImplicitFilters.clear();
this.panelOrderByOperations.clear();
for(InsightPanel panel : panelList) {
// also add in the current panel state
this.panelImplicitFilters.merge(panel.getPanelFilters());
this.panelOrderByOperations.addAll(panel.getPanelOrderBys());
}
}
////////////////////////////////////////////////////
///////////////////// GROUP BY /////////////////////
////////////////////////////////////////////////////
public void setGroupBy(List groupBy) {
this.groupBy = groupBy;
}
public void addGroupBy(IQuerySelector selector) {
this.groupBy.add(selector);
}
public void addGroupBy(String concept, String property) {
if(property == null) {
property = AbstractQueryStruct.PRIM_KEY_PLACEHOLDER;
}
QueryColumnSelector selector = new QueryColumnSelector();
selector.setTable(concept);
selector.setColumn(property);
this.groupBy.add(selector);
}
public List getGroupBy() {
return this.groupBy;
}
////////////////////////////////////////////////////
/////////////////////// OTHER //////////////////////
////////////////////////////////////////////////////
public void setLimit(long limit) {
this.limit = limit;
}
public long getLimit() {
return this.limit;
}
public void setOffSet(long offset) {
this.offset = offset;
}
public long getOffset() {
return this.offset;
}
public void setDistinct(boolean isDistinct) {
this.isDistinct = isDistinct;
}
public boolean isDistinct() {
return this.isDistinct;
}
/**
* Return is this column has an existing filter in the QS
* @param column
* @return
*/
public boolean hasFiltered(String column) {
return this.explicitFilters.hasFilter(column);
}
/**
* Return if this column is part of the return
* @param qsName
* @return
*/
public boolean hasColumn(String qsName) {
for(IQuerySelector selector : this.selectors) {
if(selector.getQueryStructName().equals(qsName)) {
return true;
}
}
return false;
}
public IQuerySelector findSelectorFromAlias(String alias) {
for(IQuerySelector selector : this.selectors) {
if(selector.getAlias().equals(alias)) {
return selector;
}
}
return null;
}
/**
* Returns if no information has been set into the query struct
* @return
*/
public boolean isEmpty() {
// if any of the main 3 objects within the QS have info, return false
// even in the case that selectors are empty, if other info is set, the QS will still
// return false for this method
return (!this.selectors.isEmpty() || !this.relationsSet.isEmpty() || !this.explicitFilters.isEmpty()) ;
}
/**
*
* @param incomingQS
*
* This method is responsible for merging "incomingQS's" data with THIS querystruct
*/
public void merge(AbstractQueryStruct incomingQS) {
super.merge(incomingQS);
if(incomingQS instanceof SelectQueryStruct) {
SelectQueryStruct selectQS = (SelectQueryStruct) incomingQS;
mergeGroupBy(selectQS.groupBy);
mergeOrderBy(selectQS.orderByOperations);
if(selectQS.limit > -1) {
setLimit(selectQS.limit);
}
if(selectQS.offset > -1) {
setOffSet(selectQS.offset);
}
}
}
/**
*
* @param groupBys
* Merge the group by selectors
*/
public void mergeGroupBy(List groupBys) {
for(IQuerySelector selector : groupBys) {
if(!this.groupBy.contains(selector)) {
this.groupBy.add(selector);
}
}
}
/**
*
* @param orderBys
* Merge the order by selectors
*/
public void mergeOrderBy(List orderBys) {
for(IQuerySort selector : orderBys) {
if(!this.orderByOperations.contains(selector)) {
this.orderByOperations.add(selector);
}
}
}
////////////////////////////////////////////////////
////////////// For Task Meta Info //////////////////
////////////////////////////////////////////////////
//TODO: this only handles base case of columns and math on a single column
public List