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