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.sql.*;
022:
023: import org.mandarax.jdbc.*;
024: import org.mandarax.jdbc.server.parser.SQL;
025: import org.mandarax.jdbc.server.sql.SelectStatement;
026: import org.mandarax.kernel.InferenceEngine;
027: import org.mandarax.kernel.InferenceException;
028: import org.mandarax.kernel.KnowledgeBase;
029: import org.mandarax.kernel.Predicate;
030: import org.mandarax.kernel.Query;
031: import org.mandarax.reference.DefaultInferenceEngine;
032:
033: /**
034: * Statement implementation.
035: * @author <A HREF="mailto:mandarax@jbdietrich.com">Jens Dietrich</A>
036: * @version 3.3.2 <29 December 2004>
037: * @since 3.0
038: */
039: class StatementImpl extends AbstractStatementImpl {
040: protected KnowledgeBase kb = null;
041: protected SelectStatement select = null;
042: protected InferenceEngine ie = new DefaultInferenceEngine();
043:
044: /**
045: * Constructor.
046: * @param kb a knowledge base
047: * @param connection the connection used
048: */
049: StatementImpl(Connection connection, KnowledgeBase kb) {
050: super (connection);
051: this .kb = kb;
052: }
053:
054: /**
055: * Parse an SQL statement.
056: * @return a select statement
057: * @param sql an sql statement
058: */
059: protected SelectStatement parse(String sql) throws ParseException {
060: SQL parser = new SQL(new java.io.StringReader(sql));
061: SelectStatement select = new SelectStatement();
062: try {
063: parser.Select(select);
064: return select;
065: } catch (org.mandarax.jdbc.server.parser.ParseException x) {
066: throw new ParseException("Syntax error in sql: " + sql, x);
067: }
068: }
069:
070: /**
071: * Execute a query (select statement).
072: * @param select the parsed select statement
073: * @param sql the SQL (as string)
074: * @return a result set
075: */
076: protected ResultSet executeQuery(SelectStatement select, String sql)
077: throws SQLException {
078: try {
079: // jdbc -> mandarax
080: Query query = select.asMandaraxQuery();
081: query.setName(sql);
082: int cardinalityConstraint = maxRows == 0 ? InferenceEngine.ALL
083: : maxRows;
084: org.mandarax.kernel.ResultSet rs = ie.query(query, kb,
085: cardinalityConstraint,
086: InferenceEngine.BUBBLE_EXCEPTIONS);
087: rs = new ResultSetExtension(rs, query);
088: // TODO include in apply filters
089: if (select.isDistinct())
090: rs = new org.mandarax.util.ResultSetFilter(rs);
091: rs = select.applyFilters(rs);
092: Predicate predicate = select.getResultSetPredicate();
093: // mandarax -> jdbc
094: return new ResultSetImpl(rs, this , predicate);
095: } catch (InferenceException x) {
096: throw new JDBCException("Error executing query " + sql, x);
097: }
098: }
099:
100: /**
101: * Executes the given SQL statement, which returns a single ResultSet object.
102: * @param sql a query
103: * @return a result set
104: */
105: public ResultSet executeQuery(String sql) throws SQLException {
106: SelectStatement select = parse(sql);
107: select.setKB(kb);
108: return executeQuery(select, sql);
109: }
110:
111: /**
112: * Set the object on a certain index.
113: * @param parameterIndex the index
114: * @param x the object
115: */
116: public void setObject(int parameterIndex, Object x)
117: throws SQLException {
118: throw new UnsupportedFeatureException(
119: "setObject is not supported by simple statements");
120: }
121:
122: }
|