File

src/common/filters/repo-filter.service.ts

Index

Methods

Methods

applyQueryBuilderFilters
applyQueryBuilderFilters(qb: SelectQueryBuilder, filters: [])
Type parameters :
  • T

applies the filters using the provided QueryBuilder

Parameters :
Name Type Optional Default value
qb SelectQueryBuilder<T> No
filters [] No []
Returns : void
getRepoFilters
getRepoFilters(options: FilterOptionsDto)

applies repo-based filters based on the filter/InsightFilterFieldsEnum query param

Parameters :
Name Type Optional
options FilterOptionsDto No
Returns : []
import { Injectable } from "@nestjs/common";
import { ObjectLiteral, SelectQueryBuilder } from "typeorm";

import { InsightFilterFieldsEnum } from "../../insight/dtos/insight-options.dto";
import { FilterOptionsDto } from "../dtos/filter-options.dto";

@Injectable()
export class RepoFilterService {
  /**
   * applies repo-based filters based on the filter/InsightFilterFieldsEnum query param
   * @param options
   * @param range
   */

  getRepoFilters(options: FilterOptionsDto): [string, object][] {
    const filters: [string, object][] = [];

    if (options.repoIds) {
      filters.push([`repos.id IN (:...repoIds)`, { repoIds: options.repoIds.split(",") }]);
    }

    if (options.repo) {
      filters.push([`LOWER(repos.full_name)=:repo`, { repo: decodeURIComponent(options.repo.toLowerCase()) }]);
    }

    if (options.topic) {
      filters.push([`:topic = ANY("repos"."topics")`, { topic: options.topic }]);
    }

    if (options.filter === InsightFilterFieldsEnum.Recent) {
      filters.push(["repos.stars >= 1000", {}]);
    } else if (options.filter === InsightFilterFieldsEnum.Top100 || options.filter === InsightFilterFieldsEnum.Top) {
      filters.push([
        `
        repos.id IN (
          SELECT "top_repos".id
          FROM "repos" "top_repos"
          WHERE
            top_repos.stars > 1000
          ORDER BY top_repos.stars DESC
          LIMIT 1000
        )
      `,
        {},
      ]);
    }

    /*
     *  else if (options.filter === InsightFilterFieldsEnum.MinimumContributors) {
     *   filters.push([`
     *     repo.id IN (
     *       SELECT id FROM (SELECT repos.id, COUNT(contributors.id) as contributor_count
     *       FROM repos
     *       JOIN contributors on repos.id=contributors.repo_id
     *       WHERE now() - INTERVAL '${interval} days' <= to_timestamp("contributors"."last_commit_time" / 1000)
     *       GROUP BY repos.id
     *     ) contributor_counts
     *     WHERE contributor_count >= 5
     *   )`, {}]);
     * }
     */

    return filters;
  }

  /**
   * applies the filters using the provided QueryBuilder
   * @param qb
   * @param filters
   */

  applyQueryBuilderFilters<T extends ObjectLiteral>(qb: SelectQueryBuilder<T>, filters: [string, object][] = []) {
    filters.forEach(([sql, data], index) => {
      if (index === 0) {
        qb.where(sql, data);
      } else {
        qb.andWhere(sql, data);
      }
    });
  }
}

results matching ""

    No results matching ""