froehlich 01/11/29 02:35:26
Modified: apps/db/src/java/org/apache/avalon/db/basic/actions
BasicUpdateRows.java BasicSelectSimple.java
BasicDeleteRows.java BasicCreateView.java
BasicCreateAggregateView.java
Added: apps/db/src/java/org/apache/avalon/db/basic/actions
BasicLXSQLCriteriaHelper.java
BasicCriteriaMatchingRowCallback.java
BasicCriteria.java
Removed: apps/db/src/java/org/apache/avalon/db/basic/actions
SimpleWhereClauseMatchingRowCallback.java
SimpleWhereClause.java
Log:
moved parsing logic from SimpleWhereClause and renamed it to
BasicCriteria. Parsing logic now in BasicLXSQLCriteriaHelper.
Revision Changes Path
1.5 +6 -6
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicUpdateRows.java
Index: BasicUpdateRows.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicUpdateRows.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- BasicUpdateRows.java 2001/11/23 08:21:53 1.4
+++ BasicUpdateRows.java 2001/11/29 10:35:26 1.5
@@ -22,12 +22,12 @@
*
*
* @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
*/
public class BasicUpdateRows extends AbstractAction
- implements UpdateRows, LogEnabled,
SimpleWhereClauseMatchingRowCallback {
+ implements UpdateRows, LogEnabled, BasicCriteriaMatchingRowCallback {
- private SimpleWhereClause mWhereClause;
+ private BasicCriteria mBasicCriteria;
private AbstractQueryable mQueryable;
private int mRecordCount;
@@ -39,9 +39,9 @@
* @param document
*
*/
- public BasicUpdateRows(AbstractQueryable queryable, SimpleWhereClause
whereClause) {
+ public BasicUpdateRows(AbstractQueryable queryable, BasicCriteria
basicCriteria) {
mQueryable = queryable;
- mWhereClause = whereClause;
+ mBasicCriteria = basicCriteria;
}
public void initialize() throws ActionException {
@@ -60,7 +60,7 @@
while(it.hasNext()) {
/** iterate rows and select only the needed cols */
BasicRow row = (BasicRow)it.next();
- if (mWhereClause.testActionRow(row)) {
+ if (mBasicCriteria.testActionRow(row)) {
rowMatches(row,true);
}
}
1.2 +5 -5
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicSelectSimple.java
Index: BasicSelectSimple.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicSelectSimple.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- BasicSelectSimple.java 2001/11/29 08:46:25 1.1
+++ BasicSelectSimple.java 2001/11/29 10:35:26 1.2
@@ -29,7 +29,7 @@
* @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
* @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
*
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public class BasicSelectSimple extends AbstractAction implements
Select,ParameterAdaptable,LogEnabled {
@@ -41,12 +41,12 @@
private AbstractQueryable mQueryable;
private Column[] mCols;
private String[] mTablenames;
- private SimpleWhereClause mSimpleWhereClause;
+ private BasicCriteria mBasicCriteria;
- public BasicSelectSimple(String[] tableNames, Column[] columns,
SimpleWhereClause whereClause) {
+ public BasicSelectSimple(String[] tableNames, Column[] columns,
BasicCriteria basicCriteria) {
mTablenames = tableNames;
mCols = columns;
- mSimpleWhereClause = whereClause;
+ mBasicCriteria = basicCriteria;
}
public void initialize() throws ActionException {
@@ -71,7 +71,7 @@
while(it.hasNext()) {
/** iterate rows and select only the needed cols */
BasicRow row = (BasicRow)it.next();
- if (mSimpleWhereClause.testActionRow(row)) {
+ if (mBasicCriteria.testActionRow(row)) {
getLogger().debug("specific select=" + mCols);
selectedRow = new Object[mCols.length];
for (int j=0; j < mCols.length; j++) {
1.6 +5 -5
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicDeleteRows.java
Index: BasicDeleteRows.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicDeleteRows.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- BasicDeleteRows.java 2001/11/23 13:32:32 1.5
+++ BasicDeleteRows.java 2001/11/29 10:35:26 1.6
@@ -26,12 +26,12 @@
*
*
* @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
- * @version $Revision: 1.5 $
+ * @version $Revision: 1.6 $
*/
public class BasicDeleteRows extends AbstractAction
implements DeleteRows, LogEnabled {
- private SimpleWhereClause mWhereClause;
+ private BasicCriteria mBasicCriteria;
private AbstractQueryable mQueryable;
private AbstractTable mTable;
private int mRecordCount;
@@ -44,9 +44,9 @@
* @param document
*
*/
- public BasicDeleteRows(AbstractQueryable queryable, SimpleWhereClause
whereClause) {
+ public BasicDeleteRows(AbstractQueryable queryable, BasicCriteria
basicCriteria) {
mQueryable = queryable;
- mWhereClause = whereClause;
+ mBasicCriteria = basicCriteria;
}
public void initialize() throws ActionException {
@@ -90,7 +90,7 @@
while(it.hasNext()) {
/** iterate rows and select only the needed cols */
BasicRow row = (BasicRow)it.next();
- if (mWhereClause.testActionRow(row)) {
+ if (mBasicCriteria.testActionRow(row)) {
pendingDeletes.add(row);
}
}
1.14 +5 -5
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCreateView.java
Index: BasicCreateView.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCreateView.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- BasicCreateView.java 2001/11/18 20:47:20 1.13
+++ BasicCreateView.java 2001/11/29 10:35:26 1.14
@@ -27,18 +27,18 @@
*
*
* @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
- * @version $Revision: 1.13 $
+ * @version $Revision: 1.14 $
*/
public class BasicCreateView extends BasicCreateQueryable implements
CreateView {
private String mViewName, mOnName;
- private SimpleWhereClause mSimpleWhereClause;
+ private BasicCriteria mBasicCriteria;
- public BasicCreateView(String viewName, String onName, Column[] columns
,SimpleWhereClause simpleWhereClause) {
+ public BasicCreateView(String viewName, String onName, Column[] columns
,BasicCriteria basicCriteria) {
super(columns);
mViewName = viewName;
mOnName = onName;
- mSimpleWhereClause = simpleWhereClause;
+ mBasicCriteria = basicCriteria;
}
public void initialize() throws ActionException {
@@ -55,7 +55,7 @@
Queryable queryable = mDatabasePersistor.getQueryable(mOnName);
- BasicView view = new BasicView(mViewName, mColumns, queryable
,mSimpleWhereClause);
+ BasicView view = new BasicView(mViewName, mColumns, queryable,
mBasicCriteria);
view.enableLogging(this.getLogger());
1.2 +5 -5
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCreateAggregateView.java
Index: BasicCreateAggregateView.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCreateAggregateView.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- BasicCreateAggregateView.java 2001/11/24 20:26:12 1.1
+++ BasicCreateAggregateView.java 2001/11/29 10:35:26 1.2
@@ -26,18 +26,18 @@
*
*
* @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public class BasicCreateAggregateView extends BasicCreateQueryable
implements CreateAggregateView {
private String mViewName, mOnName;
- private SimpleWhereClause mSimpleWhereClause;
+ private BasicCriteria mBasicCriteria;
- public BasicCreateAggregateView(String viewName, String onName, Column[]
columns ,SimpleWhereClause simpleWhereClause) {
+ public BasicCreateAggregateView(String viewName, String onName, Column[]
columns, BasicCriteria basicCriteria) {
super(columns);
mViewName = viewName;
mOnName = onName;
- mSimpleWhereClause = simpleWhereClause;
+ mBasicCriteria = basicCriteria;
}
public void initialize() throws ActionException {
@@ -54,7 +54,7 @@
Queryable queryable = mDatabasePersistor.getQueryable(mOnName);
- BasicView view = new BasicView(mViewName, mColumns, queryable
,mSimpleWhereClause);
+ BasicView view = new BasicView(mViewName, mColumns, queryable
,mBasicCriteria);
view.enableLogging(this.getLogger());
1.1
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicLXSQLCriteriaHelper.java
Index: BasicLXSQLCriteriaHelper.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*/
package org.apache.avalon.db.basic.actions;
import org.apache.avalon.db.actions.ActionException;
import org.apache.avalon.db.data.ValidationException;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.regexp.RE;
import org.apache.regexp.RESyntaxException;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.util.Hashtable;
import java.util.Enumeration;
/**
* Class BasicLXSQLCriteriaHelper
*
* @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
* @version $Revision: 1.3 $
*/
public class BasicLXSQLCriteriaHelper extends AbstractLogEnabled {
private String mWhereClause;
private StringBuffer mWhereBuffer;
private static Hashtable mOperators;
static {
mOperators = new Hashtable();
addOperator("=","testEqual");
addOperator(">","testGreaterThan");
addOperator("<","testSmallerThan");
addOperator("<>","testNotEqual");
addOperator("<=","testSmallerThanOrEqual");
addOperator(">=","testGreaterThanOrEqual");
addOperator("like","testLike");
}
private static void addOperator(String operator, String method) {
mOperators.put(operator,method);
}
public BasicLXSQLCriteriaHelper(Element rootElement) {
try {
parseLXSQL(rootElement);
} catch (ActionException ae) {
ae.printStackTrace();
}
mWhereClause = mWhereBuffer.toString();
}
public String getCriteria() {
return mWhereClause;
}
private 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;
//getLogger().debug("sb=[\n" + whereBuffer + "\n]");
}
private void parseWhereTerm(Element element, StringBuffer sb, int indent)
throws ValidationException {
if(element != null) {
//getLogger().debug("Element != null " + element);
if(element.getTagName().equals("and")) {
//getLogger().debug("parseWhereTerm(): found and");
parseWhereAndOrTerm(element.getChildNodes(),sb, indent, "&");
} else if(element.getTagName().equals("or")) {
//getLogger().debug("parseWhereTerm(): found or");
parseWhereAndOrTerm(element.getChildNodes(),sb, indent, "|");
} else if(element.getTagName().equals("condition")) {
//getLogger().debug("parseWhereTerm(): found condition");
parseWhereConditionTerm(element,sb,indent);
} else {
throw new ValidationException("Unknown where term " +
element.getTagName());
}
} else {
//getLogger().debug("Element == null " + element);
//getLogger().debug("parseWhereTerm after if");
throw new ValidationException("Null where element");
}
//getLogger().debug("parseWhereTerm at the end");
}
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++) {
//getLogger().debug("Looping and/or");
parseWhereTerm((Element)nodes.item(i),sb, indent +1);
if (i+1 < nodes.getLength()) {
sb.append( getIndent(indent) + andOr + "\n");
}
}
} catch(Exception e) {
e.printStackTrace();
}
sb.append(getIndent(indent) + ")\n");
}
private void parseWhereConditionTerm(Element element, StringBuffer sb,
int indent) {
try {
//getLogger().debug("parseWhereConditionTerm(): found condition");
sb.append(getIndent(indent) +
composeExpr(element.getAttribute("expr")) + "\n");
} catch(Exception e) {
e.printStackTrace();
}
}
private String getIndent(int indent) {
String rval = "";
for (int f = 0; f < indent; f++) {
rval = rval + " ";
}
return rval;
}
private String composeExpr(String expr) {
String[] strarr = null;
String[] result = null;
String method = null;
String operator = null;
//getLogger().debug("expr=" + expr);
try {
Enumeration enum = mOperators.keys();
//getLogger().debug("mOperators.size()=" + mOperators.size());
while(enum.hasMoreElements()) {
operator = (String)enum.nextElement();
//getLogger().debug("matching operator = " + operator);
//getLogger().debug("matching function = " +
mOperators.get(operator));
RE re = new RE(operator);
strarr = re.split(expr);
if(strarr.length > 1) {
method = (String)mOperators.get(operator);
//getLogger().debug("matched function = " + method);
result = strarr;
}
}
method = "testHelper." + method + "(columnCheck.getColumn(row,\""
+ result[0]
+ "\"),columnCheck.getColumn(row,\"" + result[1] +
"\"),row)";
//getLogger().debug("method=" + method);
} catch (RESyntaxException rse) {
//getLogger().error("composeExpr(): RESyntaxException",rse);
} catch (Exception e) {
//getLogger().error("composeExpr(): Exception",e);
}
return method;
}
private NodeList getSubRootNodes(Element rootElement) {
return rootElement.getChildNodes();
}
}
1.1
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCriteriaMatchingRowCallback.java
Index: BasicCriteriaMatchingRowCallback.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*/
package org.apache.avalon.db.basic.actions;
import org.apache.avalon.db.basic.data.BasicRow;
/**
* Class BasicCriteriaMatchingRowCallback
*
* @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
* @version $Revision: 1.2 $
*/
public interface BasicCriteriaMatchingRowCallback {
void rowMatches(BasicRow row, boolean matches);
}
1.1
jakarta-avalon-cornerstone/apps/db/src/java/org/apache/avalon/db/basic/actions/BasicCriteria.java
Index: BasicCriteria.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*/
package org.apache.avalon.db.basic.actions;
import org.apache.avalon.db.actions.ActionException;
import org.apache.avalon.db.basic.data.BasicRow;
import org.apache.avalon.db.utils.RhinoHelper;
import org.apache.avalon.db.utils.RhinoException;
import org.apache.avalon.db.data.Column;
import org.apache.avalon.db.data.DataException;
import org.apache.avalon.db.data.impl.DefaultStringConstantColumn;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import java.util.Iterator;
/**
* Class BasicCriteria
*
*
* @author Paul Hammant <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
* @author Gerhard Froehlich <a href="mailto:[EMAIL PROTECTED]">[EMAIL
PROTECTED]</a>
* @version $Revision: 1.7 $
*/
public class BasicCriteria extends AbstractLogEnabled {
private String mWhereClause;
private String[] mTablenames;
private String mMatchingInstructions = "callBack.rowMatches(row,
true);\n";
private String mUnMatchingInstructions = "callBack.rowMatches(row,
false);\n";
public BasicCriteria(String Criteria, String matchingInstructions,
String unMatchingInstructions) {
this(Criteria);
mMatchingInstructions = matchingInstructions;
mUnMatchingInstructions = unMatchingInstructions;
}
public BasicCriteria(String Criteria) {
try {
setupLogger(this);
mWhereClause = Criteria;
} catch (Exception e) {
////getLogger().error("SimpleWhereClause(..): Exception:",e);
}
}
public String getWhereClause() {
return mWhereClause;
}
public void testDataRows(Iterator rowIterator,
BasicCriteriaMatchingRowCallback callBack) throws DataException {
try {
testRows(rowIterator, callBack);
} catch (RhinoException re) {
throw new DataException(re.getMessage());
}
}
public void testActionRows(Iterator rowIterator,
BasicCriteriaMatchingRowCallback callBack) throws ActionException {
try {
testRows(rowIterator, callBack);
} catch (RhinoException re) {
throw new ActionException(re.getMessage());
}
}
private void testRows(Iterator rowIterator,
BasicCriteriaMatchingRowCallback callBack) throws RhinoException {
RhinoHelper rh = new RhinoHelper();
TestHelper testHelper = new TestHelper();
ColumnCheck columnCheck = new ColumnCheck();
rh.addBean("iterator",rowIterator);
rh.addBean("callBack",callBack);
rh.addBean("columnCheck",columnCheck);
rh.addBean("testHelper",testHelper);
//getLogger().debug("mWhereClause" + mWhereClause.toString());
String js =
"var more = iterator.hasNext();\n" +
"if (more) {\n" +
"do {\n" +
"var row = iterator.next();\n" +
"if ( " + mWhereClause + " ) {\n" +
mMatchingInstructions +
"} else {\n" +
mUnMatchingInstructions +
"}\n" +
"} while(iterator.hasNext())\n" +
"}\n";
System.out.println("js::" + js);
rh.executeScript(js);
}
public boolean testDataRow(BasicRow row) throws DataException {
try {
return testRow(row);
} catch (RhinoException re) {
throw new DataException(re.getMessage());
}
}
public boolean testActionRow(BasicRow row) throws ActionException {
try {
return testRow(row);
} catch (RhinoException re) {
throw new ActionException(re.getMessage());
}
}
private boolean testRow(BasicRow row) throws RhinoException {
if(!mWhereClause.toString().equals("")) {
RhinoHelper rh = new RhinoHelper();
MatchingHelper mh = new MatchingHelper();
ColumnCheck columnCheck = new ColumnCheck();
rh.addBean("row",row);
rh.addBean("callBack",mh);
rh.addBean("columnCheck",columnCheck);
TestHelper testHelper = new TestHelper();
rh.addBean("testHelper",testHelper);
//getLogger().debug("mWhereClause" + mWhereClause.toString());
rh.executeScript(
"if (" + mWhereClause.toString() + ") { " +
mMatchingInstructions +
"} else {" +
mUnMatchingInstructions +
"}");
return mh.mMatched;
} else {
return true;
}
}
public class MatchingHelper implements BasicCriteriaMatchingRowCallback {
public boolean mMatched = false;
public void rowMatches(BasicRow row, boolean matched) {
mMatched = matched;
}
}
public class ColumnCheck {
public Column getColumn(BasicRow row, String name) {
if(row.getValue(name) == null) {
return getConstantColumn("constantcolumn",name);
} else {
return (Column)row.getColumn(name,false);
}
}
private Column getConstantColumn(String name, String value) {
return new DefaultStringConstantColumn(name,value);
}
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>