package org.ggp.base.util.gdl.transforms;
import org.ggp.base.util.gdl.grammar.GdlSentence;
import org.ggp.base.util.gdl.model.ImmutableSentenceFormModel;
import org.ggp.base.util.gdl.model.SentenceForm;
import org.ggp.base.util.gdl.model.SentenceFormModel;
import com.google.common.base.Preconditions;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.SetMultimap;
public class ImmutableConstantChecker implements ConstantChecker {
private final ImmutableSentenceFormModel sentenceModel;
private final ImmutableSetMultimap<SentenceForm, GdlSentence> sentencesByForm;
private ImmutableConstantChecker(ImmutableSentenceFormModel sentenceModel,
ImmutableSetMultimap<SentenceForm, GdlSentence> sentencesByForm) {
Preconditions.checkArgument(sentenceModel.getConstantSentenceForms().containsAll(sentencesByForm.keySet()));
this.sentenceModel = sentenceModel;
this.sentencesByForm = sentencesByForm;
}
/**
* Returns an ImmutableConstantChecker with contents identical to the
* given ConstantChecker.
*
* May not actually make a copy if the input is immutable.
*/
public static ImmutableConstantChecker copyOf(ConstantChecker other) {
if (other instanceof ImmutableConstantChecker) {
return (ImmutableConstantChecker) other;
}
SentenceFormModel model = other.getSentenceFormModel();
SetMultimap<SentenceForm, GdlSentence> sentencesByForm = HashMultimap.create();
for (SentenceForm form : other.getConstantSentenceForms()) {
sentencesByForm.putAll(form, other.getTrueSentences(form));
}
return new ImmutableConstantChecker(ImmutableSentenceFormModel.copyOf(model),
ImmutableSetMultimap.copyOf(sentencesByForm));
}
public static ImmutableConstantChecker create(SentenceFormModel sentenceModel,
Multimap<SentenceForm, GdlSentence> sentencesByForm) {
return new ImmutableConstantChecker(ImmutableSentenceFormModel.copyOf(sentenceModel),
ImmutableSetMultimap.copyOf(sentencesByForm));
}
@Override
public boolean hasConstantForm(GdlSentence sentence) {
for (SentenceForm form : getConstantSentenceForms()) {
if (form.matches(sentence)) {
return true;
}
}
return false;
}
@Override
public boolean isConstantForm(SentenceForm form) {
return sentenceModel.getConstantSentenceForms().contains(form);
}
@Override
public ImmutableSet<GdlSentence> getTrueSentences(SentenceForm form) {
return sentencesByForm.get(form);
}
@Override
public ImmutableSet<SentenceForm> getConstantSentenceForms() {
return sentenceModel.getConstantSentenceForms();
}
@Override
public boolean isTrueConstant(GdlSentence sentence) {
//TODO: This could be even more efficient; we don't need to bucket by form
SentenceForm form = sentenceModel.getSentenceForm(sentence);
return sentencesByForm.get(form).contains(sentence);
}
@Override
public SentenceFormModel getSentenceFormModel() {
return sentenceModel;
}
}