Package in.partake.service.impl

Source Code of in.partake.service.impl.EventSearchService

package in.partake.service.impl;

import in.partake.base.TimeUtil;
import in.partake.base.Util;
import in.partake.model.dto.Event;
import in.partake.model.dto.EventTicket;
import in.partake.service.EventSearchServiceException;
import in.partake.service.IEventSearchService;

import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.Field.TermVector;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;

public class EventSearchService implements IEventSearchService {

    public EventSearchService() {
    }

    @Override
    public void initialize() throws EventSearchServiceException {
        LuceneService.initialize();
    }

    @Override
    public void cleanUp() throws EventSearchServiceException {
        LuceneService.destroy();
    }

    @Override
    public void create(Event event, List<EventTicket> tickets) throws EventSearchServiceException {
        Document doc = makeDocument(event, tickets);
        LuceneService.get().addDocument(doc);
    }

    @Override
    public boolean hasIndexed(String eventId) throws EventSearchServiceException {
        return LuceneService.get().hasDocument(eventId);
    }

    @Override
    public void remove(String eventId) throws EventSearchServiceException{
        LuceneService.get().removeDocument(eventId);
    }

    @Override
    public void update(Event event, List<EventTicket> tickets) throws EventSearchServiceException {
        Document doc = makeDocument(event, tickets);
        LuceneService.get().updateDocument(doc);
    }

    @Override
    public void truncate() throws EventSearchServiceException {
        LuceneService.get().truncate();
    }

    @Override
    public List<String> getUpcomingByCategory(String category, int maxDocument) throws EventSearchServiceException {
        try {
            TopDocs docs = LuceneService.get().search("", category, "beginDate", true, maxDocument);
            return convertToIds(docs, 0);
        } catch (ParseException e) {
            assert false;
            throw new EventSearchServiceException(e);
        }
    }

    @Override
    public List<String> getRecent(int maxDocument) throws EventSearchServiceException {
        TopDocs docs = LuceneService.get().getRecentDocuments(maxDocument);
        return convertToIds(docs, 0);
    }

    @Override
    public List<String> getRecentByCategory(String category, int maxDocument) throws EventSearchServiceException {
        TopDocs docs = LuceneService.get().getRecentCategoryDocuments(category, maxDocument);
        return convertToIds(docs, 0);
    }

    @Override
    public List<String> search(String term, String category, String sortOrder, boolean beforeDeadlineOnly, int offset, int limit) throws EventSearchServiceException {
        try {
            TopDocs docs = LuceneService.get().search(term, category, sortOrder, beforeDeadlineOnly, offset + limit);
            return convertToIds(docs, offset);
        } catch (ParseException e) {
            throw new EventSearchServiceException(e);
        }
    }


    @Override
    public List<String> search(String term, String category, String sortOrder, boolean beforeDeadlineOnly, int maxDocument) throws EventSearchServiceException {
        try {
            TopDocs docs = LuceneService.get().search(term, category, sortOrder, beforeDeadlineOnly, maxDocument);
            return convertToIds(docs, 0);
        } catch (ParseException e) {
            assert false;
            throw new EventSearchServiceException(e);
        }
    }

    private List<String> convertToIds(TopDocs docs, int offset) throws EventSearchServiceException {
        List<String> eventIds = new ArrayList<String>();

        for (int i = offset; i < docs.scoreDocs.length; ++i) {
            ScoreDoc doc = docs.scoreDocs[i];
            Document document = LuceneService.get().getDocument(doc.doc);
            String id = document.get("ID");
            if (id == null)
                continue;

            eventIds.add(id);
        }

        return eventIds;
    }

    /**
     * create a lucene document from eventId and event.
     */
    private Document makeDocument(Event event, List<EventTicket> tickets) {
        StringBuilder builder = new StringBuilder();
        builder.append(event.getTitle()).append(" ");
        builder.append(event.getSummary()).append(" ");
        builder.append(event.getAddress()).append(" ");
        builder.append(event.getPlace()).append(" ");
        builder.append(Util.removeTags(event.getDescription()));

        long beginTime = event.getBeginDate().getTime();
        long deadlineTime = event.acceptsSomeTicketsTill(tickets).getTime();

        Document doc = new Document();
        doc.add(new Field("ID", event.getId(), Store.YES, Index.NOT_ANALYZED));
        doc.add(new Field("CATEGORY", event.getCategory(), Store.NO, Index.NOT_ANALYZED, TermVector.WITH_POSITIONS));
        doc.add(new Field("CREATED-AT", TimeUtil.getTimeString(event.getCreatedAt().getTime()), Store.NO, Index.NOT_ANALYZED));
        doc.add(new Field("BEGIN-TIME", TimeUtil.getTimeString(beginTime), Store.NO, Index.NOT_ANALYZED));
        doc.add(new Field("DEADLINE-TIME", TimeUtil.getTimeString(deadlineTime), Store.NO, Index.NOT_ANALYZED));
        doc.add(new Field("TITLE", event.getTitle(), Store.NO, Index.ANALYZED, TermVector.WITH_POSITIONS));
        doc.add(new Field("CONTENT", builder.toString(), Store.NO, Index.ANALYZED, TermVector.WITH_POSITIONS));

        return doc;
    }

}
TOP

Related Classes of in.partake.service.impl.EventSearchService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.