001: /******************************************************************
002: * File: GoalState.java
003: * Created by: Dave Reynolds
004: * Created on: 04-May-2003
005: *
006: * (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
007: * [See end of file]
008: * $Id: GoalState.java,v 1.8 2008/01/02 12:09:45 andy_seaborne Exp $
009: *****************************************************************/package com.hp.hpl.jena.reasoner.rulesys.impl.oldCode;
010:
011: import com.hp.hpl.jena.reasoner.rulesys.impl.StateFlag;
012: import com.hp.hpl.jena.util.iterator.ClosableIterator;
013: import org.apache.commons.logging.Log;
014: import org.apache.commons.logging.LogFactory;
015:
016: /**
017: * Represents the state in a traversal of all the solutions of a
018: * given goal. This will traverse, in turn, all the matches in the
019: * underlying triple stores, all the memoized results currently in
020: * the GoalTable and then all the additional results which can be
021: * found by turns of the goal Generator crank, until the goal (or the
022: * whole derivation) is complete.
023: *
024: * @author <a href="mailto:der@hplb.hpl.hp.com">Dave Reynolds</a>
025: * @version $Revision: 1.8 $ on $Date: 2008/01/02 12:09:45 $
026: */
027: public class GoalState {
028:
029: /** An iterator over the matching triples in the stores */
030: protected ClosableIterator tripleMatches;
031:
032: /** The goal table entry for this goal */
033: protected GoalResults results;
034:
035: /** The index of the next memoized solution to return */
036: protected int solutionPointer = 0;
037:
038: static Log logger = LogFactory.getLog(GoalState.class);
039:
040: /**
041: * Constructor. Create a GoalState which can traverse all the
042: * matches to a goal over a set of raw data plus derivations.
043: * @param tripleMatches an interation over the raw data results
044: * @param results a GoalResults which gives access to memoized
045: * results for this goal together with the Generator that can
046: * produce additional results
047: */
048: public GoalState(ClosableIterator tripleMatches, GoalResults results) {
049: this .tripleMatches = tripleMatches;
050: this .results = results;
051: }
052:
053: /**
054: * Return the GoalResults entry which this state is built in
055: */
056: public GoalResults getGoalResultsEntry() {
057: return results;
058: }
059:
060: /**
061: * Return the next available result for this goal.
062: * @return a Triple matching the goal if there is another result available,
063: * or FAIL if there are known to be no more matches or SUSPEND if there
064: * may be more results in the future but current progress is blocked waiting
065: * for other subgoals.
066: */
067: public Object next() {
068: if (tripleMatches != null) {
069: if (tripleMatches.hasNext()) {
070: return tripleMatches.next();
071: } else {
072: tripleMatches = null;
073: }
074: }
075: if (solutionPointer < results.numResults()) {
076: return results.getResult(solutionPointer++);
077: } else if (results.isComplete()) {
078: return StateFlag.FAIL;
079: } else {
080: // No more results yet, the caller should block
081: return StateFlag.SUSPEND;
082: }
083: }
084:
085: /**
086: * Return true if there seems to be at least one new result available or if
087: * this can be stripped off the agenda because it has failed.
088: */
089: public boolean couldProcess() {
090: if (tripleMatches != null && tripleMatches.hasNext())
091: return true;
092: if (results.started && solutionPointer < results.numResults())
093: return true;
094: if (results.isComplete)
095: return true;
096: return false;
097: }
098:
099: /**
100: * Close the GoalState, closing any still active iterators.
101: */
102: public void close() {
103: if (tripleMatches != null) {
104: tripleMatches.close();
105: tripleMatches = null;
106: }
107: }
108:
109: /**
110: * Printable form
111: */
112: public String toString() {
113: return "GoalState(" + results.goal.toString() + ")";
114: }
115:
116: }
117:
118: /*
119: (c) Copyright 2003, 2004, 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
120: All rights reserved.
121:
122: Redistribution and use in source and binary forms, with or without
123: modification, are permitted provided that the following conditions
124: are met:
125:
126: 1. Redistributions of source code must retain the above copyright
127: notice, this list of conditions and the following disclaimer.
128:
129: 2. Redistributions in binary form must reproduce the above copyright
130: notice, this list of conditions and the following disclaimer in the
131: documentation and/or other materials provided with the distribution.
132:
133: 3. The name of the author may not be used to endorse or promote products
134: derived from this software without specific prior written permission.
135:
136: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
137: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
138: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
139: IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
140: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
141: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
142: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
143: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
144: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
145: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
146: */
|