lucene-wrapper.cc revision dce232dfbb2244555299dffb3618a4724748d260
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen/* Copyright (C) 2006 Timo Sirainen */
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenextern "C" {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen#include "lib.h"
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen#include "str-sanitize.h"
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen#include "lucene-wrapper.h"
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen};
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen#include <CLucene.h>
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen/* Lucene's default is 10000. Use it here also.. */
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen#define MAX_TERMS_PER_DOCUMENT 10000
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenusing namespace lucene::document;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenusing namespace lucene::index;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenusing namespace lucene::search;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenusing namespace lucene::queryParser;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainenusing namespace lucene::analysis;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstruct lucene_index {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen char *path;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen char *mailbox_name;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen TCHAR *tmailbox_name;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen IndexReader *reader;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen IndexWriter *writer;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen IndexSearcher *searcher;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen Analyzer *analyzer;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen Document *doc;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen uint32_t prev_uid, last_uid;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen int32_t last_uid_doc_id;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen};
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstatic const uint8_t utf8_skip_table[256] = {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen};
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainenclass RawTokenStream : public TokenStream {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen CL_NS(util)::Reader *reader;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainenpublic:
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen RawTokenStream(CL_NS(util)::Reader *reader) {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen this->reader = reader;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen };
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen bool next(Token *token) {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen const TCHAR *data;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen int32_t len = this->reader->read(data);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (len <= 0)
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen return false;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen token->set(data, 0, len);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen return true;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen }
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen void close() { }
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen};
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainenclass DovecotAnalyzer : public standard::StandardAnalyzer {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainenpublic:
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen TokenStream *tokenStream(const TCHAR *fieldName,
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen CL_NS(util)::Reader *reader) {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (fieldName != 0 && wcscmp(fieldName, L"contents") != 0)
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen return _CLNEW RawTokenStream(reader);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen return standard::StandardAnalyzer::
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen tokenStream(fieldName, reader);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen }
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen};
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstruct lucene_index *lucene_index_init(const char *path)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen struct lucene_index *index;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index = i_new(struct lucene_index, 1);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->path = i_strdup(path);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return index;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstatic void lucene_index_close(struct lucene_index *index)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen _CLDELETE(index->reader);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen _CLDELETE(index->writer);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen _CLDELETE(index->searcher);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen _CLDELETE(index->analyzer);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenvoid lucene_index_deinit(struct lucene_index *index)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen lucene_index_close(index);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen i_free(index->mailbox_name);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen i_free(index->tmailbox_name);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_free(index);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainenint lucene_index_select_mailbox(struct lucene_index *index,
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen const char *mailbox_name)
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen{
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen size_t len;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen i_free(index->mailbox_name);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen i_free(index->tmailbox_name);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen len = strlen(mailbox_name);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->mailbox_name = i_strdup(mailbox_name);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->tmailbox_name = i_new(TCHAR, len + 1);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen STRCPY_AtoT(index->tmailbox_name, mailbox_name, len);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen}
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstatic int lucene_index_open(struct lucene_index *index)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (index->reader != NULL)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (!IndexReader::indexExists(index->path))
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen try {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->reader = IndexReader::open(index->path);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen } catch (CLuceneError &err) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_error("lucene: IndexReader::open(%s): %s", index->path, err.what());
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstatic int lucene_index_open_search(struct lucene_index *index)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen int ret;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (index->searcher != NULL)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if ((ret = lucene_index_open(index)) <= 0)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return ret;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (index->analyzer == NULL)
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->analyzer = _CLNEW DovecotAnalyzer();
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->searcher = _CLNEW IndexSearcher(index->reader);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstatic int lucene_doc_get_uid(struct lucene_index *index,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen Document *doc, uint32_t *uid_r)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen Field *field = doc->getField(_T("uid"));
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen TCHAR *uid = field == NULL ? NULL : field->stringValue();
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (uid == NULL) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_error("lucene: Corrupted FTS index %s: No UID for document",
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->path);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen uint32_t num = 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen while (*uid != 0) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen num = num*10 + (*uid - '0');
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen uid++;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen *uid_r = num;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstatic int
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainenlucene_index_get_last_uid(struct lucene_index *index)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen int ret = 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen index->last_uid = 0;
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen index->last_uid_doc_id = -1;
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (lucene_index_open_search(index) <= 0)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen Term mailbox_term(_T("box"), index->tmailbox_name);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen Term last_uid_term(_T("last_uid"), _T("1"));
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen TermQuery mailbox_query(&mailbox_term);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen TermQuery last_uid_query(&last_uid_term);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen BooleanQuery query;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen query.add(&mailbox_query, true, false);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen query.add(&last_uid_query, true, false);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen try {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen Hits *hits = index->searcher->search(&query);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (hits->length() > 1) {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen i_error("lucene: last_uid search for mailbox %s "
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen "returned multiple hits", index->mailbox_name);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen }
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen for (int32_t i = 0; i < hits->length(); i++) {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen uint32_t uid;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (lucene_doc_get_uid(index, &hits->doc(i),
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen &uid) < 0) {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen ret = -1;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen break;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen }
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen int32_t del_id = -1;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (uid > index->last_uid) {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (index->last_uid_doc_id >= 0)
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen del_id = index->last_uid_doc_id;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->last_uid = uid;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->last_uid_doc_id = hits->id(i);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen } else {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen del_id = hits->id(i);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen }
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen /*if (del_id >= 0)
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen index->reader->deleteDocument(del_id);*/
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen }
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen _CLDELETE(hits);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen } catch (CLuceneError &err) {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen i_error("lucene: last_uid search failed: %s", err.what());
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen ret = -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen return ret;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenint lucene_index_build_init(struct lucene_index *index, uint32_t *last_uid_r)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen uint32_t last_uid = 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen i_assert(index->mailbox_name != NULL);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen lucene_index_close(index);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (lucene_index_open(index) < 0)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen if (index->reader == NULL) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->last_uid = 0;
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen index->last_uid_doc_id = -1;
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen } else {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (lucene_index_get_last_uid(index) < 0)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen *last_uid_r = index->last_uid;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (index->writer != NULL)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen bool exists = IndexReader::indexExists(index->path);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->analyzer = _CLNEW DovecotAnalyzer();
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen try {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->writer = _CLNEW IndexWriter(index->path,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->analyzer, !exists);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen } catch (CLuceneError &err) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_error("lucene: IndexWriter(%s) failed: %s",
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->path, err.what());
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen index->writer->setMaxFieldLength(MAX_TERMS_PER_DOCUMENT);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstatic unsigned int utf8_strlen_n(const void *datap, size_t size)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen const unsigned char *data = (const unsigned char *)datap;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen const unsigned char *end = data + size;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen unsigned int skip, len = 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen size_t i;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen for (i = 0; i < size && data[i] != '\0'; ) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i += utf8_skip_table[data[i] & 0xff];
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_assert(i <= size);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen len++;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return len;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenstatic int lucene_index_build_flush(struct lucene_index *index)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen int ret = 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (index->doc == NULL)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen try {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->writer->addDocument(index->doc);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen } catch (CLuceneError &err) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_error("lucene: IndexWriter::addDocument(%s) failed: %s",
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->path, err.what());
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen ret = -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen _CLDELETE(index->doc);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->doc = NULL;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return ret;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenint lucene_index_build_more(struct lucene_index *index, uint32_t uid,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen const unsigned char *data, size_t size)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen unsigned int len;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen char id[MAX_INT_STRLEN];
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_assert(uid > index->last_uid);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_assert(size > 0);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen len = utf8_strlen_n(data, size);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen wchar_t dest[len+1];
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen lucene_utf8towcs(dest, (const char *)data, len + 1);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (uid != index->prev_uid) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen char id[MAX_INT_STRLEN];
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen TCHAR tid[MAX_INT_STRLEN];
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (lucene_index_build_flush(index) < 0)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->prev_uid = uid;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->doc = _CLNEW Document();
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_snprintf(id, sizeof(id), "%u", uid);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen STRCPY_AtoT(tid, id, MAX_INT_STRLEN);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->doc->add(*Field::Text(_T("uid"), tid));
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->doc->add(*Field::Text(_T("box"), index->tmailbox_name));
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->doc->add(*Field::Text(_T("contents"), dest));
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->writer->addDocument(index->doc);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainenstatic int lucene_index_update_last_uid(struct lucene_index *index)
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen{
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen Document doc;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen char id[MAX_INT_STRLEN];
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen TCHAR tid[MAX_INT_STRLEN];
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen i_snprintf(id, sizeof(id), "%u", index->last_uid);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen STRCPY_AtoT(tid, id, MAX_INT_STRLEN);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen doc.add(*Field::Text(_T("last_uid"), _T("1")));
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen doc.add(*Field::Text(_T("uid"), tid));
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen doc.add(*Field::Text(_T("box"), index->tmailbox_name));
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen try {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (index->last_uid_doc_id >= 0) {
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen //index->reader->deleteDocument(index->last_uid_doc_id);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->last_uid_doc_id = -1;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen }
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen } catch (CLuceneError &err) {
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen i_error("lucene: IndexWriter::deleteDocument(%s) failed: %s",
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen index->path, err.what());
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen return -1;
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen }
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen try {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->writer->addDocument(&doc);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen return 0;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen } catch (CLuceneError &err) {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen i_error("lucene: IndexWriter::addDocument(%s) failed: %s",
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->path, err.what());
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen return -1;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen }
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen}
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenint lucene_index_build_deinit(struct lucene_index *index)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen int ret = 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen if (index->prev_uid == 0) {
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen /* no changes. */
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen return 0;
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen }
dce232dfbb2244555299dffb3618a4724748d260Timo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (index->prev_uid > index->last_uid)
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->last_uid = index->prev_uid;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->prev_uid = 0;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (index->writer == NULL) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen lucene_index_close(index);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (lucene_index_build_flush(index) < 0)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen ret = -1;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen if (lucene_index_update_last_uid(index) < 0)
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen ret = -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen try {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->writer->optimize();
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen } catch (CLuceneError &err) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_error("lucene: IndexWriter::optimize(%s) failed: %s",
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->path, err.what());
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen ret = -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen try {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->writer->close();
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen } catch (CLuceneError &err) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_error("lucene: IndexWriter::close(%s) failed: %s",
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->path, err.what());
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen ret = -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen lucene_index_close(index);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return ret;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenint lucene_index_lookup(struct lucene_index *index, const char *key,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen ARRAY_TYPE(seq_range) *result)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen const char *quoted_key;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen int ret = 0;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (lucene_index_open_search(index) <= 0)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen t_push();
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen quoted_key = strchr(key, ' ') == NULL ?
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen t_strdup_printf("%s*", key) :
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen t_strdup_printf("\"%s\"", key);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen unsigned int len = utf8_strlen_n(quoted_key, (size_t)-1);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen wchar_t tkey[len + 1];
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen lucene_utf8towcs(tkey, quoted_key, len + 1);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen t_pop();
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen Query *content_query = NULL;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen try {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen content_query = QueryParser::parse(tkey, _T("contents"),
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen index->analyzer);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen } catch (CLuceneError &err) {
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen if (getenv("DEBUG") != NULL) {
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen i_info("lucene: QueryParser::parse(%s) failed: %s",
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen str_sanitize(key, 40), err.what());
33502e55a9bf4cafcd184ca9b114c126e420f856Timo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen lucene_index_close(index);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen BooleanQuery query;
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen Term mailbox_term(_T("box"), index->tmailbox_name);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen TermQuery mailbox_query(&mailbox_term);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen query.add(content_query, true, false);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen query.add(&mailbox_query, true, false);
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen try {
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen Hits *hits = index->searcher->search(&query);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen for (int32_t i = 0; i < hits->length(); i++) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen uint32_t uid;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen if (lucene_doc_get_uid(index, &hits->doc(i),
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen &uid) < 0) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen ret = -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen break;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen seq_range_array_add(result, 0, uid);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen _CLDELETE(hits);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen } catch (CLuceneError &err) {
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen i_error("lucene: search(%s) failed: %s",
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen index->path, err.what());
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen ret = -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen }
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
6380f2bc729a03b328793e8ad6ba7587620fa184Timo Sirainen _CLDELETE(content_query);
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return ret;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainenint lucene_index_filter(struct lucene_index *index, const char *key,
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen ARRAY_TYPE(seq_range) *result)
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen{
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen /* FIXME: implement */
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen return -1;
57f4445a46726a17bfe78b0964dd301a6ccb40ecTimo Sirainen}