package com.ghostflying.portalwaitinglist.dao.datahelper; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import com.ghostflying.portalwaitinglist.dao.DataProvider; import com.ghostflying.portalwaitinglist.dao.DbHelper; import com.ghostflying.portalwaitinglist.dao.dbinfo.PortalEventDbInfo; import com.ghostflying.portalwaitinglist.model.EditEvent; import com.ghostflying.portalwaitinglist.model.InvalidEvent; import com.ghostflying.portalwaitinglist.model.PortalEvent; import com.ghostflying.portalwaitinglist.model.SubmissionEvent; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * Created by ghostflying on 1/19/15. */ public class PortalEventHelper extends BaseHelper { @Override protected String getTableName() { return PortalEventDbInfo.TABLE_NAME; } public PortalEventHelper(Context context){ super(context); } public Uri insert(PortalEvent portalEvent){ ContentValues values = getContentValues(portalEvent); return insert(values); } private ContentValues getContentValues(PortalEvent portalEvent) { ContentValues values = new ContentValues(); values.put(PortalEventDbInfo.COLUMN_NAME_PORTAL_NAME, portalEvent.getPortalName()); values.put(PortalEventDbInfo.COLUMN_NAME_OPERATION_TYPE, portalEvent.getOperationType().ordinal()); values.put(PortalEventDbInfo.COLUMN_NAME_OPERATION_RESULT, portalEvent.getOperationResult().ordinal()); values.put(PortalEventDbInfo.COLUMN_NAME_DATE, portalEvent.getDate().getTime()); values.put(PortalEventDbInfo.COLUMN_NAME_MESSAGE_ID, portalEvent.getMessageId()); if (portalEvent instanceof SubmissionEvent){ values.put(PortalEventDbInfo.COLUMN_NAME_IMAGE_URL, ((SubmissionEvent) portalEvent).getPortalImageUrl()); } else { if (portalEvent.getOperationResult() != PortalEvent.OperationResult.PROPOSED){ values.put(PortalEventDbInfo.COLUMN_NAME_ADDRESS, portalEvent.getPortalAddress()); values.put(PortalEventDbInfo.COLUMN_NAME_ADDRESS_URL, portalEvent.getPortalAddressUrl()); } } return values; } public int bulkInsert(List<PortalEvent> portalEvents){ if (portalEvents.size() == 0) return 0; ArrayList<ContentValues> valuesList = new ArrayList<>(); for (PortalEvent eachEvent : portalEvents){ valuesList.add(getContentValues(eachEvent)); } return bulkInsert(valuesList.toArray(new ContentValues[valuesList.size()])); } /** * Get all events after id. * @param id the id to filter * @return the cursor. */ public Cursor getAll(long id){ return query( null, PortalEventDbInfo._ID + "> ?", new String[]{Long.toString(id)}, PortalEventDbInfo.COLUMN_NAME_DATE + " ASC" ); } public long getLastEventTimestamp(){ synchronized (DataProvider.class){ DbHelper mHelper = new DbHelper(mContext); SQLiteDatabase mDatabase = mHelper.getReadableDatabase(); Cursor lastEvent = mDatabase.rawQuery( "SELECT MAX(" + PortalEventDbInfo.COLUMN_NAME_DATE + ") AS MAX FROM " + PortalEventDbInfo.TABLE_NAME, null); try{ lastEvent.moveToFirst(); return lastEvent.getLong(0); } finally { lastEvent.close(); mDatabase.close(); } } } public boolean isExist(String messageId){ Cursor mCursor = query( new String[]{PortalEventDbInfo.COLUMN_NAME_MESSAGE_ID}, PortalEventDbInfo.COLUMN_NAME_MESSAGE_ID + " = ?", new String[]{messageId}, null ); try{ return mCursor.moveToFirst(); } finally { mCursor.close(); } } /** * Get events with the same portal name with the specified event. * The specified event is the first one. * @param messageId the messageId of the specified event. * @return the list of events. */ public List<PortalEvent> getEventsByName(String messageId){ List<PortalEvent> events = new ArrayList<>(); Cursor specifiedCursor = query( null, PortalEventDbInfo.COLUMN_NAME_MESSAGE_ID + " = ?", new String[]{messageId}, null ); try{ events.addAll(fromCursor(specifiedCursor)); } finally { specifiedCursor.close(); } if (events.size() == 1){ String portalName = events.get(0).getPortalName(); Cursor sameNameCursor = query( null, PortalEventDbInfo.COLUMN_NAME_PORTAL_NAME + " = ? AND " + PortalEventDbInfo.COLUMN_NAME_MESSAGE_ID + " != ?", new String[]{portalName, messageId}, PortalEventDbInfo.COLUMN_NAME_DATE + " ASC" ); try{ events.addAll(fromCursor(sameNameCursor)); } finally { sameNameCursor.close(); } return events; } // if there are no events in the specified Id, return empty list. else return new ArrayList<PortalEvent>(); } public List<PortalEvent> fromCursor(Cursor cursor){ List<PortalEvent> portalEvents = new ArrayList<>(); int portalNameIndex = cursor.getColumnIndex(PortalEventDbInfo.COLUMN_NAME_PORTAL_NAME); int operationTypeIndex = cursor.getColumnIndex(PortalEventDbInfo.COLUMN_NAME_OPERATION_TYPE); int operationResultIndex = cursor.getColumnIndex(PortalEventDbInfo.COLUMN_NAME_OPERATION_RESULT); int messageIdIndex = cursor.getColumnIndex(PortalEventDbInfo.COLUMN_NAME_MESSAGE_ID); int dateIndex = cursor.getColumnIndex(PortalEventDbInfo.COLUMN_NAME_DATE); int imageUrlIndex = cursor.getColumnIndex(PortalEventDbInfo.COLUMN_NAME_IMAGE_URL); int addressIndex = cursor.getColumnIndex(PortalEventDbInfo.COLUMN_NAME_ADDRESS); int addressUrlIndex = cursor.getColumnIndex(PortalEventDbInfo.COLUMN_NAME_ADDRESS_URL); while(cursor.moveToNext()){ PortalEvent event; String name = cursor.getString(portalNameIndex); PortalEvent.OperationType operationType = PortalEvent.OperationType.values()[cursor.getInt(operationTypeIndex)]; PortalEvent.OperationResult operationResult = PortalEvent.OperationResult.values()[cursor.getInt(operationResultIndex)]; Date date = new Date(cursor.getLong(dateIndex)); String messageId = cursor.getString(messageIdIndex); if (operationType == PortalEvent.OperationType.SUBMISSION){ String imageUrl = cursor.getString(imageUrlIndex); if (operationResult == PortalEvent.OperationResult.ACCEPTED){ String address = cursor.getString(addressIndex); String addressUrl = cursor.getString(addressUrlIndex); event = new SubmissionEvent(name, operationResult, date, messageId, imageUrl, address, addressUrl); } else { event = new SubmissionEvent(name, operationResult, date, messageId, imageUrl); } } else if (operationType == PortalEvent.OperationType.INVALID){ String imageUrl = cursor.getString(imageUrlIndex); event = new InvalidEvent(name, operationResult, date, messageId, imageUrl); } else { if (operationResult != PortalEvent.OperationResult.PROPOSED){ String address = cursor.getString(addressIndex); String addressUrl = cursor.getString(addressUrlIndex); event = new EditEvent(name, operationResult, date, messageId, address, addressUrl); } else { event = new EditEvent(name, operationResult, date, messageId); } } portalEvents.add(event); } return portalEvents; } }