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

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

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

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

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

    // filters
    private final String FILTER_BY_MAX_FILES_IN_COMMIT;

    private final String FILTER_BY_ISSUE_CREATION_DATE;

    private final String FILTER_BY_BEFORE_ISSUE_CREATION_DATE;

    private final String FILTER_BY_AFTER_ISSUE_CREATION_DATE;

    private final String FIXED_ISSUES_ONLY;

    private final String FILTER_BY_ISSUES_THAT_HAS_AT_LEAST_ONE_COMMENT;

    // commits
    private final String COUNT_ISSUES_BY_FILE_NAME;

    private final String LIST_COMMENTS_OF_FILE_PAIR_BY_DATE;

    private final String SELECT_ISSUES_COMMENTS_OF_FILE_PAIR_BY_DATE;

    private final String COUNT_COMMENTS_OF_FILE_PAIR_BY_DATE;

    private final String SUM_CHANGES_OF_FILE_PAIR_BY_DATE;

    private final String SUM_ADD_DEL_LINES_OF_FILE_PAIR_BY_DATE;

    private final String SELECT_COMMITTERS_OF_PAIR_FILE;

    private final String COUNT_PAIR_FILE_COMMITS;

    private final String COUNT_PAIR_FILE_COMMITTERS;

    private final String COUNT_ISSUES;

    private final String FILTER_BY_USER_NAME;

    private final String SELECT_RELEASE_MIN_MAX_DATE_CREATION;

    private final GenericBichoDAO dao;

    public BichoPairFileDAO(GenericBichoDAO dao, String repository, Integer maxFilePerCommit) {
        this.dao = dao;

        if (repository == null
                || maxFilePerCommit == null) {
            throw new IllegalArgumentException("The parameters 'repository' and 'maxFilePerCommit' can not be null.");
        }

        // filters
        FILTER_BY_MAX_FILES_IN_COMMIT
                = QueryUtils.getQueryForDatabase(
                        " AND s.num_files <= " + maxFilePerCommit, repository);

        FILTER_BY_ISSUE_CREATION_DATE
                = " AND i.submitted_on BETWEEN ? AND ?";

        FILTER_BY_BEFORE_ISSUE_CREATION_DATE
                = " AND i.submitted_on <= ?";

        FILTER_BY_AFTER_ISSUE_CREATION_DATE
                = " AND i.submitted_on >= ?";

        FIXED_ISSUES_ONLY
                = " AND i.resolution = 'Fixed'";

        FILTER_BY_ISSUES_THAT_HAS_AT_LEAST_ONE_COMMENT
                = QueryUtils.getQueryForDatabase(
                        "AND i.num_comments > 0", repository);

        FILTER_BY_USER_NAME
                = " AND (p.name IS NOT NULL AND "
                + "      p.name = ?)";

        // commit
        COUNT_ISSUES
                = QueryUtils.getQueryForDatabase(
                        "SELECT COUNT(DISTINCT(i.id))"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a.file_id <> a2.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + " WHERE 1 = 1", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT;

        COUNT_ISSUES_BY_FILE_NAME
                = QueryUtils.getQueryForDatabase(
                        "SELECT COUNT(DISTINCT(i.id))"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a.file_id <> a2.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + " WHERE fill.file_path = ?"
                        + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT;

        LIST_COMMENTS_OF_FILE_PAIR_BY_DATE
                = QueryUtils.getQueryForDatabase(
                        "SELECT c.text"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_issues.comments c ON c.issue_id = i.id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a.file_id <> a2.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + " WHERE fill.file_path = ?"
                        + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT;

        SELECT_ISSUES_COMMENTS_OF_FILE_PAIR_BY_DATE
                = QueryUtils.getQueryForDatabase(
                        "SELECT distinct i.id, i.issue, i.description, c.text, iej.issue_key"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_issues.issues_ext_jira iej ON iej.issue_id = i.id"
                        + "  JOIN {0}_issues.comments c ON c.issue_id = i.id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a.file_id <> a2.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + " WHERE fill.file_path = ?"
                        + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT;

        COUNT_COMMENTS_OF_FILE_PAIR_BY_DATE
                = QueryUtils.getQueryForDatabase(
                        "SELECT COUNT(DISTINCT(c.id))"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_issues.comments c ON c.issue_id = i.id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a.file_id <> a2.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + " WHERE fill.file_path = ?"
                    + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT
                + FILTER_BY_ISSUE_CREATION_DATE;

        SUM_CHANGES_OF_FILE_PAIR_BY_DATE
                = QueryUtils.getQueryForDatabase(
                        "SELECT COALESCE((SUM(filcl.added) + SUM(filcl.removed) "
                        + "             + SUM(filcl2.added) + SUM(filcl2.removed), 0)"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a2.file_id <> a.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + "  JOIN {0}_vcs.commits_files_lines filcl ON filcl.commit = s.id AND filcl.path = fill.file_path"
                        + "  JOIN {0}_vcs.commits_files_lines filcl2 ON filcl2.commit = s.id AND filcl2.path = fill2.file_path"
                        + " WHERE fill.file_path = ?"
                        + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT;

        SUM_ADD_DEL_LINES_OF_FILE_PAIR_BY_DATE
                = QueryUtils.getQueryForDatabase(
                        "SELECT COALESCE((SUM(filcl.added) + SUM(filcl.added)), 0), "
                        + "      COALESCE((SUM(filcl.removed) + SUM(filcl2.removed)), 0),"
                        + "      COALESCE((SUM(filcl.added) + SUM(filcl.removed) + SUM(filcl2.added) + SUM(filcl2.removed)), 0)"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a2.file_id <> a.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + "  JOIN {0}_vcs.commits_files_lines filcl ON filcl.commit = s.id AND filcl.path = fill.file_path"
                        + "  JOIN {0}_vcs.commits_files_lines filcl2 ON filcl2.commit = s.id AND filcl2.path = fill2.file_path"
                        + " WHERE fill.file_path = ?"
                        + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT
                + FILTER_BY_ISSUE_CREATION_DATE;

        SELECT_COMMITTERS_OF_PAIR_FILE
                = QueryUtils.getQueryForDatabase(
                        "SELECT DISTINCT(p.name)"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_vcs.people p ON p.id = s.committer_id"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a2.file_id <> a.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + " WHERE fill.file_path = ?"
                        + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT;

        COUNT_PAIR_FILE_COMMITS
                = QueryUtils.getQueryForDatabase(
                        "SELECT COUNT(DISTINCT(s.id))"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_vcs.people p ON p.id = s.committer_id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = a.commit_id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a2.file_id <> a.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + " WHERE fill.file_path = ?"
                        + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT;

        COUNT_PAIR_FILE_COMMITTERS
                = QueryUtils.getQueryForDatabase(
                        "SELECT COUNT(DISTINCT(p.name))"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_issues.comments c ON c.issue_id = i.id"
                        + "  JOIN {0}_issues.people p ON p.id = c.submitted_by"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a2.file_id <> a.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + " WHERE fill.file_path = ?"
                        + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT;

        SELECT_RELEASE_MIN_MAX_DATE_CREATION
                = QueryUtils.getQueryForDatabase(
                        "SELECT MIN(s.date), MAX(s.date)"
                        + "  FROM {0}_vcs.scmlog s"
                        + "  JOIN {0}_issues.issues_scmlog i2s ON i2s.scmlog_id = s.id"
                        + "  JOIN {0}_issues.issues i ON i.id = i2s.issue_id"
                        + "  JOIN {0}_vcs.actions a ON a.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil ON fil.id = a.file_id"
                        + "  JOIN {0}_vcs.file_links fill ON fill.file_id = fil.id"
                        + "  JOIN {0}_vcs.actions a2 ON a2.commit_id = s.id"
                        + "  JOIN {0}_vcs.files fil2 ON fil2.id = a2.file_id AND a2.file_id <> a.file_id"
                        + "  JOIN {0}_vcs.file_links fill2 ON fill2.file_id = fil2.id"
                        + " WHERE fill.file_path = ?"
                        + "   AND fill2.file_path = ?", repository)
                + FILTER_BY_MAX_FILES_IN_COMMIT;
    }

    public long calculeNumberOfIssues(Date beginDate, Date endDate, boolean onlyFixed) {

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

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

        if (onlyFixed) {
            sql.append(FIXED_ISSUES_ONLY);
        }

        sql.append(FILTER_BY_ISSUE_CREATION_DATE);
        selectParams.add(beginDate);
        selectParams.add(endDate);

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

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

    public long calculeNumberOfIssues(
            String file, String file2, Date beginDate, Date endDate, boolean onlyFixed) {

        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(COUNT_ISSUES_BY_FILE_NAME);
        selectParams.add(file);
        selectParams.add(file2);

        if (onlyFixed) {
            sql.append(FIXED_ISSUES_ONLY);
        }

        sql.append(FILTER_BY_ISSUE_CREATION_DATE);
        selectParams.add(beginDate);
        selectParams.add(endDate);

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

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

    public long calculeComments(
            String file, String file2, Date beginDate, Date endDate, boolean onlyFixed) {

        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(COUNT_COMMENTS_OF_FILE_PAIR_BY_DATE);

        if (onlyFixed) {
            sql.append(FIXED_ISSUES_ONLY);
        }

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

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

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

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

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

        BigDecimal sum = dao.selectNativeOneWithParams(SUM_CHANGES_OF_FILE_PAIR_BY_DATE, bdObjects);

        return sum.longValue();
    }

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

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

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

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

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

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

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

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

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

        if (onlyFixed) {
            sql.append(FIXED_ISSUES_ONLY);
        }

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

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

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

        Set<AuxUser> commitersList = new HashSet<>(committers.size());
        for (String name : committers) {
            commitersList.add(new AuxUser(name));
        }

        return commitersList;
    }

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

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

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

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

    public long calculeCommits(
            String file, String file2, String user, Date beginDate, Date endDate, boolean onlyFixed) {
        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(file);
        selectParams.add(file2);

        if (onlyFixed) {
            sql.append(FIXED_ISSUES_ONLY);
        }

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

        if (user != null) {
            sql.append(FILTER_BY_USER_NAME);
            selectParams.add(user);
        }

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

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

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

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

    public long calculeCommitters(
            String file, String file2, Date beginDate, Date endDate, boolean onlyFixed) {
        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(file);
        selectParams.add(file2);

        if (onlyFixed) {
            sql.append(FIXED_ISSUES_ONLY);
        }

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

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

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

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

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

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

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

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

        List<Object[]> rawIssues = dao.selectNativeWithParams(sql.toString(), selectParams.toArray());
       
        Map<Integer, AuxWordiness> cache = new HashMap<>(rawIssues.size());
        for (Object[] objects : rawIssues) {
            Integer issueNumber = (Integer) objects[0];

            if (cache.containsKey(issueNumber)) {
                cache.get(issueNumber).addComment((String) objects[3]);
            } else {
                List<String> comments = new ArrayList<>();
                comments.add((String) objects[3]);
                AuxWordiness issue = new AuxWordiness(
                        issueNumber,
                        (String) objects[1],
                        (String) objects[2],
                        (String) objects[4],
                        comments);
                cache.put(issueNumber, issue);
            }
        }

        return cache.values();
    }

    public List<EntityComment> listComments( String file, String file2, Date beginDate, Date endDate, boolean onlyFixed) {
        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(LIST_COMMENTS_OF_FILE_PAIR_BY_DATE);

        if (onlyFixed) {
            sql.append(FIXED_ISSUES_ONLY);
        }

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

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

        return comments;
    }

    public int calculePairFileDaysAge( String file, String file2, Date beginDate, Date endDate, boolean onlyFixed) {
        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 (onlyFixed) {
            sql.append(FIXED_ISSUES_ONLY);
        }

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

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

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

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

        if (minMaxDate[0] == null || minMaxDate[1] == null) {
            return 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.BichoPairFileDAO

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.