/* IndexNative.java - SQL operations with the table 'index_native' in 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.index;
import java.util.ArrayList;
import java.util.List;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import wikokit.base.wikipedia.language.LanguageType;
import wikokit.base.wikt.sql.*;
/** The table 'index_native' - wordlist of words in main (native) language
* with non empty definitions (table in Wiktionary parsed database).
*/
public class IndexNative {
/** Unique page identifier. */
//private int page_id;
//private String page_title;
/** Wiktionary page in native language (page_title and page_id).
* Copy of page.page_title of this Wiktionary article, see TPage.page_title
*/
private TPage page;
/** true, if there is any semantic relation in this Wiktionary article */
private boolean has_relation;
//private final static IndexNative[] NULL_INDEXNATIVE_ARRAY = new IndexNative[0];
private final static TPage[] NULL_TPAGE_ARRAY = new TPage[0];
public IndexNative(TPage _page, boolean _has_relation)
{
page = _page;
has_relation = _has_relation;
}
/** Gets unique ID (page.id) from database */
public int getID() {
if(null != page)
return page.getID();
return 0;
}
/** Gets title of the wiki page, word. */
public String getPageTitle() {
if(null != page)
return page.getPageTitle();
return "";
}
/** Returns true, if this Wiktionary page describes any semantic relation. */
public boolean hasRelation() {
return has_relation;
}
/** Counts number of parts of speech (or lang_pos?) in the table 'index_native'
* (words in native language) with non-empty definitions. <br><br>
*
* SELECT COUNT(*) AS size from index_native;
*/
public static int countNumberPOSWithDefinition (SQLiteDatabase db)
{
int size = 0;
final String sql = "SELECT COUNT(*) FROM index_native";
Cursor c = db.rawQuery(sql, null); // new String[] { "" + _meaning.getID() });
if (c.moveToFirst())
size = c.getInt(0);
if (c != null && !c.isClosed()) {
c.close();
}
return size;
}
/** Inserts record into the table 'index_native'.<br><br>
* INSERT INTO index_native (page_id,page_title,has_relation) VALUES (12,"water12",TRUE);
*
* @param page Wiktionary page with title in native language
* @param has_relation true, if there is any semantic relation in this Wiktionary article
*/
/*public static IndexNative insert ( Connect connect, //String page_title,
TPage page,
boolean has_relation) {
if(null == page) {
System.err.println("Error (IndexNative.insert()):: null argument: page="+page);
return null;
}
StringBuilder str_sql = new StringBuilder();
str_sql.append("INSERT INTO index_native (page_id,page_title,has_relation) VALUES (");
str_sql.append(page.getID());
str_sql.append(",\"");
String page_title = page.getPageTitle();
String safe_title = PageTableBase.convertToSafeStringEncodeToDBWunderscore(
connect, page_title);
str_sql.append(safe_title);
str_sql.append("\",");
str_sql.append(has_relation);
str_sql.append(")");
try
{
Statement s = connect.conn.createStatement ();
try {
s.executeUpdate (str_sql.toString());
} finally {
s.close();
}
}catch(SQLException ex) {
System.err.println("SQLException (IndexNative.insert()):: page_title="+page_title+
"; sql='" + str_sql.toString() + "' " + ex.getMessage());
}
IndexNative index_native = null;
index_native = new IndexNative(page, has_relation);
return index_native;
}*/
/** Selects row from the table 'index_native' by the page_title.<br><br>
*
* SELECT page_id,has_relation FROM index_native WHERE page_title="apple";
*
* @param page_title title of Wiktionary article
* @return null if page_title is absent
*/
public static IndexNative get (SQLiteDatabase db,String page_title) {
TPage tp = TPage.get(db, page_title);
if(null == tp)
return null;
IndexNative _in = null;
// old: SELECT page_id,has_relation FROM index_native WHERE page_title="car"
// new: SELECT has_relation FROM index_native WHERE page_title="car"
Cursor c = db.query("index_native",
new String[] { "has_relation"},
"page_title=\"" + page_title + "\"",
null, null, null, null);
if (c.moveToFirst()) {
int i_has_relation = c.getColumnIndexOrThrow("has_relation");
boolean has_relation = 0 != c.getInt(i_has_relation);
_in = new IndexNative(tp, has_relation);
}
if (c != null && !c.isClosed()) {
c.close();
}
return _in;
}
/** Selects rows from the table 'index_native' by the prefix of word in native language.<br><br>
*
* old SELECT foreign_word,native_page_title FROM index_en WHERE foreign_word LIKE 'water-%';
* new SELECT page_id,page_title FROM index_native WHERE page_title LIKE '%ater%' LIMIT 5;
*
* @param prefix_native_word the begining of the page_titles
* @param limit constraint of the number of rows returned,
* if it's negative then a constraint is omitted
* @param native_lang native language in the Wiktionary,
* e.g. Russian language in Russian Wiktionary
* @param b_meaning return articles with definitions (constraint)
* @param b_sem_rel return articles with semantic relations
*
* @return array of words started from the prefix (empty array if they are absent)
*/
public static TPage[] getByPrefixNative (
SQLiteDatabase db,
String prefix_native_word, int limit,
LanguageType native_lang,
//LanguageType foreign_lang,
//boolean b_meaning,
boolean b_sem_rel
) {
if(0 == limit)
return NULL_TPAGE_ARRAY;
List<TPage> _list = null;
String table_name = "index_native";
String str_limit = "";
int limit_with_reserve = limit;
if( limit_with_reserve > 0) {
//if(b_meaning)
// limit_with_reserve += 142; // since some words without meaning will be skipped
str_limit = "" + limit_with_reserve;
}
StringBuilder s_where = new StringBuilder();
if(null != prefix_native_word && prefix_native_word.length() > 0) {
s_where.append("page_title LIKE \"" + prefix_native_word + "%\"");
}
if(b_sem_rel)
s_where.append("AND has_relation > 0");
// old SELECT foreign_word,foreign_has_definition,native_page_title FROM index_en WHERE foreign_word LIKE 'water-%';
// new SELECT page_id,page_title FROM index_native WHERE page_title LIKE '%ater%' LIMIT 5;
Cursor c;
c = db.query(table_name,
new String[] { "page_id", "page_title", "has_relation"},
s_where.toString(),
null, null, null, null,
str_limit);
if (c.moveToFirst()) {
do {
int i_page_id = c.getColumnIndexOrThrow("page_id");
int i_page_title = c.getColumnIndexOrThrow("page_title");
int i_has_relation = c.getColumnIndexOrThrow("has_relation");
int _page_id = c.getInt(i_page_id);
String _page_title = c.getString(i_page_title);
boolean _has_relation = 0 != c.getInt(i_has_relation);
TPage _page = null;
// if(null != _page_title && _page_title.length() > 0)
_page = TPage.getByID(db, _page_id);
if(null == _list)
_list = new ArrayList<TPage>();
_list.add(_page);
//System.out.println("IndexNative:getByPrefixNative page_title=" + _page_title +
// "; has_relation=" + _has_relation);
} while (c.moveToNext() &&
(limit_with_reserve < 0 || null == _list || _list.size() < limit_with_reserve));
}
if (c != null && !c.isClosed()) {
c.close();
}
if(null == _list)
return NULL_TPAGE_ARRAY;
return ((TPage[])_list.toArray(NULL_TPAGE_ARRAY));
}
/** Deletes row from the table 'index_native' by the page (e.g. by page_title).<br><br>
*
* DELETE FROM index_native WHERE page_title="apple";
*
* @param page Wiktionary article
*/
/*public static void delete (Connect connect,TPage page) {
StringBuilder str_sql = new StringBuilder();
String safe_title = PageTableBase.convertToSafeStringEncodeToDBWunderscore(
connect, page.getPageTitle());
str_sql.append("DELETE FROM index_native WHERE page_title=\"");
str_sql.append(safe_title);
str_sql.append("\"");
try {
Statement s = connect.conn.createStatement ();
try {
s.execute (str_sql.toString());
} finally {
s.close();
}
} catch(SQLException ex) {
System.err.println("SQLException (IndexNative.delete()):: sql='" + str_sql.toString() + "' " + ex.getMessage());
}
}*/
}