cn.edu.thss.iise.beehivez.server.index.petrinetindex.taskedgeindex.TaskEdgeLuceneIndex.java Source code

Java tutorial

Introduction

Here is the source code for cn.edu.thss.iise.beehivez.server.index.petrinetindex.taskedgeindex.TaskEdgeLuceneIndex.java

Source

/**
 * BeehiveZ is a business process model and instance management system.
 * Copyright (C) 2011  
 * Institute of Information System and Engineering, School of Software, Tsinghua University,
 * Beijing, China
 *
 * Contact: jintao05@gmail.com 
 *
 * This program is a free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation with the version of 2.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package cn.edu.thss.iise.beehivez.server.index.petrinetindex.taskedgeindex;

import java.io.File;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.FSDirectory;
import org.processmining.framework.models.petrinet.PetriNet;
import org.processmining.framework.models.petrinet.Transition;

import cn.edu.thss.iise.beehivez.server.datamanagement.DataManager;
import cn.edu.thss.iise.beehivez.server.datamanagement.pojo.PetrinetObject;
import cn.edu.thss.iise.beehivez.server.index.ProcessQueryResult;
import cn.edu.thss.iise.beehivez.server.index.labelindex.LabelLuceneIndex;
import cn.edu.thss.iise.beehivez.server.index.labelindex.SimilarLabelQueryResult;
import cn.edu.thss.iise.beehivez.server.index.luceneindex.analyzer.SemicolonAnalyzer;
import cn.edu.thss.iise.beehivez.server.index.petrinetindex.PetriNetIndex;
import cn.edu.thss.iise.beehivez.server.metric.mcessimilarity.TaskLine4PetriNet;
import cn.edu.thss.iise.beehivez.server.parameter.GlobalParameter;
import cn.edu.thss.iise.beehivez.server.util.FileUtil;
import cn.edu.thss.iise.beehivez.server.util.PetriNetUtil;

/**
 * use MCES-based similarity to measure the similarity between Petri nets based
 * on structure. use lucene to store the relations between task edges and Petri
 * nets.
 * 
 * @author Tao Jin
 * 
 * @date 2011-3-20
 * 
 */
public class TaskEdgeLuceneIndex extends PetriNetIndex {

    private static final String indexDirectory = GlobalParameter.getHomeDirectory() + "/index/TaskEdgeLuceneIndex";
    private static final File INDEX_DIR = new File(indexDirectory);
    private static IndexWriter indexWriter = null;
    private LabelLuceneIndex labelIndex = new LabelLuceneIndex(indexDirectory);

