froehlich 01/11/12 05:28:09
Modified: apps/db/src/java/org/apache/avalon/db/basic/actions
BasicSelect.java
Log:
where hack
Revision Changes Path
1.8 +184 -40
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicSelect.java
Index: BasicSelect.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicSelect.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- BasicSelect.java 2001/11/11 21:44:47 1.7
+++ BasicSelect.java 2001/11/12 13:28:08 1.8
@@ -14,11 +14,13 @@
import org.apache.avalon.db.results.RowSet;
import org.apache.avalon.db.results.Columns;
import org.apache.avalon.db.basic.data.BasicTable;
+import org.apache.avalon.db.basic.data.BasicRow;
import org.apache.avalon.db.basic.results.BasicColumns;
import org.apache.avalon.db.basic.results.BasicRowSet;
import org.apache.avalon.db.utils.RhinoHelper;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
+import org.w3c.dom.Node;
import java.util.Vector;
import java.util.Iterator;
@@ -54,55 +56,197 @@
public void execute() throws ActionException {
StringBuffer strbuf = new StringBuffer();
Vector selectedRows = new Vector();
- //Rhino makes problems...causes EOFException...
BasicTable table = null;
- String tablename = "";
- try {
- NodeList subRootNodes = mRootElement.getChildNodes();
- /** traverse the dom tree */
- System.out.println("traverse the dom tree");
- boolean where = false;
- String whereExpr = "";
- for (int i = 0 ; i < subRootNodes.getLength(); i++) {
- if (subRootNodes.item(i).getNodeName().equals("columns")) {
- //TODO process colums and store them temporary for
- //further usage...
- } else if
(subRootNodes.item(i).getNodeName().equals("from")) {
- NodeList subFromNodes =
subRootNodes.item(i).getChildNodes();
- for(int j = 0; j < subFromNodes.getLength(); j++) {
- if
(subFromNodes.item(j).getNodeName().equals("table")) {
- //ToDo store the tablename for further lookups
- Element rowNode = (Element)subFromNodes.item(j);
- tablename = rowNode.getAttribute("name");
- System.out.println("tablename=" + tablename);
- table = (BasicTable)
mDatabasePersistor.getQueryable(tablename);
+ RhinoHelper rh = new RhinoHelper();
+ String[] cols;
+ String[] tablenames;
+ Object[] selectedrow = null;
+
+ System.out.println("execute(): select");
+ if(true) {
+ cols = parseSelect(mRootElement);
+ tablenames = parseFrom(mRootElement);
+ parseWhereRoot(mRootElement);
+ System.out.println("cols.length=" + cols.length);
+ System.out.println("tablenames.length=" + tablenames.length);
+ } else {
+ throw new ActionException("invalid select syntax");
+ }
+
+ selectedRows = new Vector();
+ if(true) {
+ /** without where all rows */
+ for(int i=0; i < tablenames.length; i++) {
+ /** get the table, should be only one */
+ table =
(BasicTable)mDatabasePersistor.getQueryable(tablenames[i]);
+ Iterator it = table.getRows().iterator();
+ while(it.hasNext()) {
+ /** iterate rows and select only the needed cols */
+ BasicRow row = (BasicRow)it.next();
+ if(((String)cols[0]).equals("*")) {
+ selectedrow = new Object[row.getColumsLength()];
+ for (int j=0; j < cols.length; j++) {
+ selectedrow[j] = row.getValue(j);
+ }
+ } else {
+ selectedrow = new Object[cols.length];
+ for (int j=0; j < cols.length; j++) {
+ selectedrow[j] = row.getValue(j);
}
}
- } else if
(subRootNodes.item(i).getNodeName().equals("where")) {
- where = true;
- } //implement where clause
- }
- if (!where) {
- whereExpr = "(true)";
- }
-
- Iterator it = table.getRows().iterator();
- while (it.hasNext()) {
- System.out.println("Row test");
- RhinoHelper rh = new RhinoHelper();
- rh.addBean("row", it.next());
- rh.addBean("selectedRows", selectedRows);
- String jsString = "if " + whereExpr + " {
selectedRows.addElement(row); }";
- System.out.println("jsString " + jsString);
- rh.executeAction(jsString);
+ selectedRows.add(selectedrow);
+ }
}
- System.out.println("selectedRows size " + selectedRows.size());
-
mColumns = new BasicColumns();
mRowSet = new BasicRowSet(mColumns,selectedRows);
+ } else {
+
+ }
+ }
+
+ private boolean checkSelectStructure(Element rootElement) {
+ NodeList subRootNodes = mRootElement.getChildNodes();
+
+ /** Every select must have one from and a least one table */
+ for (int i=0 ; i < subRootNodes.getLength(); i++) {
+ if (subRootNodes.item(i).getNodeName().equals("from")) {
+ NodeList subFromNodes = subRootNodes.item(i).getChildNodes();
+ for(int j=0; j < subFromNodes.getLength(); j++) {
+ if (subFromNodes.item(j).getNodeName().equals("table") ||
+ subFromNodes.item(j).getNodeName().equals("view")
+ ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ private String[] parseSelect(Element rootElement) throws ActionException
{
+ NodeList subRootNodes = this.getSubRootNodes(rootElement);
+ String[] cols = null;
+
+ for (int i=0; i < subRootNodes.getLength(); i++) {
+ if(subRootNodes.item(i).getNodeName().equals("columns")) {
+ Element columnsElement = (Element)subRootNodes.item(i);
+
if(columnsElement.getFirstChild().getNodeValue().equals("*")) {
+ cols = new String[1];
+ cols[0] = "*";
+ } else if(subRootNodes.item(i).hasChildNodes()) {
+ NodeList subColumnsNodes =
subRootNodes.item(i).getChildNodes();
+ cols = new String[subColumnsNodes.getLength()];
+ for (int j=0; j < subColumnsNodes.getLength(); j++) {
+ Element columnElement =
(Element)subColumnsNodes.item(j);
+ cols[j] = columnElement.getAttribute("name");
+ }
+ } else {
+ throw new
ActionException(columnsElement.getFirstChild().getNodeValue()
+ + " is not valid SQL Syntax");
+ }
+ }
+ }
+ return cols;
+ }
+
+ private String[] parseFrom(Element rootElement) {
+ NodeList subRootNodes = this.getSubRootNodes(rootElement);
+ String[] tablenames = null;
+
+ for (int i=0; i < subRootNodes.getLength(); i++) {
+ if(subRootNodes.item(i).getNodeName().equals("from")) {
+ NodeList subFromNodes = subRootNodes.item(i).getChildNodes();
+ tablenames = new String[subFromNodes.getLength()];
+ for(int j=0; j < subFromNodes.getLength(); j++) {
+ Element fromElement = (Element)subFromNodes.item(j);
+ tablenames[j] = fromElement.getAttribute("name");
+ }
+ }
+ }
+ return tablenames;
+ }
+
+ private StringBuffer parseWhereRoot(Element rootElement) {
+ StringBuffer sb = new StringBuffer();
+ NodeList subRootNodes = this.getSubRootNodes(rootElement);
+ for (int i=0; i < subRootNodes.getLength(); i++) {
+ if(subRootNodes.item(i).getNodeName().equals("where")) {
+ System.out.println("parseWhereRoot(): found where");
+
this.parseWhereTerm((Element)subRootNodes.item(i).getFirstChild(),sb);
+ }
+ }
+ return sb;
+ }
+
+ private StringBuffer parseWhereTerm(Element element, StringBuffer sb) {
+ try {
+ System.out.println("Enter parseWhereTerm()");
+ if(element != null) {
+ sb.append("{\n");
+ if(element.getTagName().equals("and")) {
+ System.out.println("parseWhereTerm(): found and");
+ parseWhereAndTerm(element.getChildNodes(),sb);
+ } else if(element.getTagName().equals("or")) {
+ System.out.println("parseWhereTerm(): found or");
+ parseWhereOrTerm(element.getChildNodes(),sb);
+ } else if(element.getTagName().equals("condition")) {
+ System.out.println("parseWhereTerm(): found condition");
+ //parseWhereConditionTerm(element,sb);
+ }
+ sb.append("}\n");
+ }
+ System.out.println("sb=" + sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
+ return sb;
+ }
+
+ private void parseWhereAndTerm(NodeList nodes, StringBuffer sb) {
+ try {
+ System.out.println("parseWhereAndTerm() nodes=" + nodes);
+ System.out.println("nodes.getLength()=" + nodes.getLength());
+ for(int i=-1;i<nodes.getLength();i++) {
+ System.out.println("parseWhereAndTerm(): found and");
+ sb.append("&\n");
+ parseWhereTerm((Element)nodes.item(i),sb);
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void parseWhereOrTerm(NodeList nodes, StringBuffer sb) {
+ try {
+ System.out.println("parseWhereOrTerm() nodes=" + nodes);
+ for(int i=0;i<nodes.getLength();i++) {
+ System.out.println("parseWhereOrTerm(): found or");
+ sb.append("|\n");
+ parseWhereTerm((Element)nodes.item(i),sb);
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void parseWhereConditionTerm(Element element, StringBuffer sb) {
+ try {
+ /** H
+ System.out.println("parseWhereConditionTerm(): found condition");
+ Node nextSibling = (Node)element.getNextSibling();
+ parseWhereTerm((Element)nextSibling,sb);
+ sb.append(element.getAttribute("expr") + "\n");
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private NodeList getSubRootNodes(Element rootElement) {
+ return rootElement.getChildNodes();
}
public void execute(Object[] params) throws ActionException {
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>