package org.fastcatsearch.ir.dictionary; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.fastcatsearch.db.dao.DictionaryDAO; import org.fastcatsearch.plugin.analysis.AnalysisPluginSetting.ColumnSetting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DAOSourceDictionaryCompiler { protected static final Logger logger = LoggerFactory.getLogger(DAOSourceDictionaryCompiler.class); private static final int BULK_SIZE = 80000; /* * 컴파일된 엔트리 갯수를 반환한다. * */ public static int compile(File targetFile, DictionaryDAO dictionaryDAO, SourceDictionary dictionaryType, List<ColumnSetting> columnList) throws Exception { int count = dictionaryDAO.getCount(null); int start = 1; String keyColumnName = null; List<String> valueColumnNames = new ArrayList<String>(); List<ColumnSetting> columnSettingList = new ArrayList<ColumnSetting>(); // key는 설정안해도 무조건 isCompilable이다. for (int i = 0; i < columnList.size(); i++) { ColumnSetting columnSetting = columnList.get(i); if (columnSetting.isCompilable() && !columnSetting.isKey()) { valueColumnNames.add(columnSetting.getName().toUpperCase()); columnSettingList.add(columnSetting); } if (columnSetting.isKey()) { keyColumnName = columnSetting.getName().toUpperCase(); } } //synoym_2way처리를 위해 주석처리 swsong 2013-12-16 // boolean isKeyNullable = dictionaryType instanceof SynonymDictionary; // if(!isKeyNullable && keyColumnName == null){ // throw new Exception("Key column is not specified."); // } while (start <= count) { int end = start + BULK_SIZE; List<Map<String, Object>> result = dictionaryDAO.getEntryList(start, end, null, null); for (int i = 0; i < result.size(); i++) { Map<String, Object> vo = result.get(i); Object[] values = new Object[valueColumnNames.size()]; String key = null; if(keyColumnName != null){ key = vo.get(keyColumnName).toString().trim(); } for (int j = 0; j < valueColumnNames.size(); j++) { String columnName = valueColumnNames.get(j); values[j] = vo.get(columnName); } dictionaryType.addEntry(key, values, columnSettingList); } if (result.size() < BULK_SIZE) { // 다 읽어온 것임. break; } start += BULK_SIZE; } OutputStream out = null; try { out = new FileOutputStream(targetFile); dictionaryType.writeTo(out); } finally { if (out != null) { try { out.close(); } catch (IOException ignore) { } } } return count; } }