001: package org.mandarax.jdbc.server;
002:
003: /*
004: * Copyright (C) 1999-2004 <a href="mailto:mandarax@jbdietrich.com">Jens Dietrich</a>
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2 of the License, or (at your option) any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020:
021: import java.util.*;
022:
023: import org.mandarax.kernel.*;
024: import org.mandarax.util.ResultSetWrapper;
025:
026: /**
027: * Extended mandarax result set with added "static" replacements.
028: * This replacements represent bindings done before the query is issued, i.e.
029: * slot=value conditions in the (SQL) query. In the result set, "global"
030: * subtitutions slot/value are added.
031: * @author <A HREF="mailto:mandarax@jbdietrich.com">Jens Dietrich</A>
032: * @version 3.3.2 <29 December 2004>
033: * @since 3.0
034: */
035:
036: class ResultSetExtension extends ResultSetWrapper {
037: private Map staticReplacements = null;
038: private static LogicFactory lfactory = LogicFactory
039: .getDefaultFactory();
040: private List queryVariables = null;
041: private Query query = null;
042:
043: /**
044: * Constructor.
045: * @param result set a result set
046: * @param query a query - static replacements will be extracted from the query
047: */
048: ResultSetExtension(ResultSet delegate, Query query)
049: throws InferenceException {
050: super (delegate);
051: this .query = query;
052: // analyse query and collect replacements
053: Fact[] facts = query.getFacts();
054: for (int i = 0; i < facts.length; i++) {
055: Predicate p = (Predicate) facts[i].getKey();
056: Term[] terms = facts[i].getTerms();
057: for (int j = 0; j < terms.length; j++) {
058: if (terms[j] instanceof ConstantTerm) {
059: if (staticReplacements == null)
060: staticReplacements = new Hashtable();
061: ConstantTerm ct = (ConstantTerm) terms[j];
062: VariableTerm vt = lfactory.createVariableTerm(
063: JDBC2KBUtils.getSlotName(p, j), ct
064: .getType());
065: staticReplacements.put(vt, ct);
066: }
067: }
068: }
069: }
070:
071: /**
072: * Get the replacements as map (term -> term associations).
073: * @return a map
074: */
075: public Map getResults() throws InferenceException {
076: if (staticReplacements == null
077: || staticReplacements.size() == 0)
078: return delegate.getResults();
079: else {
080: Map mergedResults = new HashMap();
081: mergedResults.putAll(delegate.getResults());
082: mergedResults.putAll(staticReplacements);
083: return mergedResults;
084: }
085: }
086:
087: /**
088: * Get the object that replaces the variable with the given name and type.
089: * If there is no such object, return null.
090: * Throw an exception if the cursor is not positioned at a result.
091: * @return the object that replaced the variable
092: * @param type the type of the variable
093: * @param name the name of the variable
094: * @exception an inference exception
095: */
096: public Object getResult(Class type, String name)
097: throws InferenceException {
098: VariableTerm var = lfactory.createVariableTerm(name, type);
099: return getResult(var);
100:
101: }
102:
103: /**
104: * Get the object that replaces the variable.
105: * If there is no such object, return null.
106: * Throw an exception if the cursor is not positioned at a result.
107: * @return the object that replaced the variable
108: * @param term the variable term that is (perhaps) replaced
109: * @exception an inference exception
110: */
111: public Object getResult(VariableTerm term)
112: throws InferenceException {
113: Object obj = delegate.getResult(term);
114: if (obj == null && staticReplacements != null) {
115: Term replacement = (Term) staticReplacements.get(term);
116: if (replacement instanceof ConstantTerm) {
117: return ((ConstantTerm) replacement).getObject();
118: } else
119: return replacement;
120: }
121: return obj;
122: }
123:
124: /**
125: * Get a list of all variable terms in the query.
126: * @return a list of variable terms
127: */
128: public List getQueryVariables() throws InferenceException {
129: if (staticReplacements == null)
130: return delegate.getQueryVariables();
131: if (queryVariables == null) {
132: queryVariables = JDBC2KBUtils.getVariables(query);
133: }
134: return queryVariables;
135: }
136:
137: }
|