package wordik.magneto.db;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import wordik.magneto.constant.Relation;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class MSRMeanSemrelXX {
private final static MSRMeanSemrelXX[] NULL_MSRMEANSEMRELXX_ARRAY = new MSRMeanSemrelXX[0];
private final static String[] NULL_STRING_ARRAY = new String[0];
/** Unique identifier for this meaning. */
private int id;
/** Entry / headword in the language XX. */
private String page_title;
/** Text of the meaning (definition) of this entry (without wikification). */
private String meaning;
/** Symbol between words in the table fields synonyms, antonyms, etc. */
private final static String delimiter = "&/";
/** Names of semantic relations. */
private static final String[] table_fields_relations = {
"synonyms", "antonyms",
"hypernyms", "hyponyms",
"holonyms", "meronyms",
"troponyms", "coordinate_terms"
};
/** Semantic relations. */
private static final Relation[] ar_relations = {
Relation.synonymy, Relation.antonymy,
Relation.hypernymy, Relation.hyponymy,
Relation.holonymy, Relation.meronymy,
Relation.troponymy, Relation.coordinate_term
};
/** E.g. synonymy -> syn_word1, syn_word2;
* antonymy -> ant_word1, ...
*/
private Map<Relation, String[]> m_relations;
/** Number of semantic relations (for this meaning): synonyms + antonyms + ... */
private int n_sem_rel;
/** Number of correct answers with these semantic relations. */
private int success;
/** Number of wrong answers with these semantic relations. */
private int failure;
private static Random generator = new Random();
public MSRMeanSemrelXX(int _id, String _page_title, String _meaning,
int _n_sem_rel, int _success, int _failure,
Map<Relation, String[]> _m_relations)
{
id = _id;
page_title = _page_title;
meaning = _meaning;
n_sem_rel = _n_sem_rel;
success = _success;
failure = _failure;
m_relations = _m_relations;
}
/** Gets semantic relations. */
public Map<Relation, String[]> getRelations() {
return m_relations;
}
/** Gets entry header (page_title). */
public String getPageTitle() {
return page_title;
}
/** Gets meaning (definition). */
public String getMeaning() {
return meaning;
}
/** Gets all synonym, antonym, etc. */
public String[] getAllSynonyms ()
{
List<String> words = new ArrayList<String>();
for(String[] ww : m_relations.values())
for(String w : ww)
words.add(w);
return (String[])words.toArray(NULL_STRING_ARRAY);
}
/** Gets random synonym, or antonym, etc. */
public String getRandomSynonym ()
{
String[] all_words = getAllSynonyms();
if(all_words.length <= 0)
return ""; // unreachable line
return all_words[ generator.nextInt( all_words.length ) ];
}
/** Checks whether the candidate word is a synonym (or antonym, etc.) for the page_title word. */
public boolean hasRelatedWord (String candidate)
{
String[] all_words = getAllSynonyms();
if(all_words.length <= 0)
return false; // unreachable line
List<String> word_list = Arrays.asList(all_words);
return word_list.contains(candidate);
}
// = semrel_main_word.(candidate);
/** Gets name of the relation between the page_title word and candidate word.
* @return empty String "" if there is no relations
* */
public String getRelation (String candidate)
{
if(null == candidate || 0 == candidate.length())
return "";
for(Relation r : m_relations.keySet()) {
String [] ww = m_relations.get(r);
for(String w : ww) {
if(candidate.equalsIgnoreCase(w))
return r.toString();
}
}
return "";
}
/** Gets random rows (records) from the XX table.<br><br>
*
* old: SELECT * FROM mean_semrel_en ORDER BY RANDOM() limit 2;
* new: SELECT * FROM mean_semrel_en LIMIT random_id, 1
*
* @param xx_lang defines XX language code in mean_semrel_XX table
* @param limit number of random records
* @return
*/
public static MSRMeanSemrelXX[] getRandom (SQLiteDatabase db, MSRLang xx_lang, int limit)
{
if(limit < 1)
return NULL_MSRMEANSEMRELXX_ARRAY;
String table = "mean_semrel_" + xx_lang.getCode();
int max_id = xx_lang.getNumberOfMeanings();
int random_id = generator.nextInt(max_id);
Cursor c = db.query(table, new String[] {
"_id", "page_title", "meaning", "n_sem_rel",
"success", "failure",
"synonyms", "antonyms",
"hypernyms", "hyponyms",
"holonyms", "meronyms",
"troponyms", "coordinate_terms"},
null, null, null, null,
"", // "RANDOM()", // ORDER BY
"" + random_id + ", " + limit);
//PageTableBase.
// convertToSafeStringEncodeToDBWunderscore(connect, page_title));
List<MSRMeanSemrelXX> list_rel = new ArrayList<MSRMeanSemrelXX>();
if (c.moveToFirst()) {
do {
int i_id = c.getColumnIndexOrThrow("_id");
int i_page_title = c.getColumnIndexOrThrow("page_title");
int i_meaning = c.getColumnIndexOrThrow("meaning");
int i_sem_rel = c.getColumnIndexOrThrow("n_sem_rel");
int i_success = c.getColumnIndexOrThrow("success");
int i_failure = c.getColumnIndexOrThrow("failure");
int _id = c.getInt(i_id);
String page_title = c.getString(i_page_title);
String meaning = c.getString(i_meaning);
int n_sem_rel = c.getInt(i_sem_rel);
int success = c.getInt(i_success);
int failure = c.getInt(i_failure);
Map<Relation, String[]> _m_relations = new HashMap<Relation, String[]>();
for(Relation r : ar_relations) {
String relation_field = r.toString(); // relation name as table field
if(r == Relation.coordinate_term)
relation_field = "coordinate_terms"; // "coordinate terms" -> "coordinate_terms" (without space in the table field name)
int i = c.getColumnIndexOrThrow(relation_field);
if(!c.isNull(i)) {
String synset = c.getString(i);
//byte[] byte_synset = rs.getBytes(relation_field);
//if(null != byte_synset) {
// String synset = Encodings.bytesToUTF8(byte_synset);
String[] syn_words = synset.split(delimiter);
_m_relations.put(r, syn_words);
//}
}
}
list_rel.add(new MSRMeanSemrelXX(_id, page_title, meaning,
n_sem_rel, success, failure, _m_relations));
} while (c.moveToNext());
}
if (c != null && !c.isClosed()) {
c.close();
}
return (MSRMeanSemrelXX[])list_rel.toArray(NULL_MSRMEANSEMRELXX_ARRAY);
}
}