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

net.ozwolf.mongo.migrations.internal.service.MigrationsService Maven / Gradle / Ivy

package net.ozwolf.mongo.migrations.internal.service;

import net.ozwolf.mongo.migrations.MongoTrekState;
import net.ozwolf.mongo.migrations.exception.DuplicateVersionException;
import net.ozwolf.mongo.migrations.internal.dao.SchemaVersionDAO;
import net.ozwolf.mongo.migrations.internal.domain.Migration;
import net.ozwolf.mongo.migrations.internal.domain.MigrationCommands;

import java.util.List;
import java.util.Optional;
import java.util.function.Function;

import static java.util.stream.Collectors.toList;

public class MigrationsService {
    private final SchemaVersionDAO schemaVersionDAO;

    public MigrationsService(SchemaVersionDAO schemaVersionDAO) {
        this.schemaVersionDAO = schemaVersionDAO;
    }

    public MongoTrekState getState(MigrationCommands commands) {
        return new MongoTrekState(getFullState(commands));
    }

    private List getFullState(MigrationCommands commands) throws DuplicateVersionException {
        List alreadyRun = schemaVersionDAO.findAll();

        List commandMigrations = commands.getMigrations()
                .stream()
                .map(Migration::new)
                .collect(toList());

        checkForDuplicateVersions(commandMigrations);

        return commandMigrations
                .stream()
                .map(joinWith(alreadyRun))
                .collect(toList());

    }

    private void checkForDuplicateVersions(List migrations) throws DuplicateVersionException {
        List duplicateVersions = migrations.stream()
                .filter(m -> migrations.stream().filter(cm -> cm.getVersion().equals(m.getVersion())).count() > 1)
                .collect(toList());

        if (!duplicateVersions.isEmpty())
            throw new DuplicateVersionException(duplicateVersions.get(0));
    }

    private static Function joinWith(final List alreadyRun) {
        return migration -> {
            Optional found = alreadyRun.stream().filter(o -> o.getVersion().equals(migration.getVersion())).findFirst();
            return found
                    .orElse(migration)
                    .assign(migration.getCommand());
        };
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy