/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.query.ui.sqleditor.component; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.text.html.Option; import org.teiid.designer.query.sql.lang.IFrom; import org.teiid.designer.query.sql.lang.IGroupBy; import org.teiid.designer.query.sql.lang.IInto; import org.teiid.designer.query.sql.lang.IOrderBy; import org.teiid.designer.query.sql.lang.IQuery; import org.teiid.designer.query.sql.lang.ISelect; /** * The <code>QueryDisplayNode</code> class is used to represent a SELECT Query. * * @since 8.0 */ public class QueryDisplayNode extends DisplayNode { // ///////////////////////////////////////////////////////////////////////// // CONSTRUCTOR // ///////////////////////////////////////////////////////////////////////// /** * QueryDisplayNode constructor * * @param parentNode the parent DisplayNode of this. * @param query the query language object used to construct this display node. */ public QueryDisplayNode( DisplayNode parentNode, IQuery query ) { this.parentNode = parentNode; this.languageObject = query; } // ///////////////////////////////////////////////////////////////////////// // PUBLIC METHODS // ///////////////////////////////////////////////////////////////////////// /** * Returns the DisplayNode for the Clause if there is one, null if not */ public DisplayNode getClauseDisplayNode( int clauseType ) { DisplayNode resultNode = null; if (clauseType < SELECT || clauseType > OPTION) { return resultNode; } Iterator iter = childNodeList.iterator(); while (iter.hasNext()) { resultNode = (DisplayNode)iter.next(); switch (clauseType) { case SELECT: if (resultNode.languageObject instanceof ISelect) { return resultNode; } break; case INTO: if (resultNode.languageObject instanceof IInto) { return resultNode; } break; case FROM: if (resultNode.languageObject instanceof IFrom) { return resultNode; } break; case WHERE: if (resultNode instanceof WhereDisplayNode) { return resultNode; } break; case GROUPBY: if (resultNode.languageObject instanceof IGroupBy) { return resultNode; } break; case HAVING: if (resultNode instanceof HavingDisplayNode) { return resultNode; } break; case ORDERBY: if (resultNode.languageObject instanceof IOrderBy) { return resultNode; } break; case OPTION: if (resultNode.languageObject instanceof Option) { return resultNode; } break; default: break; } } return null; } /** * Returns the DisplayNode clause at a given index. The entire clause is returned - SELECT, FROM, WHERE, GROUPBY, HAVING, * ORDERBY, or OPTION */ public DisplayNode getClauseAtIndex( int index ) { int nChildren = childNodeList.size(); List validClauses = new ArrayList(0); for (int i = 0; i < nChildren; i++) { DisplayNode node = childNodeList.get(i); if (node.isAnywhereWithin(index)) { validClauses.add(node); } } // if the index is between two clauses, return the second one int nClauses = validClauses.size(); if (nClauses == 0) { // Do one last check to see if between nodes for (int i = 0; i < (nChildren - 1); i++) { DisplayNode node1 = childNodeList.get(i); DisplayNode node2 = childNodeList.get(i + 1); int endNode1 = node1.getEndIndex(); int startNode2 = node2.getStartIndex(); if (index > (endNode1 + 1) && index < startNode2) { return node1; } if (i == (nChildren - 2)) { return node2; } } return null; } else if (nClauses == 1) { return (DisplayNode)validClauses.get(0); } else if (nClauses == 2) { return (DisplayNode)validClauses.get(1); } else { return null; } } }