hammant 01/11/13 04:12:45 Modified: apps/db/src/java/org/apache/avalon/db/basic/actions BasicSelect.java apps/db/src/java/org/apache/avalon/db/test Tester.java Log: where logic has correct ('s now. Revision Changes Path 1.13 +45 -48 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.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- BasicSelect.java 2001/11/12 21:01:18 1.12 +++ BasicSelect.java 2001/11/13 12:12:44 1.13 @@ -20,6 +20,7 @@ import org.apache.avalon.db.basic.parser.BasicLXSQLParser; import org.apache.avalon.db.utils.RhinoHelper; import org.apache.avalon.db.transport.SelectRequest; +import org.apache.avalon.db.data.ValidationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -43,6 +44,7 @@ private boolean mPrepared; private boolean mWithParams; private int mParamCount; + StringBuffer mWhereBuffer = new StringBuffer(); /** * The Constructor @@ -69,7 +71,7 @@ if(true) { cols = parseSelect(mRootElement); tablenames = parseFrom(mRootElement); - parseWhereRoot(mRootElement); + parseLXSQL(mRootElement); System.out.println("cols.length=" + cols.length); System.out.println("tablenames.length=" + tablenames.length); } else { @@ -130,6 +132,37 @@ return false; } + protected void parseLXSQL(Element rootElement) throws ActionException { + NodeList subRootNodes = this.getSubRootNodes(rootElement); + boolean whereDone = false; + StringBuffer whereBuffer = new StringBuffer(); + int indent = 0; + + try { + for (int i=0; i < subRootNodes.getLength(); i++) { + if(subRootNodes.item(i).getNodeName().equals("where")) { + if (whereDone) { + throw new ActionException("<where> term must only be specified once"); + } + Element whereElement = (Element)subRootNodes.item(i); + NodeList elements = whereElement.getChildNodes(); + for (int j=0; j < elements.getLength(); j++) { + Element element = (Element)elements.item(j); + parseWhereTerm(element, whereBuffer, indent+1); + } + whereDone = true; + } + } + } catch (ValidationException ve) { + throw new ActionException("Validation Exception: " + ve.getMessage()); + } + mWhereBuffer = whereBuffer; + System.out.println("sb=[\n" + whereBuffer + "\n]"); + + + } + + private String[] parseSelect(Element rootElement) throws ActionException { NodeList subRootNodes = this.getSubRootNodes(rootElement); String[] cols = null; @@ -172,82 +205,46 @@ } return tablenames; } - - private StringBuffer parseWhereRoot(Element rootElement) { - int indent = 0; - System.out.println("Enter parseWhereRoot()"); - StringBuffer sb = new StringBuffer(); - Element whereElement = null; - - 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"); - whereElement = (Element)subRootNodes.item(i); - } - } - this.parseWhereTerm((Element)whereElement.getFirstChild(),sb, indent+1); - System.out.println("parseWhereRoot(): END"); - System.out.println("sb=[\n" + sb + "\n]"); - return sb; - } - private void parseWhereTerm(Element element, StringBuffer sb, int indent) { - System.out.println("Enter parseWhereTerm()"); - sb.append(getIndent(indent) + "(\n"); + private void parseWhereTerm(Element element, StringBuffer sb, int indent) throws ValidationException { if(element != null) { System.out.println("Element != null " + element); if(element.getTagName().equals("and")) { System.out.println("parseWhereTerm(): found and"); - parseWhereAndTerm(element.getChildNodes(),sb, indent +1); + parseWhereAndOrTerm(element.getChildNodes(),sb, indent, "&"); } else if(element.getTagName().equals("or")) { System.out.println("parseWhereTerm(): found or"); - parseWhereOrTerm(element.getChildNodes(),sb, indent +1); + parseWhereAndOrTerm(element.getChildNodes(),sb, indent, "|"); } else if(element.getTagName().equals("condition")) { System.out.println("parseWhereTerm(): found condition"); - parseWhereConditionTerm(element,sb,indent+1); + parseWhereConditionTerm(element,sb,indent); } else { - return; + throw new ValidationException("Unknown where term " + element.getTagName()); } } else { System.out.println("Element == null " + element); System.out.println("parseWhereTerm after if"); - return; + throw new ValidationException("Null where element"); } - //System.exit(0); - //System.out.println("sb=" + sb.toString()); System.out.println("parseWhereTerm at the end"); - sb.append(getIndent(indent) + ")\n"); - return; } - private void parseWhereAndTerm(NodeList nodes, StringBuffer sb, int indent) { + private void parseWhereAndOrTerm(NodeList nodes, StringBuffer sb, int indent, String andOr) { + sb.append(getIndent(indent) + "(\n"); try { for(int i=0; i<nodes.getLength(); i++) { - System.out.println("Looping and"); + System.out.println("Looping and/or"); parseWhereTerm((Element)nodes.item(i),sb, indent +1); if (i+1 < nodes.getLength()) { - sb.append( getIndent(indent) + "&\n"); + sb.append( getIndent(indent) + andOr + "\n"); } } } catch(Exception e) { e.printStackTrace(); } + sb.append(getIndent(indent) + ")\n"); } - private void parseWhereOrTerm(NodeList nodes, StringBuffer sb, int indent) { - try { - for(int i=0; i<nodes.getLength(); i++) { - System.out.println("Looping or"); - parseWhereTerm((Element)nodes.item(i),sb, indent +1); - if (i+1 < nodes.getLength()) { - sb.append(getIndent(indent) + "|\n"); - } - } - } catch(Exception e) { - e.printStackTrace(); - } - } private void parseWhereConditionTerm(Element element, StringBuffer sb, int indent) { try { 1.14 +2 -1 jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/test/Tester.java Index: Tester.java =================================================================== RCS file: /home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/test/Tester.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- Tester.java 2001/11/13 09:25:43 1.13 +++ Tester.java 2001/11/13 12:12:45 1.14 @@ -69,7 +69,8 @@ "<from><table name=\"Flintstones\"/></from>" + "<where>" + "<and>" + - "<condition expr=\"row.getColumn('forename').equals('Fred')\"/>" + //TODO this is too Java + "<condition expr=\"row.getColumn('forename').startsWith('F')\"/>" + //TODO this is too Java + "<condition expr=\"row.getColumn('forename').length() > 3\"/>" + //TODO this is too Java "</and>" + "</where>" + "</simple-select>";
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>