示例#1
0
  @Override
  public List<AdDefinition> search(AdRequest request) throws IOException {
    IndexSearcher searcher = nrt_manager.acquire();
    List<AdDefinition> result = new ArrayList<AdDefinition>();
    try {
      // Collector für die Banner
      AdCollector collector = new AdCollector(searcher.getIndexReader().numDocs());

      // MainQuery
      BooleanQuery mainQuery = new BooleanQuery();
      // Query für den/die BannerTypen
      BooleanQuery typeQuery = new BooleanQuery();
      for (AdType type : request.types()) {
        TermQuery tq = new TermQuery(new Term(AdDBConstants.ADDB_AD_TYPE, type.getType()));
        typeQuery.add(tq, Occur.SHOULD);
      }
      mainQuery.add(typeQuery, Occur.MUST);

      // Query für den/die BannerFormate
      BooleanQuery formatQuery = new BooleanQuery();
      for (AdFormat format : request.formats()) {
        TermQuery tq =
            new TermQuery(new Term(AdDBConstants.ADDB_AD_FORMAT, format.getCompoundName()));
        formatQuery.add(tq, Occur.SHOULD);
      }
      mainQuery.add(formatQuery, Occur.MUST);

      // Query für die Bedingungen unter denen ein Banner angezeigt werden soll
      Query cq = LuceneQueryHelper.getInstance().getConditionalQuery(request, this.addb);
      if (cq != null) {
        mainQuery.add(cq, Occur.MUST);
      }

      /*
       * Es sollen nur Produkte geliefert werden
       */
      if (request.products()) {
        // search online for products
        mainQuery.add(
            new TermQuery(
                new Term(AdDBConstants.ADDB_AD_PRODUCT, AdDBConstants.ADDB_AD_PRODUCT_TRUE)),
            Occur.MUST);

        // if possible add the product name, so online ads for that product will be found
        if (!Strings.isNullOrEmpty(request.product())) {
          mainQuery.add(
              new TermQuery(new Term(AdDBConstants.ADDB_AD_PRODUCT_NAME, request.product())),
              Occur.MUST);
        }

      } else {
        mainQuery.add(
            new TermQuery(
                new Term(AdDBConstants.ADDB_AD_PRODUCT, AdDBConstants.ADDB_AD_PRODUCT_FALSE)),
            Occur.MUST);
      }

      logger.debug(mainQuery.toString());
      System.out.println(mainQuery.toString());

      searcher.search(mainQuery, collector);

      BitSet hits = collector.getHits();
      // Ergebnis
      for (int i = hits.nextSetBit(0); i != -1; i = hits.nextSetBit(i + 1)) {
        Document doc = searcher.doc(i);
        result.add(addb.getBanner(doc.get(AdDBConstants.ADDB_AD_ID)));
      }
    } finally {
      nrt_manager.release(searcher);
    }

    return result;
  }