Package br.edu.utfpr.cm.JGitMinerWeb.dao

Source Code of br.edu.utfpr.cm.JGitMinerWeb.dao.PairFileDAO

package br.edu.utfpr.cm.JGitMinerWeb.dao;

import br.edu.utfpr.cm.JGitMinerWeb.model.miner.EntityComment;
import br.edu.utfpr.cm.JGitMinerWeb.model.miner.EntityRepository;
import br.edu.utfpr.cm.JGitMinerWeb.services.metric.auxiliary.AuxWordiness;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.joda.time.Days;
import org.joda.time.LocalDate;

/**
*
* @author Rodrigo T. Kuroda
*/
public class PairFileDAO {

    private static final String CALCULE_SUM_UPDATES_OF_TWO_FILE
            = "SELECT count(1)"
            + "  FROM gitrepositorycommit rc,"
            + "       gitcommit c,"
            + "       gitcommituser u,"
            + "       gitcommitfile fil"
            + " WHERE rc.commit_id = c.id"
            + "   AND c.committer_id = u.id"
            + "   AND fil.repositorycommit_id = rc.id"
            + "   AND rc.repository_id = ?"
            + "   AND u.datecommituser BETWEEN ? AND ?"
            + "   AND (fil.filename = ? OR fil.filename = ?)";

    private static final String CALCULE_UPDATES
            = "SELECT count(distinct(rc.id)) FROM "
            + "  gitcommitfile fil, gitcommitfile fil2, "
            + "  gitpullrequest_gitrepositorycommit prc,"
            + "  gitpullrequest_gitrepositorycommit prc2,"
            + "  gitrepositorycommit rc,"
            + "  gitrepositorycommit rc2,"
            + "  gitcommit c,"
            + "  gitcommit c2,"
            + "  gitcommituser u,"
            + "  gitcommituser u2"
            + " WHERE fil.repositorycommit_id = prc.repositorycommits_id"
            + "   AND fil.repositorycommit_id = rc.id"
            + "   AND rc.commit_id = c.id"
            + "   AND u.id = c.committer_id"
            + "   AND fil2.repositorycommit_id = prc2.repositorycommits_id"
            + "   AND fil2.repositorycommit_id = rc2.id"
            + "   AND rc2.commit_id = c2.id"
            + "   AND u2.id = c2.committer_id"
            + "   AND fil.filename <> fil2.filename"
            + "   AND prc.entitypullrequest_id = prc2.entitypullrequest_id"
            + "   AND rc.repository_id = ?"
            + "   AND u.datecommituser BETWEEN ? AND ?"
            + "   AND u2.datecommituser BETWEEN ? AND ?"
            + "   AND fil.filename = ?"
            + "   AND fil2.filename = ?";

    private static final String SELECT_PULL_REQUEST_BY_DATE = "SELECT count(distinct(pul.id)) "
            + " FROM gitpullrequest pul "
            + " WHERE pul.repository_id = ? "
            + "   AND pul.createdat BETWEEN ? AND ? ";

    private static final String SELECT_PULL_REQUEST_AND_ISSUE_BY_DATE = "SELECT count(distinct(pul.id)) "
            + " FROM gitpullrequest pul, gitissue iss "
            + " WHERE pul.repository_id = ? "
            + "   AND iss.id = pul.issue_id "
            + "   AND iss.commentscount > 1 "
            + "   AND pul.createdat BETWEEN ? AND ? ";

    private static final String SELECT_PULL_REQUEST_BY_NUMBER = "SELECT count(1) "
            + " FROM gitpullrequest pul "
            + " WHERE pul.repository_id = ? "
            + "   AND pul.number BETWEEN ? AND ? ";

    private static final String FILTER_BY_PULL_REQUEST_CREATION_DATE
            = " AND pul.createdat BETWEEN ? AND ? ";

    private static final String FILTER_BY_BEFORE_PULL_REQUEST_CREATION_DATE
            = " AND pul.createdat <= ? ";

    private static final String FILTER_BY_AFTER_PULL_REQUEST_CREATION_DATE
            = " AND pul.createdat >= ? ";

    private static final String MERGED_PULL_REQUEST_ONLY
            = " AND pul.mergedat IS NOT NULL ";

