diff --git a/app/controllers/api/v1/feed_versions_controller.rb b/app/controllers/api/v1/feed_versions_controller.rb index 4c102317a..317d52aea 100644 --- a/app/controllers/api/v1/feed_versions_controller.rb +++ b/app/controllers/api/v1/feed_versions_controller.rb @@ -59,6 +59,24 @@ def index @feed_versions = @feed_versions.where(sha1: sha1s) end + if params[:calendar_coverage_begins_at_or_before].present? + @feed_versions = @feed_versions.where_calendar_coverage_begins_at_or_before( + params[:calendar_coverage_begins_at_or_before] + ) + end + + if params[:calendar_coverage_begins_at_or_after].present? + @feed_versions = @feed_versions.where_calendar_coverage_begins_at_or_after( + params[:calendar_coverage_begins_at_or_after] + ) + end + + if params[:calendar_coverage_includes].present? + @feed_versions = @feed_versions.where_calendar_coverage_includes( + params[:calendar_coverage_includes] + ) + end + if params[:feed_onestop_id].present? feed_onestop_ids = params[:feed_onestop_id].split(',') @feed_versions = @feed_versions.where(feed: Feed.where(onestop_id: feed_onestop_ids)) diff --git a/app/models/feed_version.rb b/app/models/feed_version.rb index b49560840..ffb329dcf 100644 --- a/app/models/feed_version.rb +++ b/app/models/feed_version.rb @@ -23,7 +23,9 @@ # # Indexes # -# index_feed_versions_on_feed_type_and_feed_id (feed_type,feed_id) +# index_feed_versions_on_earliest_calendar_date (earliest_calendar_date) +# index_feed_versions_on_feed_type_and_feed_id (feed_type,feed_id) +# index_feed_versions_on_latest_calendar_date (latest_calendar_date) # class FeedVersion < ActiveRecord::Base @@ -50,6 +52,22 @@ class FeedVersion < ActiveRecord::Base joins('INNER JOIN current_feeds ON feed_versions.id = current_feeds.active_feed_version_id') } + scope :where_calendar_coverage_begins_at_or_before, -> (date) { + date = date.is_a?(Date) ? date : Date.parse(date) + where('earliest_calendar_date <= ?', date) + } + + scope :where_calendar_coverage_begins_at_or_after, -> (date) { + date = date.is_a?(Date) ? date : Date.parse(date) + where('earliest_calendar_date >= ?', date) + } + + scope :where_calendar_coverage_includes, -> (date) { + date = date.is_a?(Date) ? date : Date.parse(date) + where('earliest_calendar_date <= ?', date) + .where('latest_calendar_date >= ?', date) + } + def succeeded(timestamp) self.update(imported_at: timestamp) self.feed.update(last_imported_at: self.imported_at) diff --git a/app/serializers/feed_version_serializer.rb b/app/serializers/feed_version_serializer.rb index 10b25e6e1..5f50a1270 100644 --- a/app/serializers/feed_version_serializer.rb +++ b/app/serializers/feed_version_serializer.rb @@ -23,7 +23,9 @@ # # Indexes # -# index_feed_versions_on_feed_type_and_feed_id (feed_type,feed_id) +# index_feed_versions_on_earliest_calendar_date (earliest_calendar_date) +# index_feed_versions_on_feed_type_and_feed_id (feed_type,feed_id) +# index_feed_versions_on_latest_calendar_date (latest_calendar_date) # class FeedVersionSerializer < ApplicationSerializer diff --git a/db/migrate/20161129205145_add_calendar_indexes_to_feed_versions.rb b/db/migrate/20161129205145_add_calendar_indexes_to_feed_versions.rb new file mode 100644 index 000000000..a5cedd42d --- /dev/null +++ b/db/migrate/20161129205145_add_calendar_indexes_to_feed_versions.rb @@ -0,0 +1,6 @@ +class AddCalendarIndexesToFeedVersions < ActiveRecord::Migration + def change + add_index :feed_versions, :earliest_calendar_date + add_index :feed_versions, :latest_calendar_date + end +end diff --git a/db/schema.rb b/db/schema.rb index bfacf75e0..b6d267f86 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161103231227) do +ActiveRecord::Schema.define(version: 20161129205145) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -304,6 +304,7 @@ t.datetime "created_at" t.datetime "updated_at" t.integer "feed_version_id" + t.string "gtfs_id" end add_index "entities_imported_from_feed", ["entity_type", "entity_id"], name: "index_entities_imported_from_feed_on_entity_type_and_entity_id", using: :btree @@ -365,7 +366,9 @@ t.string "md5_raw" end + add_index "feed_versions", ["earliest_calendar_date"], name: "index_feed_versions_on_earliest_calendar_date", using: :btree add_index "feed_versions", ["feed_type", "feed_id"], name: "index_feed_versions_on_feed_type_and_feed_id", using: :btree + add_index "feed_versions", ["latest_calendar_date"], name: "index_feed_versions_on_latest_calendar_date", using: :btree create_table "issues", force: :cascade do |t| t.integer "created_by_changeset_id" diff --git a/spec/controllers/api/v1/feed_versions_controller_spec.rb b/spec/controllers/api/v1/feed_versions_controller_spec.rb index c1a31d286..36077b1ff 100644 --- a/spec/controllers/api/v1/feed_versions_controller_spec.rb +++ b/spec/controllers/api/v1/feed_versions_controller_spec.rb @@ -14,6 +14,33 @@ }) end + it 'calendar_coverage_begins_at_or_before' do + fv1 = create(:feed_version, earliest_calendar_date: '2016-01-01', latest_calendar_date: '2017-01-01') + fv2 = create(:feed_version, earliest_calendar_date: '2016-02-01', latest_calendar_date: '2017-02-01') + get :index, calendar_coverage_begins_at_or_before: '2016-01-01' + expect_json({feed_versions: -> (feed_versions) { + expect(feed_versions.map { |fv| fv[:sha1]}).to match_array([fv1.sha1]) + }}) + end + + it 'calendar_coverage_begins_at_or_after' do + fv1 = create(:feed_version, earliest_calendar_date: '2016-01-01', latest_calendar_date: '2017-01-01') + fv2 = create(:feed_version, earliest_calendar_date: '2016-02-01', latest_calendar_date: '2017-02-01') + get :index, calendar_coverage_begins_at_or_after: '2016-02-01' + expect_json({feed_versions: -> (feed_versions) { + expect(feed_versions.map { |fv| fv[:sha1]}).to match_array([fv2.sha1]) + }}) + end + + it 'calendar_coverage_includes' do + fv1 = create(:feed_version, earliest_calendar_date: '2016-01-01', latest_calendar_date: '2017-01-01') + fv2 = create(:feed_version, earliest_calendar_date: '2016-02-01', latest_calendar_date: '2017-02-01') + get :index, calendar_coverage_includes: '2017-01-15' + expect_json({feed_versions: -> (feed_versions) { + expect(feed_versions.map { |fv| fv[:sha1]}).to match_array([fv2.sha1]) + }}) + end + it 'filters by SHA1 hash' do create_list(:feed_version, 2) sha1 = FeedVersion.first.sha1 diff --git a/spec/factories/feed_version_factory.rb b/spec/factories/feed_version_factory.rb index 1820c2553..239427534 100644 --- a/spec/factories/feed_version_factory.rb +++ b/spec/factories/feed_version_factory.rb @@ -23,7 +23,9 @@ # # Indexes # -# index_feed_versions_on_feed_type_and_feed_id (feed_type,feed_id) +# index_feed_versions_on_earliest_calendar_date (earliest_calendar_date) +# index_feed_versions_on_feed_type_and_feed_id (feed_type,feed_id) +# index_feed_versions_on_latest_calendar_date (latest_calendar_date) # FactoryGirl.define do diff --git a/spec/models/feed_version_spec.rb b/spec/models/feed_version_spec.rb index afa20c766..d3f84366a 100644 --- a/spec/models/feed_version_spec.rb +++ b/spec/models/feed_version_spec.rb @@ -23,10 +23,56 @@ # # Indexes # -# index_feed_versions_on_feed_type_and_feed_id (feed_type,feed_id) +# index_feed_versions_on_earliest_calendar_date (earliest_calendar_date) +# index_feed_versions_on_feed_type_and_feed_id (feed_type,feed_id) +# index_feed_versions_on_latest_calendar_date (latest_calendar_date) # describe FeedVersion do + context 'calendar scopes' do + before(:each) do + @fv1 = create(:feed_version, earliest_calendar_date: '2016-01-01', latest_calendar_date: '2017-01-01') + @fv2 = create(:feed_version, earliest_calendar_date: '2016-02-01', latest_calendar_date: '2017-02-01') + @fv3 = create(:feed_version, earliest_calendar_date: '2016-03-01', latest_calendar_date: '2017-03-01') + end + + context '.where_calendar_coverage_begins_at_or_before' do + it 'finds FeedVersions with coverage before a date' do + expect(FeedVersion.where_calendar_coverage_begins_at_or_before('2016-04-15')).to match_array([@fv1, @fv2, @fv3]) + end + it 'finds FeedVersions with coverage on or before a date' do + expect(FeedVersion.where_calendar_coverage_begins_at_or_before('2016-02-01')).to match_array([@fv1, @fv2]) + end + it 'finds FeedVersions with coverage on a date' do + expect(FeedVersion.where_calendar_coverage_begins_at_or_before('2016-01-01')).to match_array([@fv1]) + end + end + + context '.where_calendar_coverage_begins_at_or_after' do + it 'finds FeedVersions with coverage after a date' do + expect(FeedVersion.where_calendar_coverage_begins_at_or_after('2015-12-01')).to match_array([@fv1, @fv2, @fv3]) + end + it 'finds FeedVersions with coverage on or after a date' do + expect(FeedVersion.where_calendar_coverage_begins_at_or_after('2016-02-01')).to match_array([@fv2, @fv3]) + end + it 'finds FeedVersions with coverage on a date' do + expect(FeedVersion.where_calendar_coverage_begins_at_or_after('2016-03-01')).to match_array([@fv3]) + end + end + + context '.where_calendar_coverage_includes' do + it 'finds FeedVersions with coverage including a date' do + expect(FeedVersion.where_calendar_coverage_includes('2016-04-01')).to match_array([@fv1, @fv2, @fv3]) + end + it 'finds FeedVersions with coverage including, inclusive' do + expect(FeedVersion.where_calendar_coverage_includes('2016-02-01')).to match_array([@fv1, @fv2]) + end + it 'excludes FeedVersions outside coverage range' do + expect(FeedVersion.where_calendar_coverage_includes('2017-01-15')).to match_array([@fv2, @fv3]) + end + end + end + context '#compute_and_set_hashes' do it 'computes file hashes' do feed_version = create(:feed_version_bart)