Add type specific indices for date time repository values [SCI-6485] (#3825)

This commit is contained in:
Alex Kriuchykhin 2022-02-11 10:45:21 +01:00 committed by GitHub
parent ad5326011f
commit b9204e1ce3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 203 additions and 43 deletions

View file

@ -33,9 +33,9 @@
{ value: 'equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.equal_to') },
{ value: 'unequal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.unequal_to') },
{ value: 'greater_than', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than') },
{ value: 'greater_than_or_equal', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than_or_equal_to') },
{ value: 'greater_than_or_equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than_or_equal_to') },
{ value: 'less_than', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than') },
{ value: 'less_than_or_equal', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than_or_equal_to') },
{ value: 'less_than_or_equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than_or_equal_to') },
{ value: 'between', label: this.i18n.t('repositories.show.repository_filter.filters.operators.between') }
],
operator: 'equal_to',

View file

@ -35,9 +35,9 @@
{ value: 'equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.equal_to') },
{ value: 'unequal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.unequal_to') },
{ value: 'greater_than', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than') },
{ value: 'greater_than_or_equal', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than_or_equal_to') },
{ value: 'greater_than_or_equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than_or_equal_to') },
{ value: 'less_than', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than') },
{ value: 'less_than_or_equal', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than_or_equal_to') },
{ value: 'less_than_or_equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than_or_equal_to') },
{ value: 'between', label: this.i18n.t('repositories.show.repository_filter.filters.operators.between') }
],
operator: 'equal_to',

View file

@ -43,9 +43,9 @@
{ value: 'equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.equal_to') },
{ value: 'unequal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.unequal_to') },
{ value: 'greater_than', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than') },
{ value: 'greater_than_or_equal', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than_or_equal_to') },
{ value: 'greater_than_or_equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than_or_equal_to') },
{ value: 'less_than', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than') },
{ value: 'less_than_or_equal', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than_or_equal_to') },
{ value: 'less_than_or_equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than_or_equal_to') },
{ value: 'between', label: this.i18n.t('repositories.show.repository_filter.filters.operators.between') }
],
operator: 'equal_to',

View file

@ -41,9 +41,9 @@
{ value: 'equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.equal_to') },
{ value: 'unequal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.unequal_to') },
{ value: 'greater_than', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than') },
{ value: 'greater_than_or_equal', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than_or_equal_to') },
{ value: 'greater_than_or_equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.greater_than_or_equal_to') },
{ value: 'less_than', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than') },
{ value: 'less_than_or_equal', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than_or_equal_to') },
{ value: 'less_than_or_equal_to', label: this.i18n.t('repositories.show.repository_filter.filters.operators.less_than_or_equal_to') },
{ value: 'between', label: this.i18n.t('repositories.show.repository_filter.filters.operators.between') }
],
operator: 'equal_to',

View file

@ -186,35 +186,40 @@ class RepositoryDatatableService
def build_added_on_filter_condition(repository_rows, filter_element_params)
case filter_element_params[:operator]
when 'today'
repository_rows.where('created_at >= ?', Time.zone.now.beginning_of_day)
repository_rows.where("date_trunc('minute', \"created_at\") >= ?", Time.zone.now.beginning_of_day)
when 'yesterday'
repository_rows.where('created_at >= ? AND created_at < ?',
repository_rows.where("date_trunc('minute', \"created_at\") >= ? AND date_trunc('minute', \"created_at\") < ?",
Time.zone.now.beginning_of_day - 1.day, Time.zone.now.beginning_of_day)
when 'last_week'
repository_rows.where('created_at >= ? AND created_at < ?',
repository_rows.where("date_trunc('minute', \"created_at\") >= ? AND date_trunc('minute', \"created_at\") < ?",
Time.zone.now.beginning_of_week - 1.week, Time.zone.now.beginning_of_week)
when 'this_month'
repository_rows.where('created_at >= ?', Time.zone.now.beginning_of_month)
repository_rows.where("date_trunc('minute', \"created_at\") >= ?", Time.zone.now.beginning_of_month)
when 'last_year'
repository_rows.where('created_at >= ? AND created_at < ?',
repository_rows.where("date_trunc('minute', \"created_at\") >= ? AND date_trunc('minute', \"created_at\") < ?",
Time.zone.now.beginning_of_year - 1.year, Time.zone.now.beginning_of_year)
when 'this_year'
repository_rows.where('created_at >= ?', Time.zone.now.beginning_of_year)
repository_rows.where("date_trunc('minute', \"created_at\") >= ?", Time.zone.now.beginning_of_year)
when 'equal_to'
repository_rows.where(created_at: Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
repository_rows.where("date_trunc('minute', \"created_at\") = ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'unequal_to'
repository_rows
.where.not(created_at: Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
repository_rows.where.not("date_trunc('minute', \"created_at\") = ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'greater_than'
repository_rows.where('created_at > ?', Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
repository_rows.where("date_trunc('minute', \"created_at\") > ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'greater_than_or_equal_to'
repository_rows.where('created_at >= ?', Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
repository_rows.where("date_trunc('minute', \"created_at\") >= ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'less_than'
repository_rows.where('created_at < ?', Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
repository_rows.where("date_trunc('minute', \"created_at\") < ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'less_than_or_equal_to'
repository_rows.where('created_at <= ?', Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
repository_rows.where("date_trunc('minute', \"created_at\") <= ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'between'
repository_rows.where('created_at > ? AND created_at < ?',
repository_rows.where("date_trunc('minute', \"created_at\") > ? AND date_trunc('minute', \"created_at\") < ?",
Time.zone.parse(filter_element_params.dig(:parameters, :start_datetime)),
Time.zone.parse(filter_element_params.dig(:parameters, :end_datetime)))
else
@ -225,37 +230,42 @@ class RepositoryDatatableService
def build_archived_on_filter_condition(repository_rows, filter_element_params)
case filter_element_params[:operator]
when 'today'
repository_rows.where('archived_on >= ?', Time.zone.now.beginning_of_day)
repository_rows.where("date_trunc('minute', \"archived_on\") >= ?", Time.zone.now.beginning_of_day)
when 'yesterday'
repository_rows.where('archived_on >= ? AND archived_on < ?',
repository_rows.where("date_trunc('minute', \"archived_on\") >= ? AND date_trunc('minute', \"archived_on\") < ?",
Time.zone.now.beginning_of_day - 1.day, Time.zone.now.beginning_of_day)
when 'last_week'
repository_rows.where('archived_on >= ? AND archived_on < ?',
repository_rows.where("date_trunc('minute', \"archived_on\") >= ? AND date_trunc('minute', \"archived_on\") < ?",
Time.zone.now.beginning_of_week - 1.week, Time.zone.now.beginning_of_week)
when 'this_month'
repository_rows.where('archived_on >= ?', Time.zone.now.beginning_of_month)
repository_rows.where("date_trunc('minute', \"archived_on\") >= ?", Time.zone.now.beginning_of_month)
when 'last_year'
repository_rows.where('archived_on >= ? AND archived_on < ?',
repository_rows.where("date_trunc('minute', \"archived_on\") >= ? AND date_trunc('minute', \"archived_on\") < ?",
Time.zone.now.beginning_of_year - 1.year, Time.zone.now.beginning_of_year)
when 'this_year'
repository_rows.where('archived_on >= ?', Time.zone.now.beginning_of_year)
repository_rows.where("date_trunc('minute', \"archived_on\") >= ?", Time.zone.now.beginning_of_year)
when 'equal_to'
repository_rows.where(archived_on: filter_element_params.dig(:parameters, :datetime))
repository_rows.where("date_trunc('minute', \"archived_on\") = ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'unequal_to'
repository_rows
.where.not(archived_on: filter_element_params.dig(:parameters, :datetime))
repository_rows.where.not("date_trunc('minute', \"archived_on\") = ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'greater_than'
repository_rows.where('archived_on > ?', filter_element_params.dig(:parameters, :datetime))
repository_rows.where("date_trunc('minute', \"archived_on\") > ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'greater_than_or_equal_to'
repository_rows.where('archived_on >= ?', filter_element_params.dig(:parameters, :datetime))
repository_rows.where("date_trunc('minute', \"archived_on\") >= ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'less_than'
repository_rows.where('archived_on < ?', filter_element_params.dig(:parameters, :datetime))
repository_rows.where("date_trunc('minute', \"archived_on\") < ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'less_than_or_equal_to'
repository_rows.where('archived_on <= ?', filter_element_params.dig(:parameters, :datetime))
repository_rows.where("date_trunc('minute', \"archived_on\") <= ?",
Time.zone.parse(filter_element_params.dig(:parameters, :datetime)))
when 'between'
repository_rows.where('archived_on > ? AND archived_on < ?',
filter_element_params.dig(:parameters, :start_datetime),
filter_element_params.dig(:parameters, :end_datetime))
repository_rows.where("date_trunc('minute', \"archived_on\") > ? AND date_trunc('minute', \"archived_on\") < ?",
Time.zone.parse(filter_element_params.dig(:parameters, :start_datetime)),
Time.zone.parse(filter_element_params.dig(:parameters, :end_datetime)))
else
raise ArgumentError, 'Wrong operator for RepositoryRow Archived On!'
end

View file

@ -0,0 +1,86 @@
# frozen_string_literal: true
class AddDateTimeIndicesToRepositories < ActiveRecord::Migration[6.1]
def up
remove_index :repository_date_time_range_values, :start_time
remove_index :repository_date_time_range_values, :end_time
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_rows_on_created_at_as_date_time_minutes" '\
'ON "repository_rows" (date_trunc(\'minute\', "created_at"));'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_rows_on_archived_on_as_date_time_minutes" '\
'ON "repository_rows" (date_trunc(\'minute\', "archived_on"));'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_date_time_values_on_data_as_time" '\
'ON "repository_date_time_values" (CAST("data" AS TIME)) WHERE "type" = \'RepositoryTimeValue\';'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_date_time_values_on_data_as_date" '\
'ON "repository_date_time_values" (CAST("data" AS DATE)) WHERE "type" = \'RepositoryDateValue\';'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_date_time_values_on_data_as_date_time" '\
'ON "repository_date_time_values" ("data") WHERE "type" = \'RepositoryDateTimeValue\';'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_date_time_range_values_on_start_time_as_time" '\
'ON "repository_date_time_range_values" (CAST("start_time" AS TIME)) WHERE "type" = \'RepositoryTimeRangeValue\';'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_date_time_range_values_on_end_time_as_time" '\
'ON "repository_date_time_range_values" (CAST("end_time" AS TIME)) WHERE "type" = \'RepositoryTimeRangeValue\';'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_date_time_range_values_on_start_time_as_date" '\
'ON "repository_date_time_range_values" (CAST("start_time" AS DATE)) WHERE "type" = \'RepositoryDateRangeValue\';'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_date_time_range_values_on_end_time_as_date" '\
'ON "repository_date_time_range_values" (CAST("end_time" AS DATE)) WHERE "type" = \'RepositoryDateRangeValue\';'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_date_time_range_values_on_start_time_as_date_time" '\
'ON "repository_date_time_range_values" ("start_time") WHERE "type" = \'RepositoryDateTimeRangeValue\';'
)
ActiveRecord::Base.connection.execute(
'CREATE INDEX "index_repository_date_time_range_values_on_end_time_as_date_time" '\
'ON "repository_date_time_range_values" ("end_time") WHERE "type" = \'RepositoryDateTimeRangeValue\';'
)
end
def down
ActiveRecord::Base.connection.execute(
'DROP INDEX "index_repository_date_time_range_values_on_end_time_as_date_time";'
)
ActiveRecord::Base.connection.execute(
'DROP INDEX "index_repository_date_time_range_values_on_start_time_as_date_time";'
)
ActiveRecord::Base.connection.execute(
'DROP INDEX "index_repository_date_time_range_values_on_end_time_as_date";'
)
ActiveRecord::Base.connection.execute(
'DROP INDEX "index_repository_date_time_range_values_on_start_time_as_date";'
)
ActiveRecord::Base.connection.execute(
'DROP INDEX "index_repository_date_time_range_values_on_end_time_as_time";'
)
ActiveRecord::Base.connection.execute(
'DROP INDEX "index_repository_date_time_range_values_on_start_time_as_time";'
)
ActiveRecord::Base.connection.execute('DROP INDEX "index_repository_date_time_values_on_data_as_date_time";')
ActiveRecord::Base.connection.execute('DROP INDEX "index_repository_date_time_values_on_data_as_date";')
ActiveRecord::Base.connection.execute('DROP INDEX "index_repository_date_time_values_on_data_as_time";')
ActiveRecord::Base.connection.execute('DROP INDEX "index_repository_rows_on_archived_on_as_date_time_minutes";')
ActiveRecord::Base.connection.execute('DROP INDEX "index_repository_rows_on_created_at_as_date_time_minutes";')
add_index :repository_date_time_range_values, :end_time
add_index :repository_date_time_range_values, :start_time
end
end

View file

@ -5557,10 +5557,24 @@ CREATE INDEX index_repository_date_time_range_values_on_created_by_id ON public.
--
-- Name: index_repository_date_time_range_values_on_end_time; Type: INDEX; Schema: public; Owner: -
-- Name: index_repository_date_time_range_values_on_end_time_as_date; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_date_time_range_values_on_end_time ON public.repository_date_time_range_values USING btree (end_time);
CREATE INDEX index_repository_date_time_range_values_on_end_time_as_date ON public.repository_date_time_range_values USING btree (((end_time)::date)) WHERE ((type)::text = 'RepositoryDateRangeValue'::text);
--
-- Name: index_repository_date_time_range_values_on_end_time_as_date_tim; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_date_time_range_values_on_end_time_as_date_tim ON public.repository_date_time_range_values USING btree (end_time) WHERE ((type)::text = 'RepositoryDateTimeRangeValue'::text);
--
-- Name: index_repository_date_time_range_values_on_end_time_as_time; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_date_time_range_values_on_end_time_as_time ON public.repository_date_time_range_values USING btree (((end_time)::time without time zone)) WHERE ((type)::text = 'RepositoryTimeRangeValue'::text);
--
@ -5571,10 +5585,45 @@ CREATE INDEX index_repository_date_time_range_values_on_last_modified_by_id ON p
--
-- Name: index_repository_date_time_range_values_on_start_time; Type: INDEX; Schema: public; Owner: -
-- Name: index_repository_date_time_range_values_on_start_time_as_date; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_date_time_range_values_on_start_time ON public.repository_date_time_range_values USING btree (start_time);
CREATE INDEX index_repository_date_time_range_values_on_start_time_as_date ON public.repository_date_time_range_values USING btree (((start_time)::date)) WHERE ((type)::text = 'RepositoryDateRangeValue'::text);
--
-- Name: index_repository_date_time_range_values_on_start_time_as_date_t; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_date_time_range_values_on_start_time_as_date_t ON public.repository_date_time_range_values USING btree (start_time) WHERE ((type)::text = 'RepositoryDateTimeRangeValue'::text);
--
-- Name: index_repository_date_time_range_values_on_start_time_as_time; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_date_time_range_values_on_start_time_as_time ON public.repository_date_time_range_values USING btree (((start_time)::time without time zone)) WHERE ((type)::text = 'RepositoryTimeRangeValue'::text);
--
-- Name: index_repository_date_time_values_on_data_as_date; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_date_time_values_on_data_as_date ON public.repository_date_time_values USING btree (((data)::date)) WHERE ((type)::text = 'RepositoryDateValue'::text);
--
-- Name: index_repository_date_time_values_on_data_as_date_time; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_date_time_values_on_data_as_date_time ON public.repository_date_time_values USING btree (data) WHERE ((type)::text = 'RepositoryDateTimeValue'::text);
--
-- Name: index_repository_date_time_values_on_data_as_time; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_date_time_values_on_data_as_time ON public.repository_date_time_values USING btree (((data)::time without time zone)) WHERE ((type)::text = 'RepositoryTimeValue'::text);
--
@ -5661,6 +5710,20 @@ CREATE INDEX index_repository_number_values_on_last_modified_by_id ON public.rep
CREATE INDEX index_repository_rows_on_archived_by_id ON public.repository_rows USING btree (archived_by_id);
--
-- Name: index_repository_rows_on_archived_on_as_date_time_minutes; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_rows_on_archived_on_as_date_time_minutes ON public.repository_rows USING btree (date_trunc('minute'::text, archived_on));
--
-- Name: index_repository_rows_on_created_at_as_date_time_minutes; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_repository_rows_on_created_at_as_date_time_minutes ON public.repository_rows USING btree (date_trunc('minute'::text, created_at));
--
-- Name: index_repository_rows_on_external_id; Type: INDEX; Schema: public; Owner: -
--
@ -7914,6 +7977,7 @@ INSERT INTO "schema_migrations" (version) VALUES
('20210825112050'),
('20210906132120'),
('20211103115450'),
('20211123103711');
('20211123103711'),
('20220203122802');