帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

209 lines
7.6 KiB

package com.fr.design.mainframe.alphafine.search.manager.impl;
import com.fr.design.actions.UpdateAction;
import com.fr.design.actions.help.alphafine.AlphaFineConstants;
import com.fr.design.mainframe.alphafine.CellType;
import com.fr.design.mainframe.alphafine.cell.CellModelHelper;
import com.fr.design.mainframe.alphafine.cell.model.ActionModel;
import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel;
import com.fr.design.mainframe.alphafine.cell.model.MoreModel;
import com.fr.design.mainframe.alphafine.model.SearchResult;
import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider;
import com.fr.design.mainframe.toolbar.UpdateActionManager;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fanruan.product.ProductConstants;
import com.fr.third.org.apache.lucene.analysis.Analyzer;
import com.fr.third.org.apache.lucene.analysis.standard.StandardAnalyzer;
import com.fr.third.org.apache.lucene.document.Document;
import com.fr.third.org.apache.lucene.document.Field;
import com.fr.third.org.apache.lucene.document.LongField;
import com.fr.third.org.apache.lucene.document.StringField;
import com.fr.third.org.apache.lucene.index.DirectoryReader;
import com.fr.third.org.apache.lucene.index.IndexReader;
import com.fr.third.org.apache.lucene.index.IndexWriter;
import com.fr.third.org.apache.lucene.index.IndexWriterConfig;
import com.fr.third.org.apache.lucene.index.Term;
import com.fr.third.org.apache.lucene.search.IndexSearcher;
import com.fr.third.org.apache.lucene.search.Query;
import com.fr.third.org.apache.lucene.search.ScoreDoc;
import com.fr.third.org.apache.lucene.search.Sort;
import com.fr.third.org.apache.lucene.search.SortField;
import com.fr.third.org.apache.lucene.search.TermQuery;
import com.fr.third.org.apache.lucene.search.TopFieldDocs;
import com.fr.third.org.apache.lucene.store.Directory;
import com.fr.third.org.apache.lucene.store.FSDirectory;
import com.fr.third.org.apache.lucene.util.Version;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* Created by XiaXiang on 2018/1/22.
*/
public class RecentSearchManager implements AlphaFineSearchProvider {
private static final int MAX_SIZE = 100;
private static final RecentSearchManager INSTANCE = new RecentSearchManager();
private IndexReader indexReader = null;
//索引存储路径
private String path = ProductConstants.getEnvHome() + File.separator + "searchIndex";
//分词器,暂时先用这个
private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
// 存储目录
private Directory directory = null;
private IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);
private IndexWriter indexWriter = null;
private SearchResult recentModelList = new SearchResult();
public static RecentSearchManager getInstance() {
return INSTANCE;
}
@Override
public SearchResult getLessSearchResult(String[] searchText) {
this.recentModelList = new SearchResult();
SearchResult modelList = new SearchResult();
for (String aSearchText : searchText) {
addToRecentModelList(aSearchText);
}
if (recentModelList != null && recentModelList.size() > 0) {
modelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Latest")));
if (recentModelList.size() > AlphaFineConstants.LATEST_SHOW_SIZE) {
modelList.addAll(recentModelList.subList(0, AlphaFineConstants.LATEST_SHOW_SIZE));
} else {
modelList.addAll(recentModelList);
}
}
return modelList;
}
@Override
public SearchResult getMoreSearchResult(String searchText) {
return new SearchResult();
}
/**
* 将单次遍历的关键词的搜索结果添加到结果集中
* @param searchText
*/
private synchronized void addToRecentModelList(String searchText) {
searchBySort(searchText);
}
public List<AlphaCellModel> getRecentModelList() {
return recentModelList;
}
/**
* 初始化indexWriter
*/
private void initWriter() {
try {
directory = FSDirectory.open(new File(path));
indexWriter = new IndexWriter(directory, config);
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
/**
* 初始化indexReader
*/
private void initReader() {
try {
if(indexWriter == null){
directory = FSDirectory.open(new File(path));
}else{
indexWriter.close();
}
indexReader = DirectoryReader.open(directory);
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
/**
* 添加模型
*
*/
public void addModel(String searchKey, AlphaCellModel cellModel) {
if(cellModel == null){
return;
}
try {
initWriter();
Document doc = new Document();
doc.add(new StringField("searchKey", searchKey, Field.Store.YES));
doc.add(new StringField("cellModel", cellModel.modelToJson().toString(), Field.Store.YES));
doc.add(new LongField("time", System.currentTimeMillis(), Field.Store.YES));
writeDoc(doc);
} catch (JSONException e) {
FineLoggerFactory.getLogger().error("add document error: " + e.getMessage());
}
}
/**
* 写文档,建立索引
*/
private void writeDoc(Document doc) {
try {
indexWriter.addDocument(doc);
indexWriter.commit();
indexWriter.close();
} catch (IOException e) {
FineLoggerFactory.getLogger().error("write document error: " + e.getMessage());
}
}
/**
* 按序搜索
*/
private synchronized SearchResult searchBySort(String key) {
try {
initReader();
IndexSearcher searcher = new IndexSearcher(indexReader);
//构建排序字段
SortField[] sortField = new SortField[1];
sortField[0] = new SortField("time", SortField.Type.LONG, true);
Sort sortKey = new Sort(sortField);
String searchField = "searchKey";
Term term = new Term(searchField, key);
Query query = new TermQuery(term);
TopFieldDocs docs = searcher.search(query, MAX_SIZE, sortKey);
ScoreDoc[] scores = docs.scoreDocs;
//遍历结果
for (ScoreDoc scoreDoc : scores) {
Document document = searcher.doc(scoreDoc.doc);
AlphaCellModel model = CellModelHelper.getModelFromJson(new JSONObject(document.get("cellModel")));
if (model.getType() == CellType.ACTION) {
UpdateAction action = UpdateActionManager.getUpdateActionManager().getActionByName(model.getName());
if (action != null) {
((ActionModel) model).setAction(action);
addModel(model);
}
} else {
addModel(model);
}
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error("local search error: " + e.getMessage());
return recentModelList;
}
return recentModelList;
}
private void addModel(AlphaCellModel model) {
if (!recentModelList.contains(model)) {
recentModelList.add(model);
}
}
}