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

org.javers.repository.api.PreviousSnapshotsCalculator Maven / Gradle / Ivy

There is a newer version: 7.6.1
Show newest version
package org.javers.repository.api;

import org.javers.core.metamodel.object.CdoSnapshot;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

import static org.javers.common.collections.Lists.toImmutableList;

class PreviousSnapshotsCalculator {

    private final Function, List> snapshotProvider;

    PreviousSnapshotsCalculator(Function, List> snapshotProvider) {
        this.snapshotProvider = snapshotProvider;
    }

    /**
     * Returns a Map from snapshot.id to snapshot with this id.
     * The Map contains entries for all previous snapshots.
     * I.e, for each snapshot S from a given list, there is a map entry for S.id.previous()
     */
    Map calculate(List snapshots) {
        Map previousSnapshots = new HashMap<>();
        populatePreviousSnapshotsWithSnapshots(previousSnapshots, snapshots);
        List missingPreviousSnapshots = getMissingPreviousSnapshots(snapshots, previousSnapshots);
        populatePreviousSnapshotsWithSnapshots(previousSnapshots, missingPreviousSnapshots);
        return previousSnapshots;
    }

    private List getSnapshots(Collection identifiers) {
        return snapshotProvider.apply(identifiers);
    }

    private void populatePreviousSnapshotsWithSnapshots(Map previousSnapshots, List snapshots) {
        for (CdoSnapshot snapshot : snapshots) {
            previousSnapshots.put(SnapshotIdentifier.from(snapshot), snapshot);
        }
    }

    private List getMissingPreviousSnapshots(List snapshots, Map previousSnapshots) {
        List missingPreviousSnapshotIdentifiers =
                determineMissingPreviousSnapshotIdentifiers(previousSnapshots, snapshots);
        return getSnapshots(missingPreviousSnapshotIdentifiers);
    }

    private List determineMissingPreviousSnapshotIdentifiers(Map previousSnapshots, List snapshots) {
        List missingPreviousSnapshotIdentifiers = snapshots.stream()
                .filter(snapshot -> !(snapshot.isInitial() || snapshot.isTerminal()))
                .map(snapshot -> SnapshotIdentifier.from(snapshot).previous())
                .filter(previousSnapshotIdentifier -> !previousSnapshots.containsKey(previousSnapshotIdentifier))
                .collect(toImmutableList());
        return missingPreviousSnapshotIdentifiers;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy