package com.maxiee.heartbeat.database.utils;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import com.maxiee.heartbeat.database.DatabaseHelper;
import com.maxiee.heartbeat.database.tables.EventLabelRelationTable;
import com.maxiee.heartbeat.database.tables.LabelsTable;
import com.maxiee.heartbeat.model.Event;
import com.maxiee.heartbeat.model.Label;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
/**
* Created by maxiee on 15/11/10.
*/
public class LabelUtils {
private static long queryId(Cursor cursor) {
return DatabaseUtils.getLong(cursor, LabelsTable.ID);
}
private static String queryLabelStr(Cursor cursor) {
return DatabaseUtils.getString(cursor, LabelsTable.LABEL);
}
private static Label queryLabel(Cursor cursor) {
return new Label(queryId(cursor), queryLabelStr(cursor));
}
private static long[] getRelativedIds(Context context, String idField, String getField, long id) {
Cursor cursor = DatabaseUtils.query(
context, EventLabelRelationTable.NAME,
new String[]{EventLabelRelationTable.EVENT_ID, EventLabelRelationTable.LABEL_ID},
idField + "=?",
new String[]{String.valueOf(id)});
if (cursor.getCount() < 1) {
cursor.close();
return new long[] {};
}
long[] ret = new long[cursor.getCount()];
while (cursor.moveToNext()) {
ret[cursor.getPosition()] = DatabaseUtils.getLong(cursor, getField);
}
cursor.close();
return ret;
}
public static long[] getRelativedLabelIds(Context context, Event event) {
return getRelativedIds(
context,
EventLabelRelationTable.EVENT_ID,
EventLabelRelationTable.LABEL_ID,
event.getId());
}
public static void addRelation(Context context, long eventId, long labelId) {
ContentValues values = new ContentValues();
values.put(EventLabelRelationTable.EVENT_ID, eventId);
values.put(EventLabelRelationTable.LABEL_ID, labelId);
DatabaseUtils.add(context, EventLabelRelationTable.NAME, values);
}
public static void deleteRelation(Context context, long eventId, long labelId) {
DatabaseUtils.delete(
context, EventLabelRelationTable.NAME,
EventLabelRelationTable.EVENT_ID + "=? and " + EventLabelRelationTable.LABEL_ID + "=?",
new String[]{String.valueOf(eventId), String.valueOf(labelId)});
deleteIfNoUse(context, new Label(labelId, ""));
}
public static void deleteRelation(Context context, Event event) {
long[] ids = getRelativedLabelIds(context, event);
for (long id : ids) deleteRelation(context, event.getId(), id);
for (long id : ids) deleteIfNoUse(context, new Label(id, ""));
}
public static Label getLabelByLabelId(Context context, long labelId) {
Cursor cursor = DatabaseUtils.query(
context, LabelsTable.NAME,
new String[]{LabelsTable.ID, LabelsTable.LABEL},
LabelsTable.ID + "=?",
new String[]{String.valueOf(labelId)});
if (cursor.getCount() < 1) {
cursor.close();
return null;
}
cursor.moveToFirst();
Label l = queryLabel(cursor);
cursor.close();
return l;
}
public static ArrayList<Label> getLabelsByEvent(Context context, Event event) {
long[] ids = getRelativedLabelIds(context, event);
ArrayList<Label> labels = new ArrayList<>();
for (long id : ids) {
Label l = getLabelByLabelId(context, id);
if (l != null) labels.add(l);
}
return labels;
}
public static ArrayList<Label> getAll(Context context) {
Cursor cursor = DatabaseUtils.queryAll(
context, LabelsTable.NAME,
new String[]{LabelsTable.ID, LabelsTable.LABEL});
ArrayList<Label> ret = new ArrayList<>();
if (cursor.getCount() < 1) {
cursor.close();
return ret;
}
while (cursor.moveToNext()) {
ret.add(queryLabel(cursor));
}
cursor.close();
return ret;
}
public static Label addLabel(Context context, String label) {
ContentValues values = new ContentValues();
values.put(LabelsTable.LABEL, label);
return new Label(DatabaseUtils.add(context, LabelsTable.NAME, values), label);
}
public static Label addLabel(Context context, long eventId, String label) {
Label ret = addLabel(context, label);
addRelation(context, eventId, ret.getId());
return ret;
}
public static ArrayList<Label> addLabels(Context context, ArrayList<String> labels) {
ArrayList<Label> ret = new ArrayList<>();
for (String l : labels) {
long id = hasLabel(context, l);
if (id == NOT_FOUND) {
ret.add(addLabel(context, l));
} else {
ret.add(getLabelByLabelId(context, id));
}
}
return ret;
}
public static ArrayList<Label> addLabels(Context context, long eventId, ArrayList<String> labels) {
ArrayList<Label> ret = addLabels(context, labels);
for (Label l: ret) {
addRelation(context, eventId, l.getId());
}
return ret;
}
public static void deleteIfNoUse(Context context, Label label) {
ArrayList<Event> events = EventUtils.getEvents(context, label);
if (!events.isEmpty()) return;
DatabaseUtils.delete(
context, LabelsTable.NAME,
LabelsTable.ID + "=?",
new String[] {String.valueOf(label.getId())});
}
public static Map<Long, Integer> getFreq(Context context) {
ArrayList<Label> labels = LabelUtils.getAll(context);
Map<Long, Integer> ret = new TreeMap<>();
for (Label label : labels) {
int count = (int) android.database.DatabaseUtils.queryNumEntries(
DatabaseHelper.instance(context).getReadableDatabase(),
EventLabelRelationTable.NAME,
EventLabelRelationTable.LABEL_ID + "=?",
new String[]{String.valueOf(label.getId())});
ret.put(label.getId() ,count);
}
return ret;
}
public final static int NOT_FOUND = -1;
// TODO return Label
public static long hasLabel(Context context, String label) {
Cursor cursor = DatabaseUtils.query(
context, LabelsTable.NAME,
new String[] {LabelsTable.ID, LabelsTable.LABEL},
LabelsTable.LABEL + "=?",
new String[] {label});
if (cursor.getCount() < 1) {
cursor.close();
return -1;
} else {
cursor.moveToFirst();
long ret = queryId(cursor);
cursor.close();
return ret;
}
}
}