    private static final String EXISTS_FILE1_IN_PULL_REQUEST = " AND EXISTS "
            + "(SELECT 1 "
            + "FROM gitpullrequest_gitrepositorycommit r, "
            + "     gitcommitfile f "
            + "WHERE r.entitypullrequest_id = pul.id "
            + "  AND f.repositorycommit_id = r.repositorycommits_id "
            + "  AND f.filename = ?) ";

    private static final String EXISTS_FILE2_IN_PULL_REQUEST = " AND EXISTS "
            + "(SELECT 1  "
            + "FROM gitpullrequest_gitrepositorycommit r2, "
            + "     gitcommitfile f2 "
            + "WHERE r2.entitypullrequest_id = pul.id "
            + "  AND f2.repositorycommit_id = r2.repositorycommits_id "
            + "  AND f2.filename = ?) ";

    private static final String LIST_COMMENTS_OF_FILE_PAIR_BY_DATE = "SELECT * "
            + "FROM gitpullrequest pul "
            + "  JOIN gitissue i ON i.id = pul.issue_id "
            + "  JOIN gitcomment c ON c.issue_id = i.id "
            + "WHERE pul.repository_id = ? "
            + "  AND pul.createdat BETWEEN ? AND ? ";

    private static final String LIST_ISSUES_OF_FILE_PAIR_BY_DATE
            = "SELECT pul.number, i.url, i.body "
            + "  FROM gitpullrequest pul "
            + "  JOIN gitissue i ON i.id = pul.issue_id "
            + " WHERE pul.repository_id = ? "
            + "   AND i.commentsCount > 0 "
            + "   AND pul.createdat BETWEEN ? AND ? ";

    private static final String LIST_COMMENTS_BY_PULL_REQUEST_NUMBER
            = "SELECT c.body "
            + "  FROM gitcomment c "
            + "  JOIN gitissue i ON i.id = c.issue_id "
            + "  JOIN gitpullrequest pul ON i.id = pul.issue_id "
            + " WHERE pul.number = ?"
            + "   AND i.commentsCount > 0 ";

    private static final String COUNT_COMMENTS_OF_FILE_PAIR_BY_DATE = "SELECT SUM(i.commentscount) "
            + "FROM gitpullrequest pul "
            + "  JOIN gitissue i ON i.id = pul.issue_id "
            + "WHERE pul.repository_id = ? "
            + "  AND pul.createdat BETWEEN ? AND ? ";

    private static final String COUNT_COMMENTS_OF_FILE_PAIR_BY_PULL_REQUEST_NUMBER = "SELECT SUM(i.commentscount) "
            + "FROM gitpullrequest pul "
            + "  JOIN gitissue i ON i.id = pul.issue_id "
            + "WHERE pul.repository_id = ? "
            + "  AND pul.number BETWEEN ? AND ? ";

    private static final String SELECT_SUM_OF_CHANGES_OF_FILE_PAIR_BY_PULL_REQUEST_NUMBER
            = "SELECT (sum(fil.changes) + sum(fil2.changes)) AS codeChurn"
            + "  FROM gitpullrequest pul,"
            + "       gitcommitfile fil, gitcommitfile fil2,"
            + "       gitpullrequest_gitrepositorycommit prc,"
            + "       gitpullrequest_gitrepositorycommit prc2"
            + " WHERE prc.entitypullrequest_id = pul.id"
            + "   AND fil.repositorycommit_id = prc.repositorycommits_id"
            + "   AND prc2.entitypullrequest_id = pul.id"
            + "   AND fil2.repositorycommit_id = prc2.repositorycommits_id"
            + "   AND fil.filename <> fil2.filename"
            + "   AND prc.entitypullrequest_id = prc2.entitypullrequest_id"
            + "   AND pul.mergedat IS NOT NULL"
            + "   AND pul.repository_id = ?"
            + "   AND fil.filename = ?"
            + "   AND fil2.filename = ?"
            + "   AND pul.number between ? AND ?";

    private static final String SELECT_SUM_OF_CHANGES_OF_FILE_PAIR_BY_DATE
            = "SELECT (sum(fil.changes) + sum(fil2.changes)) AS codeChurn"
            + "  FROM gitpullrequest pul,"
            + "       gitcommitfile fil, gitcommitfile fil2,"
            + "       gitpullrequest_gitrepositorycommit prc,"
            + "       gitpullrequest_gitrepositorycommit prc2"
            + " WHERE prc.entitypullrequest_id = pul.id"
            + "   AND fil.repositorycommit_id = prc.repositorycommits_id"
            + "   AND prc2.entitypullrequest_id = pul.id"
            + "   AND fil2.repositorycommit_id = prc2.repositorycommits_id"
            + "   AND fil.filename <> fil2.filename"
            + "   AND prc.entitypullrequest_id = prc2.entitypullrequest_id"
            + "   AND pul.mergedat IS NOT NULL"
            + "   AND pul.repository_id = ?"
            + "   AND fil.filename = ?"
            + "   AND fil2.filename = ?"
            + "   AND pul.createdat between ? AND ?";

    private static final String SELECT_SUM_OF_ADD_DEL_CHANGES_OF_FILE_PAIR_BY_DATE
            = "SELECT (sum(fil.additions) + sum(fil2.additions)) AS additions,"
            + "       (sum(fil.deletions) + sum(fil2.deletions)) AS deletions,"
            + "       (sum(fil.changes) + sum(fil2.changes)) AS codeChurn"
            + "  FROM gitpullrequest pul,"
            + "       gitcommitfile fil, gitcommitfile fil2,"
            + "       gitpullrequest_gitrepositorycommit prc,"
            + "       gitpullrequest_gitrepositorycommit prc2"
            + " WHERE prc.entitypullrequest_id = pul.id"
            + "   AND fil.repositorycommit_id = prc.repositorycommits_id"
            + "   AND prc2.entitypullrequest_id = pul.id"
            + "   AND fil2.repositorycommit_id = prc2.repositorycommits_id"
            + "   AND fil.filename <> fil2.filename"
            + "   AND prc.entitypullrequest_id = prc2.entitypullrequest_id"
            + "   AND pul.mergedat IS NOT NULL"
            + "   AND pul.repository_id = ?"
            + "   AND fil.filename = ?"
            + "   AND fil2.filename = ?"
            + "   AND pul.createdat between ? AND ?";


    private static final String SELECT_PAIR_FILE_COMMITTERS
            = "SELECT u.name, u.email FROM " // u ou u2 retornam a mesma coisa
            + "  gitpullrequest pul, gitissue i,"
            + "  gitcommitfile fil, gitcommitfile fil2, "
            + "  gitpullrequest_gitrepositorycommit prc,"
            + "  gitpullrequest_gitrepositorycommit prc2,"
            + "  gitrepositorycommit rc,"
            + "  gitrepositorycommit rc2,"
            + "  gitcommit c,"
            + "  gitcommit c2,"
            + "  gitcommituser u,"
            + "  gitcommituser u2"
            + " WHERE pul.issue_id = i.id"
            + "   AND prc.entitypullrequest_id = pul.id"
            + "   AND fil.repositorycommit_id = prc.repositorycommits_id"
            + "   AND fil.repositorycommit_id = rc.id"
            + "   AND rc.commit_id = c.id"
            + "   AND u.id = c.committer_id"
            + "   AND prc2.entitypullrequest_id = pul.id"
            + "   AND fil2.repositorycommit_id = prc2.repositorycommits_id"
            + "   AND fil2.repositorycommit_id = rc2.id"
            + "   AND rc2.commit_id = c2.id"
            + "   AND u2.id = c2.committer_id"
            + "   AND fil.filename <> fil2.filename"
            + "   AND u.email = u2.email"
            + "   AND u.name = u2.name"
            + "   AND prc.entitypullrequest_id = prc2.entitypullrequest_id"
            + "   AND pul.repository_id = ?"
            + "   AND fil.filename = ?"
            + "   AND fil2.filename = ?";

    private static final String COUNT_PAIR_FILE_COMMITS
            = "SELECT count(distinct(prc.repositorycommits_id)) FROM "
            + "  gitpullrequest pul, gitissue i,"
            + "  gitcommitfile fil, gitcommitfile fil2, "
            + "  gitpullrequest_gitrepositorycommit prc,"
            + "  gitpullrequest_gitrepositorycommit prc2,"
            + "  gitrepositorycommit rc,"
            + "  gitrepositorycommit rc2,"
            + "  gitcommit c,"
            + "  gitcommit c2,"
            + "  gitcommituser u,"
            + "  gitcommituser u2"
            + " WHERE pul.issue_id = i.id"
            + "   AND prc.entitypullrequest_id = pul.id"
            + "   AND fil.repositorycommit_id = prc.repositorycommits_id"
            + "   AND fil.repositorycommit_id = rc.id"
            + "   AND rc.commit_id = c.id"
            + "   AND u.id = c.committer_id"
            + "   AND prc2.entitypullrequest_id = pul.id"
            + "   AND fil2.repositorycommit_id = prc2.repositorycommits_id"
            + "   AND fil2.repositorycommit_id = rc2.id"
            + "   AND rc2.commit_id = c2.id"
            + "   AND u2.id = c2.committer_id"
            + "   AND fil.filename <> fil2.filename"
            + "   AND prc.entitypullrequest_id = prc2.entitypullrequest_id"
            + "   AND pul.repository_id = ?"
            + "   AND fil.filename = ?"
            + "   AND fil2.filename = ?";

    private static final String COUNT_PAIR_FILE_COMMITTERS
            = "SELECT count(distinct(coalesce(nullif(trim(u.email), ''), u.name))) FROM "
            + "  gitpullrequest pul, gitissue i,"
            + "  gitcommitfile fil, gitcommitfile fil2, "
            + "  gitpullrequest_gitrepositorycommit prc,"
            + "  gitpullrequest_gitrepositorycommit prc2,"
            + "  gitrepositorycommit rc,"
            + "  gitrepositorycommit rc2,"
            + "  gitcommit c,"
            + "  gitcommit c2,"
            + "  gitcommituser u,"
            + "  gitcommituser u2"
            + " WHERE pul.issue_id = i.id"
            + "   AND prc.entitypullrequest_id = pul.id"
            + "   AND fil.repositorycommit_id = prc.repositorycommits_id"
            + "   AND fil.repositorycommit_id = rc.id"
            + "   AND rc.commit_id = c.id"
            + "   AND u.id = c.committer_id"
            + "   AND prc2.entitypullrequest_id = pul.id"
            + "   AND fil2.repositorycommit_id = prc2.repositorycommits_id"
            + "   AND fil2.repositorycommit_id = rc2.id"
            + "   AND rc2.commit_id = c2.id"
            + "   AND u2.id = c2.committer_id"
            + "   AND fil.filename <> fil2.filename"
            + "   AND prc.entitypullrequest_id = prc2.entitypullrequest_id"
            + "   AND pul.repository_id = ?"
            + "   AND fil.filename = ?"
            + "   AND fil2.filename = ?";

    private static final String FILTER_BY_USER_NAME_OR_EMAIL
            = "   AND ((u.email = ? AND u2.email = ?)"
            + "    OR (u.name = ? AND u2.name = ?))";

    private static final String SELECT_COMMITTERS_X_COMMITS_PER_ISSUE
            = "SELECT count(distinct(u.email)), count(distinct(rc.id)) FROM "
            + "   gitpullrequest pul, gitissue i,"
            + "   gitcommitfile fil, gitcommitfile fil2, "
            + "   gitpullrequest_gitrepositorycommit prc,"
            + "   gitpullrequest_gitrepositorycommit prc2,"
            + "   gitrepositorycommit rc,"
            + "   gitrepositorycommit rc2,"
            + "  gitcommit c,"
            + "  gitcommit c2,"
            + "   gitcommituser u,"
            + "   gitcommituser u2"
            + " WHERE pul.issue_id = i.id"
            + "   AND prc.entitypullrequest_id = pul.id"
            + "   AND rc.id = prc.repositorycommits_id"
            + "   AND fil.repositorycommit_id = rc.id"
            + "   AND rc.commit_id = c.id"
            + "   AND u.id = c.committer_id"
            + "   AND prc2.entitypullrequest_id = pul.id"
            + "   AND rc2.id = prc2.repositorycommits_id"
            + "   AND fil2.repositorycommit_id = rc2.id"
            + "   AND rc2.commit_id = c2.id"
            + "   AND u2.id = c2.committer_id"
            + "   AND fil.filename <> fil2.filename"
            + "   AND prc.entitypullrequest_id = prc2.entitypullrequest_id"
            + "   AND pul.repository_id = ?"
            + MERGED_PULL_REQUEST_ONLY
            + FILTER_BY_PULL_REQUEST_CREATION_DATE
            + "   AND fil.filename = ?"
            + "   AND fil2.filename = ?"
            + " GROUP BY i.id";

    private static final String SELECT_RELEASE_MIN_MAX_DATE_CREATION
            = "SELECT min(u.datecommituser), max(u.datecommituser) "
            + "  FROM gitpullrequest pul, gitissue i,"
            + "       gitcommitfile fil, gitcommitfile fil2, "
            + "       gitpullrequest_gitrepositorycommit prc,"
            + "       gitrepositorycommit rc,       "
            + "       gitcommit c,"
            + "       gitcommituser u,"
            + "       gitpullrequest_gitrepositorycommit prc2,"
            + "       gitrepositorycommit rc2,"
            + "       gitcommituser u2,"
            + "       gitcommit c2"
            + " WHERE pul.issue_id = i.id"
            + "   AND prc.entitypullrequest_id = pul.id"
            + "   AND rc.id = prc.repositorycommits_id"
            + "   AND fil.repositorycommit_id = rc.id"
            + "   AND rc.commit_id = c.id"
            + "   AND c.committer_id = u.id"
            + "   AND prc2.entitypullrequest_id = pul.id"
            + "   AND rc2.id = prc2.repositorycommits_id"
            + "   AND fil2.repositorycommit_id = rc2.id"
            + "   AND rc2.commit_id = c2.id"
            + "   AND c2.committer_id = u2.id"
            + "   AND fil.filename <> fil2.filename"
            + "   AND prc.entitypullrequest_id = prc2.entitypullrequest_id"
            + "   AND pul.repository_id = ?"
            + "   AND fil.filename = ?"
            + "   AND fil2.filename = ?";

    private static final String BEGIN_DATE
            = " AND pul.createdat >= ?";
    private static final String END_DATE
            = " AND pul.createdat <= ?";

    private final GenericDao dao;

    public PairFileDAO(GenericDao dao) {
        this.dao = dao;
    }

    public Long calculeSumUpdatesOfTwoFile(EntityRepository repository,
            String fileName, String fileName2,
            Date beginDate, Date endDate) {
        if (beginDate == null || endDate == null) {
            return 0l;
        }

        Object[] queryParams = new Object[]{
            repository,
            fileName,
            fileName2,
            beginDate,
            endDate
        };

        return dao.selectNativeOneWithParams(CALCULE_SUM_UPDATES_OF_TWO_FILE, queryParams);
    }

    public Long calculeUpdates(EntityRepository repository,
            String fileName, String fileName2,
            Date beginDate, Date endDate) {
        if (beginDate == null || endDate == null) {
            return 0l;
        }

        Object[] queryParams = new Object[]{
            repository,
            beginDate,
            endDate,
            beginDate,
            endDate,
            fileName,
            fileName2
        };

        return dao.selectNativeOneWithParams(CALCULE_UPDATES, queryParams);
    }

    public long calculeNumberOfPullRequest(EntityRepository repository,
            String file, String file2, Date beginDate, Date endDate, boolean onlyMergeds) {
        List<Object> selectParams = new ArrayList<>();

        StringBuilder sql = new StringBuilder();
        sql.append(SELECT_PULL_REQUEST_BY_DATE);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        selectParams.add(repository.getId());
        selectParams.add(beginDate);
        selectParams.add(endDate);

        if (file != null) {
            sql.append(EXISTS_FILE1_IN_PULL_REQUEST);
            selectParams.add(file);
        }

        if (file2 != null) {
            sql.append(EXISTS_FILE2_IN_PULL_REQUEST);
            selectParams.add(file2);
        }

        Long count = (Long) dao.selectNativeOneWithParams(sql.toString(), selectParams.toArray());

        return count != null ? count : 0l;
    }

    public long calculeNumberOfPullRequest(EntityRepository repository,
            String file, String file2, Long beginNumber, Long endNumber, boolean onlyMergeds) {
        List<Object> selectParams = new ArrayList<>();

        StringBuilder sql = new StringBuilder();
        sql.append(SELECT_PULL_REQUEST_BY_NUMBER);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        selectParams.add(repository.getId());
        selectParams.add(beginNumber);
        selectParams.add(endNumber);

        if (file != null) {
            sql.append(EXISTS_FILE1_IN_PULL_REQUEST);
            selectParams.add(file);
        }

        if (file2 != null) {
            sql.append(EXISTS_FILE2_IN_PULL_REQUEST);
            selectParams.add(file2);
        }

        Long count = dao.selectNativeOneWithParams(sql.toString(), selectParams.toArray());

        return count != null ? count : 0l;
    }

