diff options
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.java | 241 |
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 |
