All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 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); }
    }

}