    public long calculeComments(EntityRepository repository,
            String file, String file2, Date beginDate, Date endDate, boolean onlyMergeds) {
        List<Object> selectParams = new ArrayList<>();

        StringBuilder sql = new StringBuilder();
        sql.append(COUNT_COMMENTS_OF_FILE_PAIR_BY_DATE);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        selectParams.add(repository.getId());
        selectParams.add(beginDate);
        selectParams.add(endDate);

        if (file != null) {
            sql.append(EXISTS_FILE1_IN_PULL_REQUEST);
            selectParams.add(file);
        }

        if (file2 != null) {
            sql.append(EXISTS_FILE2_IN_PULL_REQUEST);
            selectParams.add(file2);
        }

        Long count = dao.selectNativeOneWithParams(sql.toString(), selectParams.toArray());

        return count != null ? count : 0l;
    }

    public long calculeComments(EntityRepository repository,
            String file, String file2, Long beginNumber, Long endNumber, boolean onlyMergeds) {
        List<Object> selectParams = new ArrayList<>();

        StringBuilder sql = new StringBuilder();
        sql.append(COUNT_COMMENTS_OF_FILE_PAIR_BY_PULL_REQUEST_NUMBER);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        selectParams.add(repository.getId());
        selectParams.add(beginNumber);
        selectParams.add(endNumber);

        if (file != null) {
            sql.append(EXISTS_FILE1_IN_PULL_REQUEST);
            selectParams.add(file);
        }

        if (file2 != null) {
            sql.append(EXISTS_FILE2_IN_PULL_REQUEST);
            selectParams.add(file2);
        }

        Long count = dao.selectNativeOneWithParams(sql.toString(), selectParams.toArray());

        return count != null ? count : 0l;
    }

    public Long calculeCodeChurn(EntityRepository repository,
            String fileName, String fileName2, Long beginNumber, Long endNumber) {

        Object[] bdObjects = new Object[]{
            repository.getId(),
            fileName,
            fileName2,
            beginNumber,
            endNumber
        };

        Long sum = dao.selectNativeOneWithParams(
                SELECT_SUM_OF_CHANGES_OF_FILE_PAIR_BY_PULL_REQUEST_NUMBER, bdObjects);

        return sum;
    }

    public Long calculeCodeChurn(EntityRepository repository,
            String fileName, String fileName2, Date beginDate, Date endDate) {

        Object[] bdObjects = new Object[]{
            repository.getId(),
            fileName,
            fileName2,
            beginDate,
            endDate
        };

        Long sum = dao.selectNativeOneWithParams(
                SELECT_SUM_OF_CHANGES_OF_FILE_PAIR_BY_DATE, bdObjects);

        return sum;
    }

    public AuxCodeChurn calculeCodeChurnAddDelChange(EntityRepository repository,
            String fileName, String fileName2, Date beginDate, Date endDate) {

        Object[] params = new Object[]{
            repository.getId(),
            fileName,
            fileName2,
            beginDate,
            endDate
        };

        List<Object[]> sum = dao.selectNativeWithParams(
                SELECT_SUM_OF_ADD_DEL_CHANGES_OF_FILE_PAIR_BY_DATE, params);

        Long additions = sum.get(0)[0] == null ? 0 : (Long) sum.get(0)[0];
        Long deletions = sum.get(0)[1] == null ? 0 : (Long) sum.get(0)[1];
        Long changes = sum.get(0)[2] == null ? 0 : (Long) sum.get(0)[2];

        return new AuxCodeChurn(fileName, fileName2,
                additions, deletions, changes);
    }

    public Set<AuxUser> selectCommitters(EntityRepository repository,
            String file, String file2, Date beginDate, Date endDate) {
        return selectCommitters(repository, file, file2, beginDate, endDate, true);
    }

    public Set<AuxUser> selectCommitters(EntityRepository repository,
            String file, String file2, Date beginDate, Date endDate, boolean onlyMergeds) {

        List<Object> selectParams = new ArrayList<>();
        if (file == null || file2 == null) {
            throw new IllegalArgumentException("Pair file could not be null");
        }

        StringBuilder sql = new StringBuilder();
        sql.append(SELECT_PAIR_FILE_COMMITTERS);

        selectParams.add(repository.getId());
        selectParams.add(file);
        selectParams.add(file2);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        if (beginDate != null) {
            sql.append(FILTER_BY_AFTER_PULL_REQUEST_CREATION_DATE);
            selectParams.add(beginDate);
        }

        if (endDate != null) {
            sql.append(FILTER_BY_BEFORE_PULL_REQUEST_CREATION_DATE);
            selectParams.add(endDate);
        }

        List<Object[]> committers = dao.selectNativeWithParams(
                sql.toString(), selectParams.toArray());

        Set<AuxUser> commitersList = new HashSet<>(committers.size());
        for (Object[] nameAndEmail : committers) {
            commitersList.add(new AuxUser((String) nameAndEmail[0],
                    (String) nameAndEmail[1]));
        }

        return commitersList;
    }

