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

win.doyto.query.service.AssociativeServiceTemplate Maven / Gradle / Ivy

package win.doyto.query.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.SingleColumnRowMapper;
import org.springframework.transaction.annotation.Transactional;
import win.doyto.query.core.SqlAndArgs;
import win.doyto.query.entity.UserIdProvider;

import java.util.Collection;
import java.util.List;

import static java.util.Collections.singleton;


/**
 * AssociativeServiceTemplate
 *
 * @author f0rb on 2019-05-30
 */
public class AssociativeServiceTemplate implements AssociativeService {

    private final AssociativeSqlBuilder sqlBuilder;
    private final SingleColumnRowMapper leftRowMapper = new SingleColumnRowMapper<>();
    private final SingleColumnRowMapper rightRowMapper = new SingleColumnRowMapper<>();

    @Autowired
    private JdbcOperations jdbcOperations;

    @Autowired(required = false)
    private UserIdProvider userIdProvider;

    public AssociativeServiceTemplate(String table, String left, String right) {
        this(table, left, right, null);
    }

    public AssociativeServiceTemplate(String table, String left, String right, String createUserColumn) {
        this.sqlBuilder = new AssociativeSqlBuilder(table, left, right, createUserColumn);
    }

    public boolean exists(Collection leftIds, Collection rightIds) {
        return count(leftIds, rightIds) > 0;
    }

    @Override
    public long count(Collection leftIds, Collection rightIds) {
        return count(leftIds.toArray(), rightIds.toArray());
    }

    private Long count(Object[] leftIds, Object[] rightIds) {
        if (leftIds.length == 0 || rightIds.length == 0) {
            return 0L;
        }
        SqlAndArgs sqlAndArgs = sqlBuilder.buildCount(leftIds, rightIds);
        return jdbcOperations.queryForObject(sqlAndArgs.getSql(), sqlAndArgs.getArgs(), Long.class);
    }

    @Override
    public List getByLeftId(L leftId) {
        return jdbcOperations.query(sqlBuilder.getByLeftId, rightRowMapper, leftId);
    }

    @Override
    public void deleteByLeftId(L leftId) {
        jdbcOperations.update(sqlBuilder.deleteByLeftId, leftId);
    }

    @Override
    public List getByRightId(R rightId) {
        return jdbcOperations.query(sqlBuilder.getByRightId, leftRowMapper, rightId);
    }

    @Override
    public void deleteByRightId(R rightId) {
        jdbcOperations.update(sqlBuilder.deleteByRightId, rightId);
    }

    private void deallocate(Object[] leftIds, Object[] rightIds) {
        SqlAndArgs sqlAndArgs = sqlBuilder.buildDeallocate(leftIds, rightIds);
        jdbcOperations.update(sqlAndArgs.getSql(), sqlAndArgs.getArgs());
    }

    @Override
    public void deallocate(Collection leftIds, Collection rightIds) {
        deallocate(leftIds.toArray(), rightIds.toArray());
    }

    @Override
    @Transactional
    public int reallocateForLeft(L leftId, Collection rightIds) {
        deleteByLeftId(leftId);
        if (rightIds.isEmpty()) {
            return 0;
        }
        return allocate(leftId, rightIds);
    }

    @Override
    @Transactional
    public int reallocateForRight(R rightId, Collection leftIds) {
        deleteByRightId(rightId);
        if (leftIds.isEmpty()) {
            return 0;
        }
        return allocate(leftIds, rightId);
    }

    public int allocate(L leftId, Collection rightIds) {
        return allocate(singleton(leftId), rightIds);
    }

    public int allocate(Collection leftId, R rightId) {
        return allocate(leftId, singleton(rightId));
    }

    public int allocate(Collection leftIds, Collection rightIds) {
        SqlAndArgs sqlAndArgs = sqlBuilder.buildAllocate(
            leftIds, rightIds, (Long) (userIdProvider == null ? null : userIdProvider.getUserId()));
        return jdbcOperations.update(sqlAndArgs.getSql(), sqlAndArgs.getArgs());
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy