public void consume(Collection<proj.zoie.api.DataConsumer.DataEvent<V>> events)
      throws ZoieException {
    if (_writer == null) {
      throw new ZoieException("Internal IndexWriter null, perhaps not started?");
    }

    if (events.size() > 0) {
      for (DataEvent<V> event : events) {
        ZoieIndexable indexable = _interpreter.convertAndInterpret(event.getData());
        if (indexable.isSkip()) continue;

        try {
          _writer.deleteDocuments(new Term(DOCUMENT_ID_FIELD, String.valueOf(indexable.getUID())));
        } catch (IOException e) {
          throw new ZoieException(e.getMessage(), e);
        }

        IndexingReq[] reqs = indexable.buildIndexingReqs();
        for (IndexingReq req : reqs) {
          Analyzer localAnalyzer = req.getAnalyzer();
          Document doc = req.getDocument();
          Field uidField =
              new Field(
                  DOCUMENT_ID_FIELD,
                  String.valueOf(indexable.getUID()),
                  Store.NO,
                  Index.NOT_ANALYZED_NO_NORMS);
          uidField.setOmitTermFreqAndPositions(true);
          doc.add(uidField);
          if (localAnalyzer == null) localAnalyzer = _analyzer;
          try {
            _writer.addDocument(doc, localAnalyzer);
          } catch (IOException e) {
            throw new ZoieException(e.getMessage(), e);
          }
        }
      }

      int numdocs;
      try {
        // for realtime commit is not needed per lucene mailing list
        // _writer.commit();
        numdocs = _writer.numDocs();
      } catch (IOException e) {
        throw new ZoieException(e.getMessage(), e);
      }

      logger.info(
          "flushed "
              + events.size()
              + " events to index, index now contains "
              + numdocs
              + " docs.");
    }
  }
 public boolean isSkip() {
   return _inner.isSkip();
 }