diff --git a/app/src/main/assets/databases/caltrain-10.01.2017.db b/app/src/main/assets/databases/caltrain-10.01.2017.v3.db similarity index 79% rename from app/src/main/assets/databases/caltrain-10.01.2017.db rename to app/src/main/assets/databases/caltrain-10.01.2017.v3.db index 1652ef3..5314e97 100644 Binary files a/app/src/main/assets/databases/caltrain-10.01.2017.db and b/app/src/main/assets/databases/caltrain-10.01.2017.v3.db differ diff --git a/app/src/main/assets/databases/caltrain2.db b/app/src/main/assets/databases/caltrain2.db deleted file mode 100644 index 87e9311..0000000 Binary files a/app/src/main/assets/databases/caltrain2.db and /dev/null differ diff --git a/app/src/main/java/com/eleith/calchoochoo/data/ChooChooDatabase.java b/app/src/main/java/com/eleith/calchoochoo/data/ChooChooDatabase.java index 9b06b33..44c40f1 100644 --- a/app/src/main/java/com/eleith/calchoochoo/data/ChooChooDatabase.java +++ b/app/src/main/java/com/eleith/calchoochoo/data/ChooChooDatabase.java @@ -6,8 +6,8 @@ import com.readystatesoftware.sqliteasset.SQLiteAssetHelper; public class ChooChooDatabase extends SQLiteAssetHelper { - private static final String DATABASE_NAME = "caltrain-10.01.2017.db"; - private static final int DATABASE_VERSION = 4; + private static final String DATABASE_NAME = "caltrain-10.01.2017.v3.db"; + private static final int DATABASE_VERSION = 6; public ChooChooDatabase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); diff --git a/app/src/main/java/com/eleith/calchoochoo/utils/CalendarDateUtils.java b/app/src/main/java/com/eleith/calchoochoo/utils/CalendarDateUtils.java index 0d343b5..f9949fd 100644 --- a/app/src/main/java/com/eleith/calchoochoo/utils/CalendarDateUtils.java +++ b/app/src/main/java/com/eleith/calchoochoo/utils/CalendarDateUtils.java @@ -2,55 +2,101 @@ package com.eleith.calchoochoo.utils; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import android.support.v4.util.Pair; +import android.text.TextUtils; +import android.util.SparseArray; + +import com.google.android.gms.common.internal.safeparcel.SafeParcelable; import org.joda.time.DateTime; +import org.joda.time.LocalDate; +import org.joda.time.LocalDateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.w3c.dom.Text; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; public class CalendarDateUtils { + public final static DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYYMMdd"); - public static String getCalendarFilter(SQLiteDatabase db, Long dateTime) { - String calendarFilter; - int dayOfWeek = isExceptionDate(db, dateTime) ? 0 : new DateTime(dateTime).getDayOfWeek(); + public static String getFilterForDate(SQLiteDatabase db, Long dateTime) { + String calendarFilter = null; + String calendarExceptionAdded = null; + String calendarExceptionRemoved = null; + SparseArray> exceptions = getExceptionsForDate(db, dateTime); + int dayOfWeek = new DateTime(dateTime).getDayOfWeek(); switch (dayOfWeek) { case 1: - calendarFilter = " AND calendar.monday = 1 "; + calendarFilter = " calendar.monday = 1 "; break; case 2: - calendarFilter = " AND calendar.tuesday = 1 "; + calendarFilter = " calendar.tuesday = 1 "; break; case 3: - calendarFilter = " AND calendar.wednesday = 1 "; + calendarFilter = " calendar.wednesday = 1 "; break; case 4: - calendarFilter = " AND calendar.thursday = 1 "; + calendarFilter = " calendar.thursday = 1 "; break; case 5: - calendarFilter = " AND calendar.friday = 1 "; + calendarFilter = " calendar.friday = 1 "; break; case 6: - calendarFilter = " AND calendar.saturday = 1 "; + calendarFilter = " calendar.saturday = 1 "; break; case 7: - calendarFilter = " AND calendar.saturday = 1 "; - break; - default: - calendarFilter = " AND calendar.sunday = 1 "; + calendarFilter = " calendar.sunday = 1 "; break; } - return calendarFilter; + + for(Integer i = 0; i < exceptions.size(); i++) { + Integer exception = exceptions.keyAt(i); + ArrayList service_ids = exceptions.valueAt(i); + + if (exception == 1) { + calendarExceptionAdded = TextUtils.join(",", service_ids); + } else if (exception == 2) { + calendarExceptionRemoved = TextUtils.join(",", service_ids); + } + } + + if (calendarExceptionAdded != null) { + calendarFilter += " OR trips.service_id in (" + calendarExceptionAdded + ")"; + } + + if (calendarExceptionRemoved != null) { + calendarFilter = "(" + calendarFilter + ")" + " AND trips.service_id not in (" + calendarExceptionRemoved + ")"; + } + + return " AND (" + calendarFilter + ") "; } - public static boolean isExceptionDate(SQLiteDatabase db, Long dateTimeString) { - String[] projection = {"date"}; - String[] selectionArgs = {Long.toString(dateTimeString)}; + public static SparseArray> getExceptionsForDate(SQLiteDatabase db, Long dateTimeLong) { + LocalDateTime dateTime = new LocalDateTime(dateTimeLong); + String[] projection = {"service_id", "date", "exception_type"}; + String[] selectionArgs = {formatter.print(dateTime)}; + SparseArray> exceptions = new SparseArray<>(); Cursor cursor = db.query("calendar_dates", projection, "date = ?", selectionArgs, null, null, null); - if (cursor != null) { - Boolean isException = cursor.getCount() > 0; - cursor.close(); - return isException; - } else { - return false; + while (cursor.moveToNext()) { + String serviceId = "'" + cursor.getString(cursor.getColumnIndex("service_id")) + "'"; + Integer exception = cursor.getInt(cursor.getColumnIndex("exception_type")); + ArrayList serviceIds = exceptions.get(exception); + + if (serviceIds != null) { + serviceIds.add(serviceId); + } else { + serviceIds = new ArrayList<>(); + serviceIds.add(serviceId); + } + + exceptions.put(exception, serviceIds); } + + return exceptions; } } diff --git a/app/src/main/java/com/eleith/calchoochoo/utils/PossibleTrainUtils.java b/app/src/main/java/com/eleith/calchoochoo/utils/PossibleTrainUtils.java index 89d1ea2..a2c6827 100644 --- a/app/src/main/java/com/eleith/calchoochoo/utils/PossibleTrainUtils.java +++ b/app/src/main/java/com/eleith/calchoochoo/utils/PossibleTrainUtils.java @@ -64,8 +64,9 @@ public class PossibleTrainUtils { "WHERE trips.trip_id = st1.trip_id " + " AND trips.route_id = routes.route_id " + " AND calendar.service_id = trips.service_id " + - CalendarDateUtils.getCalendarFilter(db, dateTimeString) + + CalendarDateUtils.getFilterForDate(db, dateTimeString) + "ORDER BY st1__departure_time ASC "; + String[] args = {stop_id}; return db.rawQuery(query, args); } diff --git a/app/src/main/java/com/eleith/calchoochoo/utils/PossibleTripUtils.java b/app/src/main/java/com/eleith/calchoochoo/utils/PossibleTripUtils.java index 88ee5d9..9fd2cdd 100644 --- a/app/src/main/java/com/eleith/calchoochoo/utils/PossibleTripUtils.java +++ b/app/src/main/java/com/eleith/calchoochoo/utils/PossibleTripUtils.java @@ -131,7 +131,7 @@ public class PossibleTripUtils { } public static Cursor getPossibleTripsByParentStopQuery(SQLiteDatabase db, Long dateTime, String stop1_id, String stop2_id) { - String calendarFilter = CalendarDateUtils.getCalendarFilter(db, dateTime); + String calendarFilter = CalendarDateUtils.getFilterForDate(db, dateTime); String query = "SELECT " + "routes.route_id as route_id, " + "routes.route_long_name as route_long_name, " + diff --git a/build.gradle b/build.gradle index 0f9bb9b..384ffb8 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.android.tools.build:gradle:3.0.1' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files