/* TPOS.java - SQL operations with the table 'part_of_speech'
* in SQLite Android Wiktionary parsed database.
*
* Copyright (c) 2009-2012 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com>
* Distributed under EPL/LGPL/GPL/AL/BSD multi-license.
*/
package wikokit.base.wikt.sql;
import wikokit.base.wikt.constant.POS;
//import wikipedia.util.StringUtil;
import wikokit.base.wikipedia.language.LanguageType;
import wikokit.base.wikipedia.sql.Connect;
//import wikokit.base.wikipedia.sql.UtilSQL;
//import wikokit.base.wikipedia.sql.Statistics;
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.Collection;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/** An operations with the table 'part_of_speech' in Wiktionary parsed database.
* The table 'part_of_speech' contains a list of POS: name and ID.
*/
public class TPOS {
/** Unique POS identifier. */
private int id;
/** Name of part of speech: code and name, e.g. 'ru' and 'Russian'. */
private POS pos;
/** Map from ID to part of speech. It is created from data
* in the table `part_of_speech`, which is created from data in POS.java.*/
private static Map<Integer, TPOS> id2pos;
/** Map from part of speech to ID.*/
private static Map<POS, Integer> pos2id;
private final static TPOS[] NULL_TPOS_ARRAY = new TPOS[0];
public TPOS(int _id,POS _pos) {
id = _id;
pos = _pos;
}
/** Gets unique ID of this part of speech. */
public int getID() {
return id;
}
/** Gets this part of speech. */
public POS getPOS() {
return pos;
}
/** Gets part of speech (POS with ID) from the table 'lang_pos'.<br><br>
* REM: createFastMaps() should be run at least once, before this function execution.
*/
public static int getIDFast(POS p) {
if(null == pos2id) {
System.err.println("Error (wikt_parsed TPOS.getIDFast()):: What about calling 'createFastMaps()' before?");
return -1;
}
if(null == p) {
System.err.println("Error (wikt_parsed TPOS.getIDFast()):: argument POS is null");
return -1;
}
return pos2id.get(p);
}
/** Gets part of speech by ID from the table 'lang_pos'.<br><br>
* REM: createFastMaps() should be run at least once, before this function execution.
*/
public static TPOS getTPOSFast(int id) {
if(null == id2pos) {
System.err.println("Error (wikt_parsed TPOS.getTPOSFast()):: What about calling 'createFastMaps()' before?");
return null;
}
if(id <= 0) {
System.err.println("Error (wikt_parsed TPOS.getTPOSFast()):: argument id <=0, id = "+id);
return null;
}
return id2pos.get(id);
}
/** Gets part of speech from the table 'lang_pos'.<br><br>
* REM: createFastMaps() should be run at least once, before this function execution.
*/
public static TPOS get(POS p) {
return getTPOSFast(getIDFast(p));
}
/** Read all records from the table 'lang_pos',
* fills the internal map from a table ID to POS.<br><br>
*
* REM: during a creation of Wiktionary parsed database
* the functions recreateTable() should be called (before this function).
*/
public static void createFastMaps(SQLiteDatabase db) {
System.out.println("Loading table `part_of_speech`...");
TPOS[] tpos = getAllTPOS(db);
int size = tpos.length;
if(tpos.length != POS.size())
System.out.println("Warning (wikt_parsed TPOS.java createFastMaps()):: POS.size (" + POS.size()
+ ") is not equal to size of table 'part_of_speech'("+ size +"). Is the database outdated?");
if(null != id2pos && id2pos.size() > 0)
id2pos.clear();
if(null != pos2id && pos2id.size() > 0)
pos2id.clear();
id2pos = new LinkedHashMap<Integer, TPOS>(size);
pos2id = new LinkedHashMap<POS, Integer>(size);
for(TPOS t : tpos) {
id2pos.put(t.getID(), t);
pos2id.put(t.getPOS(), t.getID());
}
}
/** Gets all records from the table 'part_of_speech'.
*/
private static TPOS[] getAllTPOS(SQLiteDatabase db) {
// select * from part_of_speech;
Cursor c = db.query("part_of_speech",
new String[] { "id", "name"},
null, null, null, null,
null);
List<TPOS>tpos_list = new ArrayList<TPOS>();
if (c.moveToFirst()) {
do {
int i_id = c.getColumnIndexOrThrow("id");
int i_name = c.getColumnIndexOrThrow("name");
int _id = c.getInt(i_id);
String _name = c.getString(i_name);
POS p = POS.get(_name);
TPOS t = new TPOS(_id, p);
tpos_list.add(t);
} while (c.moveToNext());
}
if (c != null && !c.isClosed()) {
c.close();
}
return( (TPOS[])tpos_list.toArray(NULL_TPOS_ARRAY) );
}
/** Deletes all records from the table 'part_of_speech',
* loads parts of speech names from POS.java,
* sorts by name,
* fills the table.
*/
/* public static void recreateTable(Connect connect) {
System.out.println("Recreating the table `part_of_speech`...");
Map<Integer, POS> _id2pos = fillLocalMaps();
UtilSQL.deleteAllRecordsResetAutoIncrement(connect, "part_of_speech");
fillDB(connect, _id2pos);
{
int db_current_size = wikipedia.sql.Statistics.Count(connect, "part_of_speech");
assert(db_current_size == POS.size()); // ~ 12 POS
}
}*/
/** Load data from a POS class, sorts,
* and fills the local map 'id2pos'. */
public static Map<Integer, POS> fillLocalMaps() {
int size = POS.size();
List<String>list_pos = new ArrayList<String>(size);
list_pos.addAll(POS.getAllPOSNames());
Collections.sort(list_pos); // Collections.sort(list_pos, StringUtil.LEXICOGRAPHICAL_ORDER);
// OK, we have list of POS names. Sorted list 'list_pos'
// Local map from id to POS. It is created from data in POS.java.
// It is used to fill the table 'part_of_speech' in right sequence.
Map<Integer, POS> _id2pos = new LinkedHashMap<Integer, POS>(size);
for(int id=0; id<size; id++) {
String s = list_pos.get(id); // s - POS name
assert(POS.has(s)); //System.out.println("fillLocalMaps---id="+id+"; s="+s);
_id2pos.put(id, POS.get(s));
}
return _id2pos;
}
/** Fills database table 'part_of_speech' by data from POS class. */
/*public static void fillDB(Connect connect,Map<Integer, POS> id2pos) {
for(int id : id2pos.keySet())
insert (connect, id2pos.get(id));
}*/
/** Inserts record into the table 'part_of_speech'.<br><br>
* INSERT INTO part_of_speech (name) VALUES ("noun");
* @param name part of speech name, e.g. 'unknown', 'noun'
*/
/*public static void insert (Connect connect,POS p) {
if(null == p) return;
StringBuilder str_sql = new StringBuilder();
try
{
Statement s = connect.conn.createStatement ();
try {
str_sql.append("INSERT INTO part_of_speech (name) VALUES (\"");
//String safe_title = StringUtil.spaceToUnderscore(
// StringUtil.escapeChars(name));
//str_sql.append(safe_title);
str_sql.append(p.toString());
str_sql.append("\")");
s.executeUpdate (str_sql.toString());
} finally {
s.close();
}
}catch(SQLException ex) {
System.err.println("SQLException (wikt_parsed TPOS.java insert()):: sql='" + str_sql.toString() + "' " + ex.getMessage());
}
}*/
/** Selects row from the table 'part_of_speech' by a POS name.<br><br>
* SELECT id FROM part_of_speech WHERE name="noun";
* @param POS part of speech class
* @return null if a part of speech name is absent in the table 'part_of_speech'
*/
public static TPOS get (SQLiteDatabase db, POS p) {
if(null == p) return null;
Cursor c = db.query("part_of_speech",
new String[] { "id" },
"name=\"" + p.toString() + "\"",
null, null, null, null);
TPOS tp = null;
if (c.moveToFirst()) {
int i_id = c.getColumnIndexOrThrow("id");
int _id = c.getInt(i_id);
tp = new TPOS(_id, p);
}
if (c != null && !c.isClosed()) {
c.close();
}
return tp;
}
/** Deletes row from the table 'part_of_speech' by the POS name.<br><br>
* DELETE FROM part_of_speech WHERE name="unknown";
* @param p POS to be deleted
*/
/*public static void delete (Connect connect,POS p) {
if(null == p) return;
StringBuilder str_sql = new StringBuilder();
try {
Statement s = connect.conn.createStatement ();
try {
str_sql.append("DELETE FROM part_of_speech WHERE name=\"");
str_sql.append(p.toString());
str_sql.append("\"");
s.execute (str_sql.toString());
} finally {
s.close();
}
} catch(SQLException ex) {
System.err.println("SQLException (wikt_parsed TPOS.java delete()):: sql='" + str_sql.toString() + "' " + ex.getMessage());
}
}*/
}