    public long calculeCommits(EntityRepository repository,
            String file, String file2) {
        return calculeCommits(repository, file, file2, null, null, null, true);
    }

    public long calculeCommits(EntityRepository repository,
            String file, String file2, Date beginDate, Date endDate) {
        return calculeCommits(repository, file, file2, null, beginDate, endDate, true);
    }

    public long calculeCommits(EntityRepository repository,
            String file, String file2, Date beginDate, Date endDate, boolean onlyMergeds) {
        return calculeCommits(repository, file, file2, null, beginDate, endDate, onlyMergeds);
    }

    public long calculeCommits(EntityRepository repository,
            String file, String file2, String user, Date beginDate, Date endDate) {
        return calculeCommits(repository, file, file2, user, beginDate, endDate, true);
    }

    public long calculeCommits(EntityRepository repository,
            String file, String file2, String user, Date beginDate, Date endDate, boolean onlyMergeds) {
        List<Object> selectParams = new ArrayList<>();

        if (file == null || file2 == null) {
            throw new IllegalArgumentException("Pair file could not be null");
        }

        StringBuilder sql = new StringBuilder();
        sql.append(COUNT_PAIR_FILE_COMMITS);

        selectParams.add(repository.getId());
        selectParams.add(file);
        selectParams.add(file2);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        if (beginDate != null && endDate != null) {
            sql.append(FILTER_BY_PULL_REQUEST_CREATION_DATE);
            selectParams.add(beginDate);
            selectParams.add(endDate);
        }

        if (user != null) {
            sql.append(FILTER_BY_USER_NAME_OR_EMAIL);
            selectParams.add(user); // commiter email of file 1
            selectParams.add(user); // commiter email of file 2
            selectParams.add(user); // commiter name of file 1
            selectParams.add(user); // commiter name of file 2
        }

        Long count = dao.selectNativeOneWithParams(sql.toString(), selectParams.toArray());

        return count != null ? count : 0l;
    }

    public long calculeCommitters(EntityRepository repository,
            String file, String file2) {
        return calculeCommitters(repository, file, file2, null, null, true);
    }

    public long calculeCommitters(EntityRepository repository,
            String file, String file2, Date beginDate, Date endDate) {
        return calculeCommitters(repository, file, file2, beginDate, endDate, true);
    }

    public long calculeCommitters(EntityRepository repository,
            String file, String file2, Date beginDate, Date endDate, boolean onlyMergeds) {
        List<Object> selectParams = new ArrayList<>();

        if (file == null || file2 == null) {
            throw new IllegalArgumentException("Pair file could not be null");
        }

        StringBuilder sql = new StringBuilder();
        sql.append(COUNT_PAIR_FILE_COMMITTERS);

        selectParams.add(repository.getId());
        selectParams.add(file);
        selectParams.add(file2);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        if (beginDate != null) {
            sql.append(FILTER_BY_AFTER_PULL_REQUEST_CREATION_DATE);
            selectParams.add(beginDate);
        }

        if (endDate != null) {
            sql.append(FILTER_BY_BEFORE_PULL_REQUEST_CREATION_DATE);
            selectParams.add(endDate);
        }

        Long count = dao.selectNativeOneWithParams(sql.toString(), selectParams.toArray());

        return count != null ? count : 0l;
    }

    public final long[][] calculeCommittersXCommits(EntityRepository repository,
            String file, String file2, Date beginDate, Date endDate) {
        List<Object> selectParams = new ArrayList<>();

        if (file == null || file2 == null) {
            throw new IllegalArgumentException("Pair file could not be null");
        }

        selectParams.add(repository.getId());
        selectParams.add(beginDate);
        selectParams.add(endDate);
        selectParams.add(file);
        selectParams.add(file2);

        List<Object[]> list = dao.selectNativeWithParams(SELECT_COMMITTERS_X_COMMITS_PER_ISSUE, selectParams.toArray());

        final long[][] matrix = new long[list.size()][2];
        for (int i = 0; i < list.size(); i++) {
            matrix[i][0] = (Long) list.get(i)[0]; // committers
            matrix[i][1] = (Long) list.get(i)[1]; // commits
        }

        return matrix;
    }

