
it.unibz.inf.ontop.substitution.impl.InjectiveSubstitutionImpl Maven / Gradle / Ivy
package it.unibz.inf.ontop.substitution.impl;
import com.google.common.collect.*;
import it.unibz.inf.ontop.model.term.TermFactory;
import it.unibz.inf.ontop.substitution.InjectiveSubstitution;
import it.unibz.inf.ontop.model.term.Variable;
import it.unibz.inf.ontop.model.term.ImmutableTerm;
import it.unibz.inf.ontop.utils.ImmutableCollectors;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Stream;
public class InjectiveSubstitutionImpl extends SubstitutionImpl implements InjectiveSubstitution {
InjectiveSubstitutionImpl(ImmutableMap map, TermFactory termFactory, boolean checkEntries) {
super(map, termFactory, checkEntries);
if (checkEntries && !isInjective(this.map))
throw new IllegalArgumentException("Non-injective map given: " + map);
}
@Override
public String toString() {
return "injective " + super.toString();
}
@Override
protected InjectiveSubstitution createSubstitution(Stream> stream, Function, S> mapper, boolean checkEntries) {
return new InjectiveSubstitutionImpl<>(stream.collect(ImmutableCollectors.toMap(Map.Entry::getKey, mapper)), termFactory, checkEntries);
}
@Override
public InjectiveSubstitution restrictDomainTo(Set set) {
return createSubstitution(stream().filter(e -> set.contains(e.getKey())), Map.Entry::getValue, false);
}
@Override
public InjectiveSubstitution removeFromDomain(Set set) {
return createSubstitution(stream().filter(e -> !set.contains(e.getKey())), Map.Entry::getValue, false);
}
@Override
public InjectiveSubstitution restrictRangeTo(Class extends S> type) {
return createSubstitution(stream().filter(e -> type.isInstance(e.getValue())), e -> type.cast(e.getValue()), false);
}
@Override
public InjectiveSubstitution transform(Function function) {
return createSubstitution(stream(), e -> function.apply(e.getValue()), true);
}
static boolean isInjective(ImmutableMap map) {
ImmutableCollection values = map.values();
return values.size() == ImmutableSet.copyOf(values).size();
}
@Override
public InjectiveSubstitution.Builder> builder() {
return new BuilderImpl<>(map.entrySet().stream(), false);
}
protected class BuilderImpl>
extends SubstitutionImpl.AbstractBuilderImpl>
implements InjectiveSubstitution.Builder> {
BuilderImpl(Stream> stream, boolean checkEntries) {
super(stream, checkEntries);
}
@Override
protected BuilderImpl createBuilder(Stream> stream, boolean checkEntries) {
return new BuilderImpl<>(stream, checkEntries);
}
@Override
public InjectiveSubstitution build() { return createSubstitution(stream, Map.Entry::getValue, checkEntries); }
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy