private void fillFacetFieldResults()

in src/java/com/twitter/search/earlybird_root/mergers/FacetResponseMerger.java [157:304]


  private void fillFacetFieldResults(FacetsResultsUtils.FacetFieldInfo facetFieldInfo,
                                     Map<Long, Integer> antiGamingMap,
                                     ThriftFacetFieldResults results) {
    int minWeightedCount = 0;
    int minSimpleCount = 0;
    int maxPenaltyCount = Integer.MAX_VALUE;
    double maxPenaltyCountRatio = 1;
    boolean excludePossiblySensitiveFacets = false;
    boolean onlyReturnFacetsWithDisplayTweet = false;
    int maxHitsPerUser = -1;

    EarlybirdRequest request = requestContext.getRequest();
    if (request.getFacetRequest() != null) {
      ThriftFacetRankingOptions rankingOptions = request.getFacetRequest().getFacetRankingOptions();

      if (request.getSearchQuery() != null) {
        maxHitsPerUser = request.getSearchQuery().getMaxHitsPerUser();
      }

      if (rankingOptions != null) {
        LOG.debug("FacetsResponseMerger: Using rankingOptions={}", rankingOptions);

        if (rankingOptions.isSetMinCount()) {
          minWeightedCount = rankingOptions.getMinCount();
        }
        if (rankingOptions.isSetMinSimpleCount()) {
          minSimpleCount = rankingOptions.getMinSimpleCount();
        }
        if (rankingOptions.isSetMaxPenaltyCount()) {
          maxPenaltyCount = rankingOptions.getMaxPenaltyCount();
        }
        if (rankingOptions.isSetMaxPenaltyCountRatio()) {
          maxPenaltyCountRatio = rankingOptions.getMaxPenaltyCountRatio();
        }
        if (rankingOptions.isSetExcludePossiblySensitiveFacets()) {
          excludePossiblySensitiveFacets = rankingOptions.isExcludePossiblySensitiveFacets();
        }
        if (rankingOptions.isSetOnlyReturnFacetsWithDisplayTweet()) {
          onlyReturnFacetsWithDisplayTweet = rankingOptions.isOnlyReturnFacetsWithDisplayTweet();
        }
      }
    } else {
      LOG.warn("earlybirdRequest.getFacetRequest() is null");
    }

    ThriftFacetCount[] topFacetsArray = new ThriftFacetCount[facetFieldInfo.topFacets.size()];

    facetFieldInfo.topFacets.values().toArray(topFacetsArray);
    Arrays.sort(topFacetsArray, Collections.<ThriftFacetCount>reverseOrder(
        FacetsResultsUtils.getFacetCountComparator(request.getFacetRequest())));

    int numResults = capFacetFieldWidth(facetFieldInfo.fieldRequest.numResults);

    if (topFacetsArray.length < numResults) {
      numResults = topFacetsArray.length;
    }

    int collected = 0;
    for (int i = 0; i < topFacetsArray.length; ++i) {
      ThriftFacetCount count = topFacetsArray[i];

      if (onlyReturnFacetsWithDisplayTweet
          && (!count.isSetMetadata() || !count.getMetadata().isSetStatusId()
              || count.getMetadata().getStatusId() == -1)) {
        // status id must be set
        continue;
      }

      if (excludePossiblySensitiveFacets && count.isSetMetadata()
          && count.getMetadata().isStatusPossiblySensitive()) {
        // the display tweet may be offensive or NSFW
        if (DebugMessageBuilder.DEBUG_VERBOSE <= debugMessageBuilder.getDebugLevel()) {
          debugMessageBuilder.verbose2("[%d] FacetsResponseMerger EXCLUDED: offensive or NSFW %s, "
                                           + "explanation: %s",
                                       i, facetCountSummary(count),
                                       count.getMetadata().getExplanation());
        }
        continue;
      }

      boolean filterOutUser = false;
      if (maxHitsPerUser != -1 && count.isSetMetadata()) {
        ThriftFacetCountMetadata metadata = count.getMetadata();
        if (!metadata.dontFilterUser) {
          long twitterUserId = metadata.getTwitterUserId();
          int numResultsFromUser = 1;
          if (twitterUserId != -1) {
            Integer perUser = antiGamingMap.get(twitterUserId);
            if (perUser != null) {
              numResultsFromUser = perUser + 1;
              filterOutUser = numResultsFromUser > maxHitsPerUser;
            }
            antiGamingMap.put(twitterUserId, numResultsFromUser);
          }
        }
      }

      // Filter facets those don't meet the basic criteria.
      if (count.getSimpleCount() < minSimpleCount) {
        if (DebugMessageBuilder.DEBUG_VERBOSE <= debugMessageBuilder.getDebugLevel()) {
          debugMessageBuilder.verbose2(
              "[%d] FacetsResponseMerger EXCLUDED: simpleCount:%d < minSimpleCount:%d, %s",
              i, count.getSimpleCount(), minSimpleCount, facetCountSummary(count));
        }
        continue;
      }
      if (count.getWeightedCount() < minWeightedCount) {
        if (DebugMessageBuilder.DEBUG_VERBOSE <= debugMessageBuilder.getDebugLevel()) {
          debugMessageBuilder.verbose2(
              "[%d] FacetsResponseMerger EXCLUDED: weightedCount:%d < minWeightedCount:%d, %s",
              i, count.getWeightedCount(), minWeightedCount, facetCountSummary(count));
        }
        continue;
      }
      if (filterOutUser) {
        if (DebugMessageBuilder.DEBUG_VERBOSE <= debugMessageBuilder.getDebugLevel()) {
          debugMessageBuilder.verbose2(
              "[%d] FacetsResponseMerger EXCLUDED: antiGaming filterd user: %d: %s",
              i, count.getMetadata().getTwitterUserId(), facetCountSummary(count));
        }
        continue;
      }
      if (count.getPenaltyCount() > maxPenaltyCount) {
        if (DebugMessageBuilder.DEBUG_VERBOSE <= debugMessageBuilder.getDebugLevel()) {
          debugMessageBuilder.verbose2(
              "[%d] FacetsResponseMerger EXCLUCED: penaltyCount:%.3f > maxPenaltyCount:%.3f, %s",
              i, count.getPenaltyCount(), maxPenaltyCount, facetCountSummary(count));
        }
        continue;
      }
      if (((double) count.getPenaltyCount() / count.getSimpleCount()) > maxPenaltyCountRatio) {
        if (DebugMessageBuilder.DEBUG_VERBOSE <= debugMessageBuilder.getDebugLevel()) {
          debugMessageBuilder.verbose2(
              "[%d] FacetsResponseMerger EXCLUDED: penaltyCountRatio: %.3f > "
                  + "maxPenaltyCountRatio:%.3f, %s",
              i, (double) count.getPenaltyCount() / count.getSimpleCount(), maxPenaltyCountRatio,
              facetCountSummary(count));
        }
        continue;
      }
      results.addToTopFacets(count);

      collected++;
      if (collected >= numResults) {
        break;
      }
    }
  }