    public List<AuxWordiness> listIssues(EntityRepository repository, String file, String file2, Date beginDate, Date endDate, boolean onlyMergeds) {
        List<Object> selectParams = new ArrayList<>();

        StringBuilder sql = new StringBuilder();
        sql.append(LIST_ISSUES_OF_FILE_PAIR_BY_DATE);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        selectParams.add(repository.getId());
        selectParams.add(beginDate);
        selectParams.add(endDate);

        if (file != null) {
            sql.append(EXISTS_FILE1_IN_PULL_REQUEST);
            selectParams.add(file);
        }

        if (file2 != null) {
            sql.append(EXISTS_FILE2_IN_PULL_REQUEST);
            selectParams.add(file2);
        }

        List<Object[]> rawIssues = dao.selectNativeWithParams(sql.toString(), selectParams.toArray());
        List<AuxWordiness> issuesAndComments = new ArrayList<>(rawIssues.size());
        for (Object[] objects : rawIssues) {
            Integer issuedNumber = (Integer) objects[0];
            AuxWordiness issue = new AuxWordiness(
                    issuedNumber,
                    (String) objects[1],
                    (String) objects[2],
                    listComments(issuedNumber));


            issuesAndComments.add(issue);
        }

        return issuesAndComments;
    }

    private List<String> listComments(Integer pullRequestNumber) {

        StringBuilder sql = new StringBuilder();
        sql.append(LIST_COMMENTS_BY_PULL_REQUEST_NUMBER);

        List<String> comments = dao.selectNativeWithParams(sql.toString(), new Object[]{pullRequestNumber});

        return comments;
    }

    public List<EntityComment> listComments(EntityRepository repository, String file, String file2, Date beginDate, Date endDate, boolean onlyMergeds) {
        List<Object> selectParams = new ArrayList<>();

        StringBuilder sql = new StringBuilder();
        sql.append(LIST_COMMENTS_OF_FILE_PAIR_BY_DATE);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        selectParams.add(repository.getId());
        selectParams.add(beginDate);
        selectParams.add(endDate);

        if (file != null) {
            sql.append(EXISTS_FILE1_IN_PULL_REQUEST);
            selectParams.add(file);
        }

        if (file2 != null) {
            sql.append(EXISTS_FILE2_IN_PULL_REQUEST);
            selectParams.add(file2);
        }

        List<EntityComment> comments = dao.selectNativeWithParams(sql.toString(), selectParams.toArray());

        return comments;
    }

    public int calculePairFileDaysAge(EntityRepository repository, String file, String file2, Date beginDate, Date endDate, boolean onlyMergeds) {
        if (file == null || file2 == null) {
            throw new IllegalArgumentException("The file and file2 parameters can not be null.");
        }

        List<Object> selectParams = new ArrayList<>();

        StringBuilder sql = new StringBuilder();
        sql.append(SELECT_RELEASE_MIN_MAX_DATE_CREATION);

        if (onlyMergeds) {
            sql.append(MERGED_PULL_REQUEST_ONLY);
        }

        selectParams.add(repository.getId());
        selectParams.add(file);
        selectParams.add(file2);

        if (beginDate != null) {
            sql.append(BEGIN_DATE);
            selectParams.add(beginDate);
        }

        if (endDate != null) {
            sql.append(END_DATE);
            selectParams.add(endDate);
        }

        List<Object[]> minMaxDateList = dao.selectNativeWithParams(sql.toString(), selectParams.toArray());
        Object[] minMaxDate = minMaxDateList.get(0);
        java.sql.Timestamp minDate = (java.sql.Timestamp) minMaxDate[0];
        java.sql.Timestamp maxDate = (java.sql.Timestamp) minMaxDate[1];

        LocalDate createdAt = new LocalDate(minDate.getTime());
        LocalDate finalDate = new LocalDate(maxDate.getTime());
        Days age = Days.daysBetween(createdAt, finalDate);

        return age.getDays();
    }
}
TOP

Related Classes of br.edu.utfpr.cm.JGitMinerWeb.dao.PairFileDAO

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.