    @Override
    public void addProcessModel(Object o) {
        PetrinetObject pno = (PetrinetObject) o;
        try {
            // get the object of petri net and process id
            PetriNet pn = pno.getPetriNet();
            if (pn == null) {
                pn = PetriNetUtil.getPetriNetFromPnmlBytes(pno.getPnml());
            }
            if (pn == null) {
                System.out.println("null petri net in addPetriNet of TARLuceneIndex");
                return;
            }

            Document doc = PetriNetTaskEdgesDocument.Document(pn, pno.getProcess_id());
            indexWriter.addDocument(doc);
            indexWriter.commit();

            // update the label index
            for (Transition t : pn.getTransitions()) {
                labelIndex.addLabel(t.getIdentifier().trim());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void close() {
        try {
            if (indexWriter != null) {
                indexWriter.optimize();
                indexWriter.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        labelIndex.close();
    }

    @Override
    public boolean create() {
        try {
            if (indexWriter != null) {
                indexWriter.close();
            }
            indexWriter = new IndexWriter(FSDirectory.open(INDEX_DIR), new SemicolonAnalyzer(), true,
                    IndexWriter.MaxFieldLength.UNLIMITED);

            labelIndex.create();
            // labelIndex.addLabel("null");

            DataManager dm = DataManager.getInstance();
            int limit = dm.getPageSize();
            ResultSet rs = dm.executeSelectSQL("select process_id from petrinet order by process_id", 0,
                    Integer.MAX_VALUE, dm.getFetchSize());
            while (rs.next()) {
                PetrinetObject pno = new PetrinetObject();

                long process_id = rs.getLong("process_id");
                pno.setProcess_id(process_id);

                PetriNet pn = dm.getProcessPetriNet(process_id);
                pno.setPetriNet(pn);

                this.addProcessModel(pno);
                pn.destroyPetriNet();
            }
            Statement stmt = rs.getStatement();
            rs.close();
            stmt.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        return true;
    }

    @Override
    public void delProcessModel(Object pno) {
        System.out.println("need to be implemented");
    }

    @Override
    public boolean destroy() {
        close();
        FileUtil.deleteFile(indexDirectory);
        return true;
    }

    @Override
    public TreeSet<ProcessQueryResult> getProcessModels(Object o, float similarity) {

        TreeSet<ProcessQueryResult> ret = new TreeSet<ProcessQueryResult>();

        try {
            if (o instanceof PetriNet) {
                PetriNet pn = (PetriNet) o;

                IndexReader reader = IndexReader.open(FSDirectory.open(INDEX_DIR), true);
                Searcher searcher = new IndexSearcher(reader);
                BooleanQuery bq = new BooleanQuery();
                bq.setMaxClauseCount(Integer.MAX_VALUE);

                // make it sure that every queryterm is unique
                HashSet<String> expandedTaskEdges = new HashSet();

                // expand the query task edges with their similar ones
                HashSet<HashSet<String>> exQueryTaskEdges = new HashSet<HashSet<String>>();

                // calculate the task edges of query Petri net
                ArrayList<TaskLine4PetriNet> tls = TaskLine4PetriNet.getAllTaskLinesOfPetriNet(pn);

                if (GlobalParameter.isEnableSimilarLabel()) {
                    // label similarity is enabled
                    for (TaskLine4PetriNet tl : tls) {
                        String taskEdgeString = tl.getSrcTransition().getIdentifier().trim()
                                + PetriNetTaskEdgesDocument.TASKEDGECONNECTOR
                                + tl.getDestTransition().getIdentifier().trim();

                        HashSet<String> similarTaskEdges = new HashSet<String>();

                        TreeSet<SimilarLabelQueryResult> pres = labelIndex.getSimilarLabels(
                                tl.getSrcTransition().getIdentifier().trim(),
                                GlobalParameter.getLabelSemanticSimilarity());

                        TreeSet<SimilarLabelQueryResult> sucs = labelIndex.getSimilarLabels(
                                tl.getDestTransition().getIdentifier().trim(),
                                GlobalParameter.getLabelSemanticSimilarity());

                        Iterator<SimilarLabelQueryResult> itPre = pres.iterator();
                        while (itPre.hasNext()) {
                            String pre = itPre.next().getLabel();
                            Iterator<SimilarLabelQueryResult> itSuc = sucs.iterator();
                            while (itSuc.hasNext()) {
                                String suc = itSuc.next().getLabel();
                                String taskEdge = pre + PetriNetTaskEdgesDocument.TASKEDGECONNECTOR + suc;
                                if (similarTaskEdges.add(taskEdge)) {
                                    if (expandedTaskEdges.add(taskEdge)) {
                                        Term term = new Term(PetriNetTaskEdgesDocument.FIELDTASKEDGES, taskEdge);
                                        TermQuery termQuery = new TermQuery(term);
                                        bq.add(termQuery, Occur.SHOULD);
                                    }
                                }
                            }
                        }

                        if (similarTaskEdges.size() == 0) {
                            similarTaskEdges.add(taskEdgeString);
                        }
                        exQueryTaskEdges.add(similarTaskEdges);
                    }
                } else {
                    // label similarity is not enabled
                    for (TaskLine4PetriNet tl : tls) {
                        String taskEdgeString = tl.getSrcTransition().getIdentifier().trim()
                                + PetriNetTaskEdgesDocument.TASKEDGECONNECTOR
                                + tl.getDestTransition().getIdentifier().trim();

                        HashSet<String> similarTaskEdges = new HashSet<String>();
                        similarTaskEdges.add(taskEdgeString);

                        if (expandedTaskEdges.add(taskEdgeString)) {
                            Term term = new Term(PetriNetTaskEdgesDocument.FIELDTASKEDGES, taskEdgeString);
                            TermQuery termQuery = new TermQuery(term);
                            bq.add(termQuery, Occur.SHOULD);
                        }
                        exQueryTaskEdges.add(similarTaskEdges);
                    }
                }

                TaskEdgesQueryResultCollector collector = new TaskEdgesQueryResultCollector(reader,
                        exQueryTaskEdges, similarity);
                searcher.search(bq, collector);
                TreeSet<ProcessQueryResult> temp = collector.getQueryResult();
                searcher.close();
                reader.close();

                // verify the candidate model
                Iterator<ProcessQueryResult> it = temp.iterator();
                while (it.hasNext()) {
                    ProcessQueryResult pqr = it.next();
                    long id = pqr.getProcess_id();
                    DataManager dm = DataManager.getInstance();
                    PetriNet c = dm.getProcessPetriNet(id);
                    float mcesSimilarity = PetriNetUtil.mcesSimilarity(c, pn);
                    if (mcesSimilarity >= similarity) {
                        ret.add(new ProcessQueryResult(id, mcesSimilarity));
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;
    }

    @Override
    public float getStorageSizeInMB() {
        return FileUtil.getFileSizeInMB(indexDirectory);
    }

    @Override
    public boolean open() {
        try {
            if (indexWriter != null) {
                indexWriter.close();
            }
            indexWriter = new IndexWriter(FSDirectory.open(INDEX_DIR), new SemicolonAnalyzer(), false,
                    IndexWriter.MaxFieldLength.UNLIMITED);
            labelIndex.open();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public boolean supportGraphQuery() {
        return true;
    }

    @Override
    public boolean supportSimilarQuery() {
        return true;
    }

    @Override
    public boolean supportTextQuery() {
        return false;
    }

    @Override
    public boolean supportSimilarLabel() {
        return true;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

    }

}