use of com.vaticle.typedb.core.reasoner.resolution.framework.AnswerCache.ConcludableAnswerCache in project grakn by graknlabs.
the class ConcludableResolver method createRequestState.
protected CachingRequestState<?, ConceptMap> createRequestState(Request fromUpstream, int iteration) {
LOG.debug("{}: Creating new Responses for iteration{}, request: {}", name(), iteration, fromUpstream);
Driver<? extends Resolver<?>> root = fromUpstream.partialAnswer().root();
cacheRegistersByRoot.putIfAbsent(root, new HashMap<>());
Map<ConceptMap, AnswerCache<?, ConceptMap>> cacheRegister = cacheRegistersByRoot.get(root);
ConceptMap answerFromUpstream = fromUpstream.partialAnswer().conceptMap();
CachingRequestState<?, ConceptMap> requestState;
assert fromUpstream.partialAnswer().isConcludable();
if (fromUpstream.partialAnswer().asConcludable().isExplain()) {
if (cacheRegister.containsKey(answerFromUpstream)) {
if (cacheRegister.get(answerFromUpstream).isConceptMapCache()) {
// We have a cache already which we must evict to use a cache suitable for explaining
ConcludableAnswerCache answerCache = new ConcludableAnswerCache(cacheRegister, answerFromUpstream);
cacheRegister.put(answerFromUpstream, answerCache);
requestState = new Explain(fromUpstream, answerCache, iteration);
registerRules(fromUpstream, requestState.asExploration());
} else if (cacheRegister.get(answerFromUpstream).isConcludableAnswerCache()) {
ConcludableAnswerCache answerCache = cacheRegister.get(answerFromUpstream).asConcludableAnswerCache();
requestState = new FollowingExplain(fromUpstream, answerCache, iteration);
} else {
throw TypeDBException.of(ILLEGAL_STATE);
}
} else {
ConcludableAnswerCache answerCache = new ConcludableAnswerCache(cacheRegister, answerFromUpstream);
cacheRegister.put(answerFromUpstream, answerCache);
requestState = new Explain(fromUpstream, answerCache, iteration);
registerRules(fromUpstream, requestState.asExploration());
}
} else if (fromUpstream.partialAnswer().asConcludable().isMatch()) {
if (cacheRegister.containsKey(answerFromUpstream)) {
if (cacheRegister.get(answerFromUpstream).isConceptMapCache()) {
ConceptMapCache answerCache = cacheRegister.get(answerFromUpstream).asConceptMapCache();
requestState = new FollowingMatch(fromUpstream, answerCache, iteration);
} else if (cacheRegister.get(answerFromUpstream).isConcludableAnswerCache()) {
ConcludableAnswerCache answerCache = cacheRegister.get(answerFromUpstream).asConcludableAnswerCache();
requestState = new FollowingExplain(fromUpstream, answerCache, iteration);
} else {
throw TypeDBException.of(ILLEGAL_STATE);
}
} else {
ConceptMapCache answerCache = new ConceptMapCache(cacheRegister, answerFromUpstream);
cacheRegister.put(answerFromUpstream, answerCache);
if (!answerCache.completeIfSubsumerComplete()) {
answerCache.addSource(traversalIterator(concludable.pattern(), answerFromUpstream));
}
boolean singleAnswerRequired = answerFromUpstream.concepts().keySet().containsAll(unboundVars);
requestState = new Match(fromUpstream, answerCache, iteration, singleAnswerRequired);
registerRules(fromUpstream, requestState.asExploration());
}
} else {
throw TypeDBException.of(ILLEGAL_STATE);
}
return requestState;
}
Aggregations