001: /*
002: * Copyright (C) 1999-2004 <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</a>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018: package org.mandarax.util;
019:
020: import java.util.Iterator;
021:
022: import org.mandarax.kernel.Clause;
023: import org.mandarax.kernel.ClauseSet;
024: import org.mandarax.kernel.ClauseSetException;
025:
026: /**
027: * Iterator for a collection containing clause sets and clauses.
028: * New version - no explicit merged collection is needed. This hould result
029: * in performance improvements for bot the knowledge base and the inference engine.
030: * @author <A href="http://www-ist.massey.ac.nz/JBDietrich" target="_top">Jens Dietrich</A>
031: * @version 3.4 <7 March 05>
032: * @since 1.0
033: */
034: public final class MultipleClauseSetIterator extends
035: AbstractClauseIterator {
036:
037: private Clause nextClause = null;
038: private boolean useParameters = false;
039: private ClauseIterator nextClauseIterator = null;
040: private Iterator iterator = null;
041: private Clause par1 = null;
042: private Object par2 = null;
043:
044: /**
045: * Constructor.
046: * @param coll a collection of clause sets
047: */
048: public MultipleClauseSetIterator(java.util.Collection coll) {
049: super ();
050:
051: iterator = coll.iterator();
052: useParameters = false;
053: }
054:
055: /**
056: * Constructor.
057: * @param coll a collection of clause sets
058: * @param query org.mandarax.kernel.Clause
059: * @param additionalParameter java.lang.Object
060: */
061: public MultipleClauseSetIterator(java.util.Collection coll,
062: Clause query, Object additionalParameter) {
063: super ();
064:
065: iterator = coll.iterator();
066: useParameters = true;
067: par1 = query;
068: par2 = additionalParameter;
069: }
070:
071: /**
072: * Indicates whether there are more clauses.
073: * For performance, clauses get special treatment
074: * @return true if there are more clauses, false otherwise
075: * @throws ClauseSetException
076: */
077: public boolean hasMoreClauses() throws ClauseSetException {
078:
079: // initialize - first step (or after there was a clause)
080: if (nextClauseIterator == null) {
081:
082: // set the first clause set clause set
083: if (iterator.hasNext()) {
084: ClauseSet cs = (ClauseSet) iterator.next();
085:
086: if ((cs instanceof Clause) && ((Clause) cs).isAtomic()) {
087: nextClause = (Clause) cs;
088: nextClauseIterator = null;
089:
090: return true;
091: }
092:
093: nextClauseIterator = useParameters ? cs.clauses(par1,
094: par2) : cs.clauses();
095:
096: return hasMoreClauses();
097: } else {
098: return false;
099: }
100: }
101:
102: // regular step
103: if (nextClauseIterator.hasMoreClauses()) {
104: nextClause = nextClauseIterator.nextClause();
105:
106: return true;
107: } else {
108: if (iterator.hasNext()) {
109: ClauseSet cs = (ClauseSet) iterator.next();
110: // bugfix 26 Oct 04 by Jens Dietrich : test for atomic clauses here as well
111: // this addresses bug reported by gabriel.quennesson@seam.fr 20 Oct 04
112: if ((cs instanceof Clause) && ((Clause) cs).isAtomic()) {
113: nextClause = (Clause) cs;
114: nextClauseIterator = null;
115:
116: return true;
117: }
118:
119: nextClauseIterator = useParameters ? cs.clauses(par1,
120: par2) : cs.clauses();
121:
122: return hasMoreClauses();
123: } else {
124: return false;
125: }
126: }
127: }
128:
129: /**
130: * Get the next clause.
131: * @return the next clause
132: */
133: public org.mandarax.kernel.Clause nextClause() {
134: return nextClause;
135: }
136: }
|