/*
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.mobile.dao;
import com.activeandroid.query.Select;
import net.sqlcipher.Cursor;
import org.openmrs.mobile.databases.DBOpenHelper;
import org.openmrs.mobile.databases.OpenMRSDBOpenHelper;
import org.openmrs.mobile.databases.tables.EncounterTable;
import org.openmrs.mobile.databases.tables.ObservationTable;
import org.openmrs.mobile.models.Encounter;
import org.openmrs.mobile.models.EncounterType;
import org.openmrs.mobile.models.Observation;
import org.openmrs.mobile.utilities.DateUtils;
import org.openmrs.mobile.utilities.FormService;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.schedulers.Schedulers;
import static org.openmrs.mobile.databases.DBOpenHelper.createObservableIO;
public class EncounterDAO {
public long saveEncounter(Encounter encounter, Long visitID) {
encounter.setVisitID(visitID);
return new EncounterTable().insert(encounter);
}
public EncounterType getEncounterTypeByFormName(String formname) {
return new Select()
.from(EncounterType.class)
.where("display = ?", formname)
.executeSingle();
}
public void saveLastVitalsEncounter(Encounter encounter, String patientUUID) {
if (null != encounter) {
encounter.setPatientUUID(patientUUID);
long oldLastVitalsEncounterID = getLastVitalsEncounterID(patientUUID);
if (0 != oldLastVitalsEncounterID) {
for (Observation obs: new ObservationDAO().findObservationByEncounterID(oldLastVitalsEncounterID)) {
new ObservationTable().delete(obs.getId());
}
new EncounterTable().delete(oldLastVitalsEncounterID);
}
ObservationDAO observationDAO = new ObservationDAO();
long encounterID = saveEncounter(encounter, null);
for (Observation obs : encounter.getObservations()) {
observationDAO.saveObservation(obs, encounterID)
.observeOn(Schedulers.io())
.subscribe();
}
}
}
public long getLastVitalsEncounterID(String patientUUID) {
long encounterID = 0;
DBOpenHelper helper = OpenMRSDBOpenHelper.getInstance().getDBOpenHelper();
String where = String.format("%s is NULL AND %s = ?", EncounterTable.Column.VISIT_KEY_ID, EncounterTable.Column.PATIENT_UUID);
String[] whereArgs = new String[]{patientUUID};
final Cursor cursor = helper.getReadableDatabase().query(EncounterTable.TABLE_NAME, null, where, whereArgs, null, null, null);
if (null != cursor) {
try {
if (cursor.moveToFirst()) {
int id_CI = cursor.getColumnIndex(EncounterTable.Column.ID);
encounterID = cursor.getLong(id_CI);
}
} finally {
cursor.close();
}
}
return encounterID;
}
public Observable<Encounter> getLastVitalsEncounter(String patientUUID) {
return createObservableIO(() -> {
DBOpenHelper helper = OpenMRSDBOpenHelper.getInstance().getDBOpenHelper();
Encounter encounter = null;
String where = String.format("%s = ? AND %s = ? ORDER BY %s DESC LIMIT 1", EncounterTable.Column.PATIENT_UUID, EncounterTable.Column.ENCOUNTER_TYPE, EncounterTable.Column.ENCOUNTER_DATETIME);
String[] whereArgs = new String[]{patientUUID, EncounterType.VITALS};
final Cursor cursor = helper.getReadableDatabase().query(EncounterTable.TABLE_NAME, null, where, whereArgs, null, null, null);
if (null != cursor) {
try {
if (cursor.moveToFirst()) {
int id_CI = cursor.getColumnIndex(EncounterTable.Column.ID);
int uuid_CI = cursor.getColumnIndex(EncounterTable.Column.UUID);
int display_CI = cursor.getColumnIndex(EncounterTable.Column.DISPLAY);
int datetime_CI = cursor.getColumnIndex(EncounterTable.Column.ENCOUNTER_DATETIME);
int formUuid_CI = cursor.getColumnIndex(EncounterTable.Column.FORM_UUID);
int patientUuid_CI = cursor.getColumnIndex(EncounterTable.Column.PATIENT_UUID);
Long id = cursor.getLong(id_CI);
String uuid = cursor.getString(uuid_CI);
String display = cursor.getString(display_CI);
Long datetime = cursor.getLong(datetime_CI);
String formUuid = cursor.getString(formUuid_CI);
String patientUuid = cursor.getString(patientUuid_CI);
encounter = new Encounter();
encounter.setId(id);
encounter.setUuid(uuid);
encounter.setDisplay(display);
encounter.setEncounterDatetime(DateUtils.convertTime(datetime, DateUtils.OPEN_MRS_REQUEST_FORMAT));
encounter.setEncounterType((EncounterType) new Select().from(EncounterType.class).where("display = ?", EncounterType.VITALS).executeSingle());
encounter.setObservations(new ObservationDAO().findObservationByEncounterID(id));
encounter.setForm(FormService.getFormByUuid(formUuid));
encounter.setPatient(new PatientDAO().findPatientByUUID(patientUuid));
}
} finally {
cursor.close();
}
}
return encounter;
});
}
public boolean updateEncounter(long encounterID, Encounter encounter, long visitID) {
encounter.setVisitID(visitID);
return new EncounterTable().update(encounterID, encounter) > 0;
}
public List<Encounter> findEncountersByVisitID(Long visitID) {
DBOpenHelper helper = OpenMRSDBOpenHelper.getInstance().getDBOpenHelper();
List<Encounter> encounters = new ArrayList<Encounter>();
String where = String.format("%s = ?", EncounterTable.Column.VISIT_KEY_ID);
String[] whereArgs = new String[]{visitID.toString()};
final Cursor cursor = helper.getReadableDatabase().query(EncounterTable.TABLE_NAME, null, where, whereArgs, null, null, null);
if (null != cursor) {
try {
while (cursor.moveToNext()) {
int id_CI = cursor.getColumnIndex(EncounterTable.Column.ID);
int uuid_CI = cursor.getColumnIndex(EncounterTable.Column.UUID);
int display_CI = cursor.getColumnIndex(EncounterTable.Column.DISPLAY);
int datetime_CI = cursor.getColumnIndex(EncounterTable.Column.ENCOUNTER_DATETIME);
int encounterType_CI = cursor.getColumnIndex(EncounterTable.Column.ENCOUNTER_TYPE);
int formUuid_CI = cursor.getColumnIndex(EncounterTable.Column.FORM_UUID);
Long id = cursor.getLong(id_CI);
String uuid = cursor.getString(uuid_CI);
String display = cursor.getString(display_CI);
Long datetime = cursor.getLong(datetime_CI);
String formUuid = cursor.getString(formUuid_CI);
String typeDisplay = cursor.getString(encounterType_CI);
Encounter encounter = new Encounter();
encounter.setEncounterType(new EncounterType(typeDisplay));
encounter.setId(id);
encounter.setVisitID(visitID);
encounter.setUuid(uuid);
encounter.setDisplay(display);
encounter.setEncounterDatetime(DateUtils.convertTime(datetime, DateUtils.OPEN_MRS_REQUEST_FORMAT));
encounter.setObservations(new ObservationDAO().findObservationByEncounterID(id));
encounter.setForm(FormService.getFormByUuid(formUuid));
encounters.add(encounter);
}
} finally {
cursor.close();
}
}
return encounters;
}
public Observable<List<Encounter>> getAllEncountersByType(Long patientID, EncounterType type) {
return createObservableIO(() -> {
List<Encounter> encounters = new ArrayList<Encounter>();
DBOpenHelper helper = OpenMRSDBOpenHelper.getInstance().getDBOpenHelper();
String query = "SELECT e.* FROM observations AS o JOIN encounters AS e ON o.encounter_id = e._id " +
"JOIN visits AS v on e.visit_id = v._id WHERE v.patient_id = ? AND e.type = ? ORDER BY e.encounterDatetime DESC";
String type1 = type.getDisplay();
String[] whereArgs = new String[]{patientID.toString(), type1};
final Cursor cursor = helper.getReadableDatabase().rawQuery(query, whereArgs);
if (null != cursor) {
try {
while (cursor.moveToNext()) {
int id_CI = cursor.getColumnIndex(EncounterTable.Column.ID);
int uuid_CI = cursor.getColumnIndex(EncounterTable.Column.UUID);
int display_CI = cursor.getColumnIndex(EncounterTable.Column.DISPLAY);
int datetime_CI = cursor.getColumnIndex(EncounterTable.Column.ENCOUNTER_DATETIME);
int formUuid_CI = cursor.getColumnIndex(EncounterTable.Column.FORM_UUID);
Long id = cursor.getLong(id_CI);
String uuid = cursor.getString(uuid_CI);
String display = cursor.getString(display_CI);
Long datetime = cursor.getLong(datetime_CI);
String formUuid = cursor.getString(formUuid_CI);
Encounter encounter = new Encounter();
encounter.setId(id);
encounter.setUuid(uuid);
encounter.setDisplay(display);
encounter.setEncounterDatetime(DateUtils.convertTime(datetime, DateUtils.OPEN_MRS_REQUEST_FORMAT));
encounter.setEncounterType(type);
encounter.setObservations(new ObservationDAO().findObservationByEncounterID(id));
encounter.setForm(FormService.getFormByUuid(formUuid));
encounters.add(encounter);
}
} finally {
cursor.close();
}
}
return encounters;
});
}
public long getEncounterByUUID(final String encounterUUID) {
DBOpenHelper helper = OpenMRSDBOpenHelper.getInstance().getDBOpenHelper();
String where = String.format("%s = ?", EncounterTable.Column.UUID);
String[] whereArgs = new String[]{encounterUUID};
long encounterID = 0;
final Cursor cursor = helper.getReadableDatabase().query(EncounterTable.TABLE_NAME, null, where, whereArgs, null, null, null);
if (null != cursor) {
try {
if (cursor.moveToFirst()) {
int encounterID_CI = cursor.getColumnIndex(EncounterTable.Column.ID);
encounterID = cursor.getLong(encounterID_CI);
}
} finally {
cursor.close();
}
}
return encounterID;
}
}