summaryrefslogtreecommitdiff
path: root/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/access/EOQualifierSQLGeneration.java
diff options
context:
space:
mode:
Diffstat (limited to 'projects/net.wotonomy.persistence/src/main/java/net/wotonomy/access/EOQualifierSQLGeneration.java')
-rw-r--r--projects/net.wotonomy.persistence/src/main/java/net/wotonomy/access/EOQualifierSQLGeneration.java241
1 files changed, 241 insertions, 0 deletions
diff --git a/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/access/EOQualifierSQLGeneration.java b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/access/EOQualifierSQLGeneration.java
new file mode 100644
index 0000000..4627f76
--- /dev/null
+++ b/projects/net.wotonomy.persistence/src/main/java/net/wotonomy/access/EOQualifierSQLGeneration.java
@@ -0,0 +1,241 @@
+/*
+Wotonomy: OpenStep design patterns for pure Java applications.
+Copyright (C) 2000 Michael Powers
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, see http://www.gnu.org
+*/
+package net.wotonomy.access;
+
+import net.wotonomy.control.EOAndQualifier;
+import net.wotonomy.control.EOKeyComparisonQualifier;
+import net.wotonomy.control.EOKeyValueQualifier;
+import net.wotonomy.control.EONotQualifier;
+import net.wotonomy.control.EOOrQualifier;
+import net.wotonomy.control.EOQualifier;
+import net.wotonomy.foundation.NSArray;
+import net.wotonomy.foundation.NSMutableDictionary;
+
+/**
+* @author ezamudio@nasoft.com
+* @author $Author: cgruber $
+* @version $Revision: 894 $
+*/
+
+public interface EOQualifierSQLGeneration {
+
+ public EOQualifier qualifierMigratedFromEntityRelationshipPath(
+ EOEntity entity, String path);
+
+ public EOQualifier schemaBasedQualifierWithRootEntity(EOEntity entity);
+
+ public String sqlStringForSQLExpression(EOSQLExpression expression);
+
+ public abstract class Support {
+
+ private static NSMutableDictionary _classes = new NSMutableDictionary();
+
+ static {
+ setSupportForClass(new KeyValueQualifierSupport(), EOKeyValueQualifier.class);
+ setSupportForClass(new KeyComparisonQualifierSupport(), EOKeyComparisonQualifier.class);
+ setSupportForClass(new AndQualifierSupport(), EOAndQualifier.class);
+ setSupportForClass(new OrQualifierSupport(), EOOrQualifier.class);
+ setSupportForClass(new NotQualifierSupport(), EONotQualifier.class);
+ }
+
+ public Support() {
+ super();
+ }
+
+ public static void setSupportForClass(Support sup, Class aClass) {
+ _classes.setObjectForKey(sup, aClass.getName());
+ }
+ public static Support supportForClass(Class aClass) {
+ return (Support)_classes.objectForKey(aClass.getName());
+ }
+
+ public abstract String sqlStringForSQLExpression(EOQualifier q, EOSQLExpression exp);
+
+ public abstract EOQualifier schemaBasedQualifierWithRootEntity(EOQualifier q, EOEntity e);
+
+ public abstract EOQualifier qualifierMigratedFromEntityRelationshipPath(EOQualifier q, EOEntity e, String path);
+
+ }
+
+ public class KeyValueQualifierSupport extends Support {
+
+ public KeyValueQualifierSupport() {
+ super();
+ }
+
+ public String sqlStringForSQLExpression(EOQualifier qualifier, EOSQLExpression exp) {
+ EOKeyValueQualifier q = (EOKeyValueQualifier)qualifier;
+ String sql1 = exp.sqlStringForAttributeNamed(q.key());
+ String sql2 = exp.sqlStringForSelector(q.selector(), q.value());
+ String sql3 = exp.sqlStringForValue(q.value(), q.key());
+ if (q.selector() == EOQualifier.QualifierOperatorCaseInsensitiveLike)
+ return exp.sqlStringForCaseInsensitiveLike(sql1, sql3);
+ else if (q.selector() == EOQualifier.QualifierOperatorLike)
+ sql3 = exp.sqlPatternFromShellPattern(sql3);
+ return sql1 + sql2 + sql3;
+ }
+
+ public EOQualifier schemaBasedQualifierWithRootEntity(EOQualifier q, EOEntity e) {
+ return q;
+ }
+
+ public EOQualifier qualifierMigratedFromEntityRelationshipPath(EOQualifier q, EOEntity e, String path) {
+ return q;
+ }
+
+ }
+
+ public class KeyComparisonQualifierSupport extends Support {
+
+ public KeyComparisonQualifierSupport() {
+ super();
+ }
+
+ public String sqlStringForSQLExpression(EOQualifier qualifier, EOSQLExpression exp) {
+ EOKeyComparisonQualifier q = (EOKeyComparisonQualifier)qualifier;
+ return exp.sqlStringForAttributeNamed(q.leftKey()) +
+ exp.sqlStringForSelector(q.selector(), null) +
+ exp.sqlStringForAttributeNamed(q.rightKey());
+ }
+
+ public EOQualifier schemaBasedQualifierWithRootEntity(EOQualifier q, EOEntity e) {
+ return q;
+ }
+
+ public EOQualifier qualifierMigratedFromEntityRelationshipPath(EOQualifier q, EOEntity e, String path) {
+ return q;
+ }
+
+ }
+
+ public class NotQualifierSupport extends Support {
+
+ public NotQualifierSupport() {
+ super();
+ }
+
+ public String sqlStringForSQLExpression(EOQualifier qualifier, EOSQLExpression exp) {
+ EONotQualifier q = (EONotQualifier)qualifier;
+ return "NOT (" + EOQualifierSQLGeneration.Support.supportForClass(q.qualifier().getClass()).sqlStringForSQLExpression(q.qualifier(), exp) + ")";
+ }
+
+ public EOQualifier schemaBasedQualifierWithRootEntity(EOQualifier qualifier, EOEntity e) {
+ EONotQualifier q = (EONotQualifier)qualifier;
+ return new EONotQualifier(EOQualifierSQLGeneration.Support.supportForClass(q.qualifier().getClass()).schemaBasedQualifierWithRootEntity(q.qualifier(), e));
+ }
+
+ public EOQualifier qualifierMigratedFromEntityRelationshipPath(EOQualifier qualifier, EOEntity e, String path) {
+ EONotQualifier q = (EONotQualifier)qualifier;
+ return new EONotQualifier(EOQualifierSQLGeneration.Support.supportForClass(q.qualifier().getClass()).qualifierMigratedFromEntityRelationshipPath(q.qualifier(), e, path));
+ }
+
+ }
+
+ public class AndQualifierSupport extends Support {
+
+ public AndQualifierSupport() {
+ super();
+ }
+
+ public String sqlStringForSQLExpression(EOQualifier qualifier, EOSQLExpression exp) {
+ EOAndQualifier q = (EOAndQualifier)qualifier;
+ NSArray qus = q.qualifiers();
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < qus.count(); i++) {
+ EOQualifier sub = (EOQualifier)qus.objectAtIndex(i);
+ EOQualifierSQLGeneration.Support sup = EOQualifierSQLGeneration.Support.supportForClass(sub.getClass());
+ if (sup == null)
+ throw new IllegalStateException("Cannot find support class for " + sub.getClass().getName());
+ buf.append(sup.sqlStringForSQLExpression(sub, exp));
+ if (i < qus.count()-1)
+ buf.append(" AND ");
+ }
+ if (qus.count() > 1) {
+ buf.insert(0, '(');
+ buf.append(')');
+ }
+ return buf.toString();
+ }
+
+ public EOQualifier schemaBasedQualifierWithRootEntity(EOQualifier q, EOEntity e) {
+ return q;
+ }
+
+ public EOQualifier qualifierMigratedFromEntityRelationshipPath(EOQualifier q, EOEntity e, String path) {
+ return q;
+ }
+
+ }
+
+ public class OrQualifierSupport extends Support {
+
+ public OrQualifierSupport() {
+ super();
+ }
+
+ public String sqlStringForSQLExpression(EOQualifier qualifier, EOSQLExpression exp) {
+ EOOrQualifier q = (EOOrQualifier)qualifier;
+ NSArray qus = q.qualifiers();
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < qus.count(); i++) {
+ EOQualifier sub = (EOQualifier)qus.objectAtIndex(i);
+ EOQualifierSQLGeneration.Support sup = EOQualifierSQLGeneration.Support.supportForClass(sub.getClass());
+ if (sup == null)
+ throw new IllegalStateException("Cannot find support class for " + sub.getClass().getName());
+ buf.append(sup.sqlStringForSQLExpression(sub, exp));
+ if (i < qus.count()-1)
+ buf.append(" OR ");
+ }
+ if (qus.count() > 1) {
+ buf.insert(0, '(');
+ buf.append(')');
+ }
+ return buf.toString();
+ }
+
+ public EOQualifier schemaBasedQualifierWithRootEntity(EOQualifier q, EOEntity e) {
+ return q;
+ }
+
+ public EOQualifier qualifierMigratedFromEntityRelationshipPath(EOQualifier q, EOEntity e, String path) {
+ return q;
+ }
+
+ }
+
+}
+/*
+ * $Log$
+ * Revision 1.2 2006/02/16 16:47:14 cgruber
+ * Move some classes in to "internal" packages and re-work imports, etc.
+ *
+ * Also use UnsupportedOperationExceptions where appropriate, instead of WotonomyExceptions.
+ *
+ * Revision 1.1 2006/02/16 13:19:57 cgruber
+ * Check in all sources in eclipse-friendly maven-enabled packages.
+ *
+ * Revision 1.3 2003/08/14 02:13:10 chochos
+ * KeyValueQualifierSupport generates proper SQL
+ *
+ * Revision 1.2 2003/08/14 01:05:51 chochos
+ * added abstract Support inner class, with incomplete implementations for the main qualifiers (not, and, or, key-value, key-comparison)
+ *
+ * Revision 1.1 2003/08/12 01:45:49 chochos
+ * interface to be implemented by qualifiers (or support classes) to indicate they can generate SQL
+ *
+ */ \ No newline at end of file