/* 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 * */