1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/* 259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012 OMRON SOFTWARE Co., Ltd. 3053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 4053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * you may not use this file except in compliance with the License. 6053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * You may obtain a copy of the License at 7053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 8053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 10053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * See the License for the specific language governing permissions and 14053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * limitations under the License. 15053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 16053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 17053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpackage jp.co.omronsoft.openwnn; 18053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 19053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.ContentValues; 20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.database.DatabaseUtils; 21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.database.SQLException; 22053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.database.sqlite.SQLiteCursor; 23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.database.sqlite.SQLiteDatabase; 24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.util.Log; 26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/** 283feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * The implementation class of WnnDictionary interface (JNI wrapper class). 29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 303feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @author Copyright (C) 2008, 2009 OMRON SOFTWARE CO., LTD. All Rights Reserved. 31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpublic class OpenWnnDictionaryImpl implements WnnDictionary { 3377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* 3477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * DEFINITION FOR JNI 3577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 3677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa static { 3777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* Load the dictionary search library */ 3877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa System.loadLibrary( "wnndict" ); 3977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 4077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 4177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* 4277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * DEFINITION OF CONSTANTS 4377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 4477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** The maximum length of stroke */ 45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public static final int MAX_STROKE_LENGTH = 50; 4677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** The maximum length of candidate */ 47053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public static final int MAX_CANDIDATE_LENGTH = 50; 4877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** The table name of writable dictionary on the database */ 4977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa protected static final String TABLE_NAME_DIC = "dic"; 5077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** The type name of user word */ 51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final int TYPE_NAME_USER = 0; 5277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** The type name of learn word */ 53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final int TYPE_NAME_LEARN = 1; 54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 55053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_ID = "rowid"; 57053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_TYPE = "type"; 59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_STROKE = "stroke"; 61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_CANDIDATE = "candidate"; 63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_POS_LEFT = "posLeft"; 65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_POS_RIGHT = "posRight"; 67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_PREVIOUS_STROKE = "prevStroke"; 69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_PREVIOUS_CANDIDATE = "prevCandidate"; 71053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 72053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_PREVIOUS_POS_LEFT = "prevPosLeft"; 73053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The column name of database */ 74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String COLUMN_NAME_PREVIOUS_POS_RIGHT = "prevPosRight"; 75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 76053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Query for normal search */ 77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String NORMAL_QUERY = 78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project "select distinct " + COLUMN_NAME_STROKE + "," + 79053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_CANDIDATE + "," + 80053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_POS_LEFT + "," + 81053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_POS_RIGHT + "," + 82053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_TYPE + 83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project " from " + TABLE_NAME_DIC + " where %s order by " + 84053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_TYPE + " DESC, %s"; 85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 86053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Query for link search */ 87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final String LINK_QUERY = 88053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project "select distinct " + COLUMN_NAME_STROKE + "," + 89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_CANDIDATE + "," + 90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_POS_LEFT + "," + 91053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_POS_RIGHT + "," + 92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_TYPE + 93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project " from " + TABLE_NAME_DIC + " where %s = ? and %s = ? and %s order by " + 94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_TYPE + " DESC, %s"; 95053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 96053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The max words of user dictionary */ 97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final int MAX_WORDS_IN_USER_DICTIONARY = 100; 98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The max words of learning dictionary */ 99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final int MAX_WORDS_IN_LEARN_DICTIONARY = 2000; 100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The base frequency of user dictionary */ 102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final int OFFSET_FREQUENCY_OF_USER_DICTIONARY = 1000; 103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The base frequency of learning dictionary */ 104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected static final int OFFSET_FREQUENCY_OF_LEARN_DICTIONARY = 2000; 105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* 107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Constants to define the upper limit of query. 10877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 10977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * That is used to fix the size of query expression. 11077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * If the number of approximate patterns for a character is exceeded MAX_PATTERN_OF_APPROX, 11177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * increase that constant to the maximum number of patterns. 112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Constants to define the upper limit of approximate patterns */ 114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected final static int MAX_PATTERN_OF_APPROX = 6; 115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** Constants to define the upper limit of length of a query */ 116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected final static int MAX_LENGTH_OF_QUERY = 50; 117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Constants to define the turn around time of query. 119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * <br> 12077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * It can be set between 1 to {@code MAX_LENGTH_OF_QUERY}. If the length of query 12177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * string is shorter than {@code FAST_QUERY_LENGTH}, the simple search logic is applied. 12277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Therefore, the turn around time for short query string is fast so that it is short. 12377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * However, the difference of turn around time at the border length grows big. 12477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * the value should be fixed carefully. 125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected final static int FAST_QUERY_LENGTH = 20; 127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 12877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* 12977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * DEFINITION OF PRIVATE FIELD 13077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 13177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** Internal work area for the dictionary search library */ 13277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa protected long mWnnWork = 0; 133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 13477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** The file path of the writable dictionary */ 135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mDicFilePath = ""; 13677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** The writable dictionary object */ 137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected SQLiteDatabase mDbDic = null; 1383feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** The search cursor of the writable dictionary */ 139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected SQLiteCursor mDbCursor = null; 14059aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma /** The writable dictionary object Access helper */ 14159aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma protected OpenWnnSQLiteOpenHelper mDbOpenHelper = null; 1423feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** The number of queried items */ 143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected int mCountCursor = 0; 1443feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** The type of the search cursor object */ 145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected int mTypeOfQuery = -1; 146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mExactQuerySqlOrderByFreq; 149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mExactQuerySqlOrderByKey; 151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFullPrefixQuerySqlOrderByFreq; 154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFastPrefixQuerySqlOrderByFreq; 156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFullPrefixQuerySqlOrderByKey; 158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFastPrefixQuerySqlOrderByKey; 160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFullLinkQuerySqlOrderByFreq; 163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFastLinkQuerySqlOrderByFreq; 165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFullLinkQuerySqlOrderByKey; 167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The query base strings for query operation */ 168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFastLinkQuerySqlOrderByKey; 169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The string array used by query operation (for "selection") */ 171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mExactQueryArgs[] = new String[ 1 ]; 172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The string array used by query operation (for "selection") */ 173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFullQueryArgs[] = new String[ MAX_LENGTH_OF_QUERY * (MAX_PATTERN_OF_APPROX+1) ]; 174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** The string array used by query operation (for "selection") */ 175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected String mFastQueryArgs[] = new String[ FAST_QUERY_LENGTH * (MAX_PATTERN_OF_APPROX+1) ]; 176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1773feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** The Frequency offset of user dictionary */ 178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected int mFrequencyOffsetOfUserDictionary = -1; 1793feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa /** The Frequency offset of learn dictionary */ 180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected int mFrequencyOffsetOfLearnDictionary = -1; 181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 18277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* 18377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * DEFINITION OF METHODS 18477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 18577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 18677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * The constructor of this class without writable dictionary. 18777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 18877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Create a internal work area for the search engine. It is allocated for each object. 189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 19077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param dicLibPath The dictionary library file path 19177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 19277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public OpenWnnDictionaryImpl( String dicLibPath ) { 193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project this( dicLibPath, null ); 19477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 19677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 19777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * The constructor of this class with writable dictionary. 19877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * 19977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Create a internal work area and the writable dictionary for the search engine. It is allocated for each object. 200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 20177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param dicLibPath The dictionary library file path 20277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param dicFilePath The path name of writable dictionary 20377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 20477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public OpenWnnDictionaryImpl( String dicLibPath, String dicFilePath ) { 205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Create the internal work area */ 20677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa this.mWnnWork = OpenWnnDictionaryImplJni.createWnnWork( dicLibPath ); 207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( this.mWnnWork != 0 && dicFilePath != null ) { 209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Create query base strings */ 210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String queryFullBaseString = 211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project OpenWnnDictionaryImplJni.createQueryStringBase( 212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project this.mWnnWork, 213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project MAX_LENGTH_OF_QUERY, 214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project MAX_PATTERN_OF_APPROX, 215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_STROKE ); 216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String queryFastBaseString = 218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project OpenWnnDictionaryImplJni.createQueryStringBase( 219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project this.mWnnWork, 220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project FAST_QUERY_LENGTH, 221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project MAX_PATTERN_OF_APPROX, 222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_STROKE ); 223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mExactQuerySqlOrderByFreq = String.format( 226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NORMAL_QUERY, 227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String.format( "%s=?", COLUMN_NAME_STROKE ), String.format( "%s DESC", COLUMN_NAME_ID ) ); 228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mExactQuerySqlOrderByKey = String.format( 230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NORMAL_QUERY, 231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String.format( "%s=?", COLUMN_NAME_STROKE ), COLUMN_NAME_STROKE ); 232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFullPrefixQuerySqlOrderByFreq = String.format( 235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NORMAL_QUERY, 236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryFullBaseString, String.format( "%s DESC", COLUMN_NAME_ID ) ); 237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFastPrefixQuerySqlOrderByFreq = String.format( 239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NORMAL_QUERY, 240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryFastBaseString, String.format( "%s DESC", COLUMN_NAME_ID ) ); 241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFullPrefixQuerySqlOrderByKey = String.format( 243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NORMAL_QUERY, 244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryFullBaseString, COLUMN_NAME_STROKE ); 245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFastPrefixQuerySqlOrderByKey = String.format( 247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project NORMAL_QUERY, 248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryFastBaseString, COLUMN_NAME_STROKE ); 249053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFullLinkQuerySqlOrderByFreq = String.format( 252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project LINK_QUERY, COLUMN_NAME_PREVIOUS_STROKE, COLUMN_NAME_PREVIOUS_CANDIDATE, 253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryFullBaseString, String.format( "%s DESC", COLUMN_NAME_ID ) ); 254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFastLinkQuerySqlOrderByFreq = String.format( 256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project LINK_QUERY, COLUMN_NAME_PREVIOUS_STROKE, COLUMN_NAME_PREVIOUS_CANDIDATE, 257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryFastBaseString, String.format( "%s DESC", COLUMN_NAME_ID ) ); 258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFullLinkQuerySqlOrderByKey = String.format( 260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project LINK_QUERY, COLUMN_NAME_PREVIOUS_STROKE, COLUMN_NAME_PREVIOUS_CANDIDATE, 261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryFullBaseString, COLUMN_NAME_STROKE ); 262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFastLinkQuerySqlOrderByKey = String.format( 264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project LINK_QUERY, COLUMN_NAME_PREVIOUS_STROKE, COLUMN_NAME_PREVIOUS_CANDIDATE, 265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryFastBaseString, COLUMN_NAME_STROKE ); 266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 26977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* Create the database object */ 270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDicFilePath = dicFilePath; 271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project setInUseState( true ); 272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 27377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* Create the table if not exist */ 27477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa createDictionaryTable( TABLE_NAME_DIC ); 275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } catch( SQLException e ) { 276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 27877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 27977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 28077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 28177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * The finalizer of this class. 28277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Destroy the internal work area for the search engine. 28377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 28477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa protected void finalize( ) { 28577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* Free the internal work area */ 28677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 ) { 28777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa OpenWnnDictionaryImplJni.freeWnnWork( this.mWnnWork ); 28877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa this.mWnnWork = 0; 289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project freeDatabase(); 29177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 29277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 29477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 29577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * Create the table of writable dictionary. 296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 2977b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa * @param tableName The name of table 298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected void createDictionaryTable( String tableName ) { 300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String sqlStr = "create table if not exists " + tableName + 301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project " (" + COLUMN_NAME_ID + " integer primary key autoincrement, " + 302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_TYPE + " integer, " + 303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_STROKE + " text, " + 304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_CANDIDATE + " text, " + 305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_POS_LEFT + " integer, " + 306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_POS_RIGHT + " integer, " + 307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_PREVIOUS_STROKE + " text, " + 308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_PREVIOUS_CANDIDATE + " text, " + 309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_PREVIOUS_POS_LEFT + " integer, " + 310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_PREVIOUS_POS_RIGHT + " integer)"; 311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbDic != null ) { 313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.execSQL( sqlStr ); 314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 31777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 3183feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * Free the {@link SQLiteDatabase} of writable dictionary. 319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected void freeDatabase( ) { 32177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa freeCursor(); 322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 32377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mDbDic != null ) { 324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* The SQLiteDataBase object must close() before releasing. */ 325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.close(); 326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic = null; 32759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mDbOpenHelper = null; 328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 33077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 3313feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * Free the {@link SQLiteCursor} of writable dictionary. 332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected void freeCursor( ) { 33477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mDbCursor != null) { 335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* The SQLiteCursor object must close() before releasing. */ 33677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbCursor.close(); 33777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbCursor = null; 338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mTypeOfQuery = -1; 34077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 34377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 34477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 34577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#setInUseState 34677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 34777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public boolean isActive() { 34877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return (this.mWnnWork != 0); 34977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 35077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 35177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 35277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#setInUseState 35377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public void setInUseState( boolean flag ) { 355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( flag ) { 356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbDic == null ) { 35759aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mDbOpenHelper = new OpenWnnSQLiteOpenHelper(OpenWnn.getCurrentIme(), mDicFilePath); 35859aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma mDbDic = mDbOpenHelper.getWritableDatabase(); 359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project freeDatabase(); 362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 36577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 36677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#clearDictionary 36777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 36877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public int clearDictionary( ) { 36977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 ) { 370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFrequencyOffsetOfUserDictionary = -1; 371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFrequencyOffsetOfLearnDictionary = -1; 372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 37377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return OpenWnnDictionaryImplJni.clearDictionaryParameters( this.mWnnWork ); 37477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 37577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return -1; 37677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 37777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 37977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 38077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#setDictionary 38177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public int setDictionary(int index, int base, int high ) { 38377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 ) { 38477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa switch( index ) { 38577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case WnnDictionary.INDEX_USER_DICTIONARY: 386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( base < 0 || high < 0 || base > high 387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* || base < OFFSET_FREQUENCY_OF_USER_DICTIONARY || high >= OFFSET_FREQUENCY_OF_LEARN_DICTIONARY */ ) { 388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFrequencyOffsetOfUserDictionary = -1; 389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFrequencyOffsetOfUserDictionary = high; 391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 39277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return 0; 39377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case WnnDictionary.INDEX_LEARN_DICTIONARY: 394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( base < 0 || high < 0 || base > high 395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* || base < OFFSET_FREQUENCY_OF_LEARN_DICTIONARY */ ) { 396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFrequencyOffsetOfLearnDictionary = -1; 397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFrequencyOffsetOfLearnDictionary = high; 399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 40077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return 0; 40177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa default: 402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return OpenWnnDictionaryImplJni.setDictionaryParameter( this.mWnnWork, index, base, high ); 40377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 40477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 40577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return -1; 40677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 40777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Query to the database 411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * 41277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param keyString The key string 4133feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param wnnWord The previous word for link search 4143feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * @param operation The search operation 41577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param order The type of sort order 416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 417053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project protected void createQuery( String keyString, WnnWord wnnWord, int operation, int order) { 418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int newTypeOfQuery, maxBindsOfQuery; 419053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String querySqlOrderByFreq, querySqlOrderByKey; 420053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String queryArgs[]; 421053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 422053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( operation != WnnDictionary.SEARCH_LINK ) { 423053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project wnnWord = null; 424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 425053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project switch( operation ) { 427053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case WnnDictionary.SEARCH_EXACT: 428053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project querySqlOrderByFreq = mExactQuerySqlOrderByFreq; 42977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa querySqlOrderByKey = mExactQuerySqlOrderByKey; 430053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project newTypeOfQuery = 0; 43177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa queryArgs = mExactQueryArgs; 432053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 433053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryArgs[ 0 ] = keyString; 434053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 435053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 436053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case WnnDictionary.SEARCH_PREFIX: 437053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project case WnnDictionary.SEARCH_LINK: 43877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* Select the suitable parameters for the query */ 43977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( keyString.length() <= FAST_QUERY_LENGTH ) { 440053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( wnnWord != null ) { 44177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa querySqlOrderByFreq = mFastLinkQuerySqlOrderByFreq; 44277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa querySqlOrderByKey = mFastLinkQuerySqlOrderByKey; 44377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa newTypeOfQuery = 1; 444053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 44577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa querySqlOrderByFreq = mFastPrefixQuerySqlOrderByFreq; 44677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa querySqlOrderByKey = mFastPrefixQuerySqlOrderByKey; 44777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa newTypeOfQuery = 2; 448053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 44977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa maxBindsOfQuery = FAST_QUERY_LENGTH; 45077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa queryArgs = mFastQueryArgs; 45177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 452053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( wnnWord != null ) { 45377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa querySqlOrderByFreq = mFullLinkQuerySqlOrderByFreq; 45477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa querySqlOrderByKey = mFullLinkQuerySqlOrderByKey; 45577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa newTypeOfQuery = 3; 456053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 45777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa querySqlOrderByFreq = mFullPrefixQuerySqlOrderByFreq; 45877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa querySqlOrderByKey = mFullPrefixQuerySqlOrderByKey; 45977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa newTypeOfQuery = 4; 460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 46177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa maxBindsOfQuery = MAX_LENGTH_OF_QUERY; 46277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa queryArgs = mFullQueryArgs; 46377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 464053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 465053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( wnnWord != null ) { 466053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If link search is enabled, insert information of the previous word */ 46777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa String[] queryArgsTemp = OpenWnnDictionaryImplJni.createBindArray( this.mWnnWork, keyString, maxBindsOfQuery, MAX_PATTERN_OF_APPROX ); 468053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 469053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryArgs = new String[ queryArgsTemp.length + 2 ]; 470053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project for( int i = 0 ; i < queryArgsTemp.length ; i++ ) { 471053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryArgs[ i + 2 ] = queryArgsTemp[ i ]; 472053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 473053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 474053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryArgs[ 0 ] = wnnWord.stroke; 475053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project queryArgs[ 1 ] = wnnWord.candidate; 476053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 47777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa queryArgs = OpenWnnDictionaryImplJni.createBindArray( this.mWnnWork, keyString, maxBindsOfQuery, MAX_PATTERN_OF_APPROX ); 478053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 479053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project break; 480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 481053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project default: 48277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCountCursor = 0; 483053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project freeCursor( ); 484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return; 485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 48777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* Create the cursor and set arguments */ 48877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCountCursor = 0; 489053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 49077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mDbCursor == null || mTypeOfQuery != newTypeOfQuery ) { 49177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* If the cursor is not exist or the type of query is changed, compile the query string and query words */ 492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project freeCursor( ); 493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 494053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 49577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa switch( order ) { 49677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case WnnDictionary.ORDER_BY_FREQUENCY: 49777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbCursor = ( SQLiteCursor )mDbDic.rawQuery( querySqlOrderByFreq, queryArgs ); 49877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 49977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa case WnnDictionary.ORDER_BY_KEY: 50077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbCursor = ( SQLiteCursor )mDbDic.rawQuery( querySqlOrderByKey, queryArgs ); 50177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa break; 50277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa default: 50377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return; 50477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 50577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } catch( SQLException e ) { 50677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return; 50777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 50877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 50977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mTypeOfQuery = newTypeOfQuery; 51077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 51177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* If the cursor is exist, bind new arguments and re-query words (DO NOT recompile the query string) */ 512053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 51377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbCursor.setSelectionArguments( queryArgs ); 51477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbCursor.requery( ); 51577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } catch( SQLException e ) { 51677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return; 51777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 51877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 51977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 52077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mDbCursor != null ) { 521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If querying is succeed, count the number of words */ 52277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mCountCursor = mDbCursor.getCount(); 523053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mCountCursor == 0 ) { 524053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If no word is retrieved, deactivate the cursor for reduce the resource */ 52577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbCursor.deactivate( ); 526053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 527053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 528053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 52977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return; 530053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 531053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 532053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 53377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#searchWord 53477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 53577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public int searchWord( int operation, int order, String keyString ) { 536053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Unset the previous word information */ 537053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project OpenWnnDictionaryImplJni.clearResult( this.mWnnWork ); 538053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 539053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Search to user/learn dictionary */ 540053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbDic != null && ( mFrequencyOffsetOfUserDictionary >= 0 || 541053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFrequencyOffsetOfLearnDictionary >= 0 ) ) { 54277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa try { 54377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( keyString.length() > 0 ) { 54477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa createQuery( keyString, null, operation, order ); 54577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mDbCursor != null ) { 54677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbCursor.moveToFirst(); 54777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 54877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 549053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If the key string is "", no word is retrieved */ 550053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbCursor != null ) { 551053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbCursor.deactivate(); 552053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 553053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCountCursor = 0; 55477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 55577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } catch( SQLException e ) { 556053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbCursor != null ) { 557053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbCursor.deactivate(); 558053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 559053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCountCursor = 0; 56077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 561053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 562053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCountCursor = 0; 563053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 564053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 565053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Search to fixed dictionary */ 56677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 ) { 56777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int ret = OpenWnnDictionaryImplJni.searchWord( this.mWnnWork, operation, order, keyString ); 56877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mCountCursor > 0) { 56977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ret = 1; 57077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 57177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return ret; 57277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 57377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return -1; 57477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 57577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 57677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 57777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 57877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#searchWord 57977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 58077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public int searchWord( int operation, int order, String keyString, WnnWord wnnWord ) { 581053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( wnnWord == null || wnnWord.partOfSpeech == null ) { 582053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return -1; 583053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 584053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 585053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Search to user/learn dictionary with link information */ 586053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbDic != null && ( mFrequencyOffsetOfUserDictionary >= 0 || 587053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mFrequencyOffsetOfLearnDictionary >= 0 ) ) { 58877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa try { 58977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa createQuery( keyString, wnnWord, operation, order ); 59077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mDbCursor != null ) { 59177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbCursor.moveToFirst(); 59277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 59377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } catch( SQLException e ) { 594053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbCursor != null ) { 595053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbCursor.deactivate(); 596053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 597053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCountCursor = 0; 59877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 599053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 600053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCountCursor = 0; 601053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 602053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 603053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Search to fixed dictionary with link information */ 604053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project OpenWnnDictionaryImplJni.clearResult( this.mWnnWork ); 605053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project OpenWnnDictionaryImplJni.setStroke( this.mWnnWork, wnnWord.stroke ); 606053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project OpenWnnDictionaryImplJni.setCandidate( this.mWnnWork, wnnWord.candidate ); 607053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project OpenWnnDictionaryImplJni.setLeftPartOfSpeech( this.mWnnWork, wnnWord.partOfSpeech.left ); 608053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project OpenWnnDictionaryImplJni.setRightPartOfSpeech( this.mWnnWork, wnnWord.partOfSpeech.right ); 609053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project OpenWnnDictionaryImplJni.selectWord( this.mWnnWork ); 610053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 61177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 ) { 61277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int ret = OpenWnnDictionaryImplJni.searchWord( this.mWnnWork, operation, order, keyString ); 61377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if (mCountCursor > 0) { 61477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ret = 1; 61577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 61677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return ret; 61777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 61877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return -1; 61977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 62077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 62177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 62277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 62377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#getNextWord 62477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 62577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public WnnWord getNextWord( ) { 6267b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa return getNextWord( 0 ); 6277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa } 6287b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa 62977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 63077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#getNextWord 63177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 63277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public WnnWord getNextWord( int length ) { 63377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 ) { 634053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbDic != null && mDbCursor != null && mCountCursor > 0 ) { 635053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If the user/learn dictionary is queried, get the result from the user/learn dictionary */ 63677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa WnnWord result = new WnnWord( ); 63777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa try { 6387b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa /* Skip results if that is not contained the type of search or length of stroke is not equal specified length */ 639053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project while( mCountCursor > 0 && 6407b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ( ( mFrequencyOffsetOfUserDictionary < 0 && mDbCursor.getInt( 4 ) == TYPE_NAME_USER ) || 6417b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ( mFrequencyOffsetOfLearnDictionary < 0 && mDbCursor.getInt( 4 ) == TYPE_NAME_LEARN ) || 6427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa ( length > 0 && mDbCursor.getString( 0 ).length( ) != length ) ) ) { 643053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbCursor.moveToNext(); 644053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCountCursor--; 645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 646053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 647053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mCountCursor > 0 ) { 648053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Get the information of word */ 64977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result.stroke = mDbCursor.getString( 0 ); 65077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result.candidate = mDbCursor.getString( 1 ); 651053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project result.partOfSpeech.left = mDbCursor.getInt( 2 ); 652053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project result.partOfSpeech.right = mDbCursor.getInt( 3 ); 653053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 654053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbCursor.getInt( 4 ) == TYPE_NAME_USER ) { 655053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project result.frequency = mFrequencyOffsetOfUserDictionary; 656053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 657053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project result.frequency = mFrequencyOffsetOfLearnDictionary; 658053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 659053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 660053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Move cursor to next result. If the next result is not exist, deactivate the cursor */ 661053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbCursor.moveToNext(); 662053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( --mCountCursor <= 0 ) { 663053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbCursor.deactivate(); 664053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 665053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 666053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return result; 667053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 668053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* if no result is found, terminate the searching of user/learn dictionary */ 669053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbCursor.deactivate(); 67077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result = null; 671053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 67277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } catch( SQLException e ) { 673053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbCursor.deactivate(); 674053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mCountCursor = 0; 67577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result = null; 67677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 677053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 678053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 679053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Get the result from fixed dictionary */ 68077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int res = OpenWnnDictionaryImplJni.getNextWord( this.mWnnWork, length ); 68177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( res > 0 ) { 68277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa WnnWord result = new WnnWord( ); 683053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( result != null ) { 68477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result.stroke = OpenWnnDictionaryImplJni.getStroke( this.mWnnWork ); 68577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result.candidate = OpenWnnDictionaryImplJni.getCandidate( this.mWnnWork ); 68677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result.frequency = OpenWnnDictionaryImplJni.getFrequency( this.mWnnWork ); 687053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project result.partOfSpeech.left = OpenWnnDictionaryImplJni.getLeftPartOfSpeech( this.mWnnWork ); 688053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project result.partOfSpeech.right = OpenWnnDictionaryImplJni.getRightPartOfSpeech( this.mWnnWork ); 689053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 69077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return result; 69177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else if ( res == 0 ) { 69277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* No result is found. */ 69377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return null; 69477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 69577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* An error occur (It is regarded as "No result is found".) */ 69677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return null; 69777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 69877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 69977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return null; 70077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 70177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 70277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 70377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 70477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#getUserDictionaryWords 70577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 706053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public WnnWord[] getUserDictionaryWords( ) { 70777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 && mDbDic != null ) { 708053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int numOfWords, i; 70977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa SQLiteCursor cursor = null; 710053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 711053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 712053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Count all words in the user dictionary */ 713053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor = ( SQLiteCursor )mDbDic.query( 714053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project TABLE_NAME_DIC, 715053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project new String[] { COLUMN_NAME_STROKE, COLUMN_NAME_CANDIDATE }, 716053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String.format( "%s=%d", COLUMN_NAME_TYPE, TYPE_NAME_USER ), 717053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project null, null, null, null); 718053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project numOfWords = cursor.getCount(); 719053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 720053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( numOfWords > 0 ) { 721053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Retrieve all words in the user dictionary */ 722053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project WnnWord[] words = new WnnWord[ numOfWords ]; 723053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 724053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor.moveToFirst(); 725053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project for( i = 0 ; i < numOfWords ; i++ ) { 726053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project words[ i ] = new WnnWord(); 72777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa words[ i ].stroke = cursor.getString( 0 ); 72877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa words[ i ].candidate = cursor.getString( 1 ); 729053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor.moveToNext(); 730053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 731053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 732053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return words; 733053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 734053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } catch( SQLException e ) { 73577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* An error occurs */ 73677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return null; 737053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } finally { 738053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( cursor != null ) { 739053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor.close( ); 740053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 741053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 742053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 743053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return null; 744053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 745053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 74677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 74777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#clearApproxPattern 74877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 74977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public void clearApproxPattern( ) { 75077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 ) { 75177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa OpenWnnDictionaryImplJni.clearApproxPatterns( this.mWnnWork ); 75277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 75377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 75477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 75577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 75677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#setApproxPattern 75777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 75877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public int setApproxPattern( String src, String dst ) { 75977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 ) { 76077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return OpenWnnDictionaryImplJni.setApproxPattern( this.mWnnWork, src, dst ); 76177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 76277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return -1; 76377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 76477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 76577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 76677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 76777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#setApproxPattern 76877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 76977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa public int setApproxPattern( int approxPattern ) { 77077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( this.mWnnWork != 0 ) { 77177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return OpenWnnDictionaryImplJni.setApproxPattern( this.mWnnWork, approxPattern ); 77277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 77377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return -1; 77477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 77577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 77677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 77777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 77877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#getConnectMatrix 77977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 780053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public byte[][] getConnectMatrix( ) { 781053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project byte[][] result; 782053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int lcount, i; 783053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 7843feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if (this.mWnnWork != 0) { 78577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* 1-origin */ 78677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa lcount = OpenWnnDictionaryImplJni.getNumberOfLeftPOS( this.mWnnWork ); 78777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result = new byte[ lcount + 1 ][ ]; 78877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 78977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( result != null ) { 79077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa for( i = 0 ; i < lcount + 1 ; i++ ) { 79177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result[ i ] = OpenWnnDictionaryImplJni.getConnectArray( this.mWnnWork, i ); 79277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 79377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( result[ i ] == null ) { 79477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return null; 79577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 79677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 79777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 7983feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa } else { 79977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result = new byte[1][1]; 800053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 801053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return result; 802053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 803053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 80477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 80577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#getPOS 80677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 807053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public WnnPOS getPOS( int type ) { 808053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project WnnPOS result = new WnnPOS( ); 809053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 8103feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa if( this.mWnnWork != 0 && result != null ) { 811053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project result.left = OpenWnnDictionaryImplJni.getLeftPartOfSpeechSpecifiedType( this.mWnnWork, type ); 812053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project result.right = OpenWnnDictionaryImplJni.getRightPartOfSpeechSpecifiedType( this.mWnnWork, type ); 813053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 814053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( result.left < 0 || result.right < 0 ) { 815053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return null; 816053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 817053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 818053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return result; 819053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 820053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 82177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 82277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#clearUserDictionary 82377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 824053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public int clearUserDictionary() { 825053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbDic != null ) { 82677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbDic.execSQL( String.format( "delete from %s where %s=%d", TABLE_NAME_DIC, COLUMN_NAME_TYPE, TYPE_NAME_USER ) ); 827053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 828053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 829053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If no writable dictionary exists, no error occurs. */ 830053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return 0; 831053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 832053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 83377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 83477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#clearLearnDictionary 83577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 836053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public int clearLearnDictionary() { 837053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbDic != null ) { 83877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbDic.execSQL( String.format( "delete from %s where %s=%d", TABLE_NAME_DIC, COLUMN_NAME_TYPE, TYPE_NAME_LEARN ) ); 839053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 840053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 841053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If no writable dictionary exists, no error occurs. */ 842053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return 0; 843053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 844053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 84577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 84677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#addWordToUserDictionary 84777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 848053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public int addWordToUserDictionary( WnnWord[] word ) { 84977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa int result = 0; 850053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 85177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mDbDic != null ) { 85277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa SQLiteCursor cursor; 853053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 854053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Count all words in the user dictionary */ 855053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor = ( SQLiteCursor )mDbDic.query( 856053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project TABLE_NAME_DIC, 857053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project new String[] { COLUMN_NAME_ID }, 858053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String.format( "%s=%d", COLUMN_NAME_TYPE, TYPE_NAME_USER ), 859053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project null, null, null, null); 860053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 861053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project int count = cursor.getCount(); 86277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa cursor.close(); 863053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 864053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( count + word.length > MAX_WORDS_IN_USER_DICTIONARY ) { 865053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If user dictionary is full, an error occurs. */ 866053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return -1; 867053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 86877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbDic.beginTransaction(); 869053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 870053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder strokeSQL = new StringBuilder(); 871053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder candidateSQL = new StringBuilder(); 872053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 87377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa for( int index = 0 ; index < word.length ; index++ ) { 874053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( word[index].stroke.length() > 0 && word[index].stroke.length() <= MAX_STROKE_LENGTH && 875053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project word[index].candidate.length() > 0 && word[index].candidate.length() <= MAX_CANDIDATE_LENGTH ) { 876053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project strokeSQL.setLength( 0 ); 877053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project candidateSQL.setLength( 0 ); 878053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( strokeSQL, word[index].stroke ); 879053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( candidateSQL, word[index].candidate ); 880053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 88177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa cursor = ( SQLiteCursor )mDbDic.query( 882053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project TABLE_NAME_DIC, 883053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project new String[] { COLUMN_NAME_ID }, 884053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String.format( "%s=%d and %s=%s and %s=%s", 885053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_TYPE, TYPE_NAME_USER, 886053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_STROKE, strokeSQL.toString(), 887053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_CANDIDATE, candidateSQL.toString() ), 888053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project null, null, null, null ); 88977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 89077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( cursor.getCount() > 0 ) { 89177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* if the specified word is exist, an error reported and skipped that word. */ 89277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa result = -2; 89377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } else { 89477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa ContentValues content = new ContentValues(); 89577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 89677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa content.clear(); 89777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa content.put( COLUMN_NAME_TYPE, TYPE_NAME_USER ); 89877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa content.put( COLUMN_NAME_STROKE, word[index].stroke ); 89977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa content.put( COLUMN_NAME_CANDIDATE, word[index].candidate ); 90077ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa content.put( COLUMN_NAME_POS_LEFT, word[index].partOfSpeech.left ); 90177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa content.put( COLUMN_NAME_POS_RIGHT, word[index].partOfSpeech.right ); 90277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa 90377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbDic.insert( TABLE_NAME_DIC, null, content ); 90477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 905053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 906053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor.close( ); 907053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor = null; 908053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 90977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 910053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.setTransactionSuccessful(); 911053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } catch( SQLException e ) { 91277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* An error occurs */ 91377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return -1; 914053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } finally { 915053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.endTransaction(); 916053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( cursor != null ) { 917053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor.close( ); 918053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 919053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 920053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 921053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 922053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 923053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If no writable dictionary exists, no error occurs. */ 924053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return result; 925053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 926053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 92777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 92877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#addWordToUserDictionary 92977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 930053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public int addWordToUserDictionary( WnnWord word ) { 93177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa WnnWord[] words = new WnnWord[1]; 93277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa words[0] = word; 933053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 93477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return addWordToUserDictionary( words ); 935053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 936053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 93777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 93877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#removeWordFromUserDictionary 93977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 940053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public int removeWordFromUserDictionary( WnnWord[] word ) { 94177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa if( mDbDic != null ) { 94277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* Remove the specified word */ 94377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbDic.beginTransaction(); 944053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 945053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder strokeSQL = new StringBuilder(); 946053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder candidateSQL = new StringBuilder(); 947053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 94877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa for( int index = 0 ; index < word.length ; index++ ) { 949053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( word[index].stroke.length() > 0 && word[index].stroke.length() <= MAX_STROKE_LENGTH && 950053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project word[index].candidate.length() > 0 && word[index].candidate.length() <= MAX_CANDIDATE_LENGTH ) { 951053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project strokeSQL.setLength( 0 ); 952053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project candidateSQL.setLength( 0 ); 953053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( strokeSQL, word[index].stroke ); 954053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( candidateSQL, word[index].candidate ); 955053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 95677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbDic.delete( TABLE_NAME_DIC, 957053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String.format( "%s=%d and %s=%s and %s=%s", 958053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_TYPE, TYPE_NAME_USER, 959053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_STROKE, strokeSQL, 960053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_CANDIDATE, candidateSQL ), 961053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project null ); 962053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 96377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa } 96477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa mDbDic.setTransactionSuccessful(); 965053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } catch( SQLException e ) { 96677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /* An error occurs */ 96777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa return -1; 968053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } finally { 969053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.endTransaction(); 970053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 971053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 972053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 973053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If no writable dictionary exists, no error occurs. */ 974053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return 0; 975053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 976053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 97777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 97877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#removeWordFromUserDictionary 97977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 980053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public int removeWordFromUserDictionary( WnnWord word ) { 981053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project WnnWord[] words = new WnnWord[1]; 982053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project words[0] = word; 983053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 984053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return removeWordFromUserDictionary( words ); 985053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 986053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 98777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa /** 98877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @see jp.co.omronsoft.openwnn.WnnDictionary#learnWord 98977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa */ 990053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public int learnWord( WnnWord word ) { 991053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return learnWord( word, null ); 992053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 993053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 994053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /** 995053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Learn the word with connection. 9963feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * 99777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param word The word to learn 99877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @param previousWord The word which is selected previously. 99977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa * @return 0 if success; minus value if fail. 1000053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */ 1001053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project public int learnWord( WnnWord word, WnnWord previousWord ) { 1002053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( mDbDic != null ) { 1003053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder previousStrokeSQL = new StringBuilder(); 1004053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder previousCandidateSQL = new StringBuilder(); 1005053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1006053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( previousWord != null && 1007053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project previousWord.stroke.length() > 0 && previousWord.stroke.length() <= MAX_STROKE_LENGTH && 1008053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project previousWord.candidate.length() > 0 && previousWord.candidate.length() <= MAX_CANDIDATE_LENGTH ) { 1009053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( previousStrokeSQL, previousWord.stroke ); 1010053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( previousCandidateSQL, previousWord.candidate ); 1011053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If the information of previous word is set, perform the link learning */ 1012053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 1013053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1014053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( word.stroke.length() > 0 && word.stroke.length() <= MAX_STROKE_LENGTH && 1015053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project word.candidate.length() > 0 && word.candidate.length() <= MAX_CANDIDATE_LENGTH ) { 1016053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder strokeSQL = new StringBuilder(); 1017053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder candidateSQL = new StringBuilder(); 1018053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( strokeSQL, word.stroke ); 1019053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( candidateSQL, word.candidate ); 1020053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 102177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa SQLiteCursor cursor; 1022053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1023053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* Count the number of registered words and retrieve that words ascending by the ID */ 1024053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor = ( SQLiteCursor )mDbDic.query( 1025053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project TABLE_NAME_DIC, 1026053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project new String[] { COLUMN_NAME_STROKE, COLUMN_NAME_CANDIDATE }, 1027053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String.format( "%s=%d", COLUMN_NAME_TYPE, TYPE_NAME_LEARN ), 1028053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project null, null, null, 1029053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String.format( "%s ASC", COLUMN_NAME_ID ) ); 1030053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1031053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( cursor.getCount( ) >= MAX_WORDS_IN_LEARN_DICTIONARY ) { 1032053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If a registering space is short, delete the words that contain same stroke and candidate to the oldest word */ 1033053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.beginTransaction(); 1034053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 1035053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor.moveToFirst( ); 1036053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1037053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder oldestStrokeSQL = new StringBuilder(); 1038053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project StringBuilder oldestCandidateSQL = new StringBuilder(); 1039053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( oldestStrokeSQL, cursor.getString( 0 ) ); 1040053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project DatabaseUtils.appendEscapedSQLString( oldestCandidateSQL, cursor.getString( 1 ) ); 1041053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1042053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.delete( TABLE_NAME_DIC, 1043053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project String.format( "%s=%d and %s=%s and %s=%s", 1044053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_TYPE, TYPE_NAME_LEARN, 1045053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_STROKE, oldestStrokeSQL.toString( ), 1046053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project COLUMN_NAME_CANDIDATE, oldestCandidateSQL.toString( ) ), 1047053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project null ); 1048053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1049053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.setTransactionSuccessful(); 1050053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } catch( SQLException e ) { 1051053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return -1; 1052053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } finally { 1053053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.endTransaction(); 105477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa cursor.close(); 1055053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 1056053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } else { 1057053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project cursor.close(); 1058053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 1059053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1060053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* learning the word */ 1061053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project ContentValues content = new ContentValues(); 1062053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1063053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.clear(); 1064053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.put( COLUMN_NAME_TYPE, TYPE_NAME_LEARN ); 1065053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.put( COLUMN_NAME_STROKE, word.stroke ); 1066053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.put( COLUMN_NAME_CANDIDATE, word.candidate ); 1067053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.put( COLUMN_NAME_POS_LEFT, word.partOfSpeech.left ); 1068053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.put( COLUMN_NAME_POS_RIGHT, word.partOfSpeech.right ); 1069053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project if( previousWord != null ) { 1070053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.put( COLUMN_NAME_PREVIOUS_STROKE, previousWord.stroke ); 1071053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.put( COLUMN_NAME_PREVIOUS_CANDIDATE, previousWord.candidate ); 1072053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.put( COLUMN_NAME_PREVIOUS_POS_LEFT, previousWord.partOfSpeech.left ); 1073053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project content.put( COLUMN_NAME_PREVIOUS_POS_RIGHT, previousWord.partOfSpeech.right ); 1074053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 1075053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1076053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.beginTransaction(); 1077053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project try { 1078053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.insert( TABLE_NAME_DIC, null, content ); 1079053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.setTransactionSuccessful(); 1080053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } catch( SQLException e ) { 1081053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.endTransaction(); 1082053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return -1; 1083053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } finally { 1084053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project mDbDic.endTransaction(); 1085053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 1086053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 1087053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 1088053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project 1089053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project /* If no writable dictionary exists, no error occurs. */ 1090053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project return 0; 1091053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project } 1092053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project} 1093