/* TLabelCategory.java - SQL operations with the table 'label_category'
* in Wiktionary parsed database.
*
* Copyright (c) 2013 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com>
* Distributed under EPL/LGPL/GPL/AL/BSD multi-license.
*/
package wikokit.base.wikt.sql.label;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import wikokit.base.wikipedia.sql.Connect;
import wikokit.base.wikipedia.sql.Statistics;
import wikokit.base.wikipedia.sql.UtilSQL;
import wikokit.base.wikt.constant.LabelCategory;
/** An operations with the table 'label_category' in MySQL Wiktionary_parsed database.
* label_category - categories of context labels (templates).
*
* This class defines also special types of context labels, e.g.
* id == 0 - labels found by parser, else labels were entered by this software developers.
*/
public class TLabelCategory {
/** Unique identifier in the table 'label_category'. */
private int id;
/** Category of the label. */
private LabelCategory label_category;
/** Context label category name (i.e. type of context label). */
//private String name;
/** Parent category of context label category (parent_category_id),
* e.g. label category "Computing context labels"
* has parent category "Topical context labels". */
// private LabelCategory parent_category;
/** Map from label category to ID.*/
private static Map<LabelCategory, Integer> category2id;
/** Map from ID to label category.*/
private static Map<Integer, LabelCategory> id2category;
private final static TLabelCategory[] NULL_TLABEL_CATEGORY_ARRAY = new TLabelCategory[0];
public TLabelCategory(int _id, LabelCategory _label_category) {
id = _id;
label_category = _label_category;
}
public static Map<LabelCategory, Integer> getMapCategory2ID() {
return category2id;
}
//public static Map<Integer, LabelCategory> getMapID2Category() {
// return id2category;
//}
/** Gets label category ID from the table 'label_category'.<br><br>
*
* REM: the function 'createFastMaps()' should be run at least once,
* before this function execution.
*/
public static int getIDFast(LabelCategory lc) {
if(null == category2id || 0 == category2id.size()) {
System.out.println("Error (wikt_parsed TLabelCategory.getIDFast()):: What about calling 'createFastMaps()' before?");
return -1;
}
if(null == lc) {
System.out.println("Error (wikt_parsed TLabelCategory.getIDFast()):: argument LanguageCategory is null");
return -1;
}
Integer result = category2id.get(lc);
if(null == result) {
System.out.println("Warning (wikt_parsed TLabelCategory.getIDFast()):: map category2id don't have this id.");
return -1;
}
return result;
}
/** Gets label category by ID from the table 'label_category'.<br><br>
*
* REM: the functions createFastMaps() should be run at least once,
* before this function execution.
*/
public static LabelCategory getLabelCategoryFast(int id) {
if(null == id2category) {
System.out.println("Error (wikt_parsed TLabelCategory.getLabelCategoryFast()):: What about calling 'createFastMaps()' before?");
return null;
}
if(id <= 0) {
// System.out.println("Error (wikt_parsed TLabelCategory.getLabelCategoryFast()):: argument id <=0, id = "+id);
return null;
}
return id2category.get(id);
}
/** Read all records from the table 'label_category',
* fills the internal map from a table ID to a label category .<br><br>
*
* REM: during a creation of Wiktionary parsed database
* the functions recreateTable() should be called (before this function).
*/
public static void createFastMaps(Connect connect) {
System.out.println("Loading table `label_category`...");
int size = Statistics.Count(connect, "label_category");
if(0==size) {
System.out.println("Error (wikt_parsed TLabelCategory.createFastMaps()):: The table `label_category` is empty!");
return;
}
if(null != category2id && category2id.size() > 0)
category2id.clear();
if(null != id2category && id2category.size() > 0)
id2category.clear();
category2id = new LinkedHashMap<>(size);
id2category = new LinkedHashMap<>(size);
Collection<LabelCategory> labs = LabelCategory.getAllLabelCats();
for(LabelCategory lc : labs) {
String name = lc.getName();
int id = getIDByName(connect, name);
if (0 == id) {
System.out.println("Error (wikt_parsed TLabelCategory.createFastMaps()):: There is an empty label category name, check the table `label_category`!");
continue;
}
category2id.put(lc, id);
id2category.put(id, lc);
}
if(size != LabelCategory.size())
System.out.println("Warning (wikt_parsed TLabelCategory.createFastMaps()):: LabelCategory.size (" + LabelCategory.size()
+ ") is not equal to size of table 'label_category'("+ size +"). Is the database outdated?");
}
/** Deletes all records from the table 'label_category',
* loads names of labels categories from LabelCategory.java,
* sorts by name,
* fills the table.
*/
public static void recreateTable(Connect connect) {
System.out.println("Recreating the table `label_category`...");
Map<Integer, LabelCategory> _id2category = fillLocalMaps();
UtilSQL.deleteAllRecordsResetAutoIncrement(connect, "label_category");
fillDB(connect, _id2category);
{
int db_current_size = wikokit.base.wikipedia.sql.Statistics.Count(connect, "label_category");
assert(db_current_size == LabelCategory.size()); // ~ NNN label categories entered by hand
}
}
/** Load data from a LabelCategory class, sorts,
* and fills the local map 'id2category'. */
public static Map<Integer, LabelCategory> fillLocalMaps() {
int size = LabelCategory.size();
List<String>list_category = new ArrayList<>(size);
list_category.addAll(LabelCategory.getAllNames());
Collections.sort(list_category);
// OK, we have list of category labels (names). Sorted list 'list_category'
category2id = new LinkedHashMap<>(size);
// Local map from id to LabelCategory. It is created from data in LabelCategory.java.
// It is used to fill the table 'label' in right sequence.
Map<Integer, LabelCategory> _id2category = new LinkedHashMap<>(size);
for(int id=0; id<size; id++) {
String s = list_category.get(id); // s - name of category of labels
assert(LabelCategory.hasName(s)); //System.out.println("fillLocalMaps---id="+id+"; s="+s);
LabelCategory lc = LabelCategory.getByName(s);
_id2category.put(id+1, lc); // +1 since MySQL autoincrement starts from 1, not zero
category2id.put(lc, id+1);
}
return _id2category;
}
/** Fills database table 'label_category' by data from LabelCategory class. */
public static void fillDB(Connect connect,Map<Integer, LabelCategory> id2category) {
for(int id : id2category.keySet()) {
LabelCategory lc = id2category.get(id);
if(null == lc)
continue;
LabelCategory parent = lc.getParent();
int parent_id;
if(null == parent)
parent_id = 0;
else
parent_id = category2id.get(parent);
insert (connect, lc.getName(), parent_id);
}
}
/** Inserts record into the table 'relation_type'.<br><br>
* INSERT INTO relation_type (name) VALUES ("synonymy");
* @param name category label name
* @param parent_category_id ID of parent category, id=0 corresponds to NULL in the database
*/
public static void insert (Connect connect,String name,int parent_category_id) {
StringBuilder str_sql = new StringBuilder();
try
{
Statement s = connect.conn.createStatement ();
try {
if(0 == parent_category_id) {
str_sql.append("INSERT INTO label_category (name) VALUES (\"");
str_sql.append(name);
str_sql.append("\")");
} else {
str_sql.append("INSERT INTO label_category (name, parent_category_id) VALUES (\"");
str_sql.append(name);
str_sql.append("\",");
str_sql.append(parent_category_id);
str_sql.append(")");
}
s.executeUpdate (str_sql.toString());
} finally {
s.close();
}
}catch(SQLException ex) {
System.out.println("SQLException (wikt_parsed TLabelCategory.java insert):: sql='" + str_sql.toString() + "' " + ex.getMessage());
}
}
/** Selects ID from the table 'label_category' by a label category name.<br><br>
* SELECT id FROM label_category WHERE name="Usage";
* @param label_category_name name of label category
* @return 0 if a label category name is empty in the table 'label_category'
*/
public static int getIDByName (Connect connect,String label_category_name) {
if(null == label_category_name
|| label_category_name.isEmpty()) return 0;
int result_id = 0;
StringBuilder str_sql = new StringBuilder();
try {
Statement s = connect.conn.createStatement ();
try {
str_sql.append("SELECT id FROM label_category WHERE name=\"");
str_sql.append(label_category_name);
str_sql.append("\"");
try (ResultSet rs = s.executeQuery (str_sql.toString())) {
if (rs.next ())
result_id = rs.getInt("id");
else
System.out.println("Warning: (wikt_parsed LabelCategory.getIDByName()):: name (" + label_category_name + ") is absent in the table 'label_category'.");
}
} finally {
s.close();
}
} catch(SQLException ex) {
System.out.println("SQLException (LabelCategory.getIDByName()):: sql='" + str_sql.toString() + "' " + ex.getMessage());
}
return result_id;
}
}