Skip to content

Commit 80b1844

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

File tree

3 files changed

+30
-23
lines changed

3 files changed

+30
-23
lines changed

lib/gemstash/compact_index_builder.rb

+27-23
Original file line numberDiff line numberDiff line change
@@ -183,21 +183,30 @@ 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+
# group_by_columns = "number, platform, sha256, info_checksum, required_ruby_version, required_rubygems_version, versions.created_at"
187+
188+
# dep_req_agg = Sequel::SQL::StringAgg.new("dependencies.requirements", "@").
189+
# order("dependencies.rubygem_name", :id).
190+
# as(:dep_req_agg)
191+
192+
# dep_name_agg = Sequel::SQL::StringAgg.new("dependencies.rubygem_name", ",").
193+
# order("dependencies.rubygem_name").
194+
# as(:dep_name_agg)
195+
196+
group_by_columns = %i[number platform sha256 info_checksum required_ruby_version required_rubygems_version created_at].
197+
map {|c| DB::Version[c] }
198+
199+
DB::Rubygem.association_left_join(versions: :dependencies).
200+
where(name: @name).
201+
where { versions[:indexed] }.
202+
order { [versions[:created_at], versions[:number], versions[:platform], dep_name_agg] }.
203+
select_group do
204+
[versions[:number], versions[:platform], versions[:sha256], versions[:info_checksum], versions[:required_ruby_version], versions[:required_rubygems_version], versions[:created_at]]
205+
end. # rubocop:disable Style/MultilineBlockChain
206+
select_more do
207+
[string_agg(dependencies[:requirements], "@").order(dependencies[:rubygem_name], dependencies[:id]).as(:dep_req_agg),
208+
string_agg(dependencies[:rubygem_name], ",").order(dependencies[:rubygem_name]).as(:dep_name_agg)]
209+
end. # rubocop:disable Style/MultilineBlockChain
201210
map do |row|
202211
reqs = row[:dep_req_agg]&.split("@")
203212
dep_names = row[:dep_name_agg]&.split(",")
@@ -235,14 +244,9 @@ def fetch_resource
235244
end
236245

237246
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
247+
names = DB::Rubygem.association_join(:versions).
248+
where { versions[:indexed] }.
249+
order(:name).group(:name).select_map(:name)
246250
@result = CompactIndex.names(names).encode("UTF-8")
247251
end
248252

lib/gemstash/db/rubygem.rb

+2
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

+1
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)