Skip to content

Commit 0c3e854

Browse files
committed
Use Sequel builder methods for complex compact index queries
1 parent 02861e7 commit 0c3e854

File tree

3 files changed

+17
-23
lines changed

3 files changed

+17
-23
lines changed

lib/gemstash/compact_index_builder.rb

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -183,21 +183,17 @@ def build_result
183183
private
184184

185185
def requirements_and_dependencies
186-
group_by_columns = "number, platform, sha256, info_checksum, required_ruby_version, required_rubygems_version, versions.created_at"
187-
188-
dep_req_agg = "string_agg(dependencies.requirements, '@' ORDER BY dependencies.rubygem_name, dependencies.id) as dep_req_agg"
189-
190-
dep_name_agg = "string_agg(dependencies.rubygem_name, ',' ORDER BY dependencies.rubygem_name) AS dep_name_agg"
191-
192-
DB::Rubygem.db[<<~SQL.squish, @name].
193-
SELECT #{group_by_columns}, #{dep_req_agg}, #{dep_name_agg}
194-
FROM rubygems
195-
LEFT JOIN versions ON versions.rubygem_id = rubygems.id
196-
LEFT JOIN dependencies ON dependencies.version_id = versions.id
197-
WHERE rubygems.name = ? AND versions.indexed = true
198-
GROUP BY #{group_by_columns}
199-
ORDER BY versions.created_at, number, platform, dep_name_agg
200-
SQL
186+
DB::Rubygem.association_left_join(versions: :dependencies).
187+
where(name: @name).
188+
where { versions[:indexed] }.
189+
order { [versions[:created_at], versions[:number], versions[:platform], dep_name_agg] }.
190+
select_group do
191+
[versions[:number], versions[:platform], versions[:sha256], versions[:info_checksum], versions[:required_ruby_version], versions[:required_rubygems_version], versions[:created_at]]
192+
end. # rubocop:disable Style/MultilineBlockChain
193+
select_more do
194+
[string_agg(dependencies[:requirements], "@").order(dependencies[:rubygem_name], dependencies[:id]).as(:dep_req_agg),
195+
string_agg(dependencies[:rubygem_name], ",").order(dependencies[:rubygem_name]).as(:dep_name_agg)]
196+
end. # rubocop:disable Style/MultilineBlockChain
201197
map do |row|
202198
reqs = row[:dep_req_agg]&.split("@")
203199
dep_names = row[:dep_name_agg]&.split(",")
@@ -235,14 +231,9 @@ def fetch_resource
235231
end
236232

237233
def build_result
238-
names = DB::Rubygem.db[<<~SQL.squish].map {|row| row[:name] }
239-
SELECT name
240-
FROM rubygems
241-
INNER JOIN versions ON versions.rubygem_id = rubygems.id
242-
WHERE versions.indexed = true
243-
GROUP BY name
244-
ORDER BY name
245-
SQL
234+
names = DB::Rubygem.association_join(:versions).
235+
where { versions[:indexed] }.
236+
order(:name).group(:name).select_map(:name)
246237
@result = CompactIndex.names(names).encode("UTF-8")
247238
end
248239

lib/gemstash/db/rubygem.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ module Gemstash
66
module DB
77
# Sequel model for rubygems table.
88
class Rubygem < Sequel::Model
9+
one_to_many :versions
10+
911
def self.find_or_insert(spec)
1012
record = self[name: spec.name]
1113
return record.id if record

lib/gemstash/db/version.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module DB
77
# Sequel model for versions table.
88
class Version < Sequel::Model
99
many_to_one :rubygem
10+
one_to_many :dependencies
1011

1112
def deindex
1213
info = Gemstash::CompactIndexBuilder::Info.new(nil, rubygem.name).tap(&:build_result).result

0 commit comments

Comments
 (0)