Compare commits

...

2 Commits

Author SHA1 Message Date
King Kévin 69b32c6440 server: fix include children in search 2023-01-31 10:24:33 +01:00
King Kévin 5561d65b08 server: fix single thread search 2023-01-31 10:12:11 +01:00
1 changed files with 10 additions and 13 deletions

View File

@ -169,6 +169,7 @@ def search(terms)
statements << @db.prepare("SELECT id FROM part WHERE mpn LIKE ?") statements << @db.prepare("SELECT id FROM part WHERE mpn LIKE ?")
statements << @db.prepare("SELECT id FROM part WHERE description LIKE ?") statements << @db.prepare("SELECT id FROM part WHERE description LIKE ?")
statements << @db.prepare("SELECT property_value.part AS id FROM property_value JOIN property ON property.id = property_value.property WHERE property.name = 'category' AND property_value.value LIKE ?") statements << @db.prepare("SELECT property_value.part AS id FROM property_value JOIN property ON property.id = property_value.property WHERE property.name = 'category' AND property_value.value LIKE ?")
children = @db.prepare("SELECT id FROM part WHERE family = ?")
term_ids = [] term_ids = []
terms.each do |term| terms.each do |term|
ids = Set.new ids = Set.new
@ -176,17 +177,13 @@ def search(terms)
statements.each do |statement| statements.each do |statement|
statement.execute("%#{term}%").each do |row| statement.execute("%#{term}%").each do |row|
ids << row["id"] ids << row["id"]
children.execute(row["id"]).each do |child|
ids << child["id"]
end
end end
end end
term_ids << ids term_ids << ids
end end
# get all children
statement = @db.prepare("SELECT id FROM part WHERE family IN (?)")
term_ids.each do |term_id|
statement.execute(term_id.to_a * ",").each do |row|
term_id << row["id"]
end
end
# AND terms # AND terms
ids = term_ids.shift ids = term_ids.shift
term_ids.each do |term_id| term_ids.each do |term_id|
@ -199,25 +196,25 @@ def search(terms)
end end
get '/search/:terms' do get '/search/:terms' do
halt 429 if true == @searching halt 429 if $searching
terms = params['terms'].split(" ") terms = params['terms'].split(" ")
terms.keep_if {|term| term.length >= 3} terms.keep_if {|term| term.length >= 3}
halt 400 if terms.empty? halt 400 if terms.empty?
@searching = true $searching = true
parts = search(terms) parts = search(terms)
@searching = false $searching = false
parts.to_json parts.to_json
end end
get '/search?' do get '/search?' do
halt 429 if true == @searching halt 429 if $searching
halt 400, "terms needed" unless params['terms'] halt 400, "terms needed" unless params['terms']
terms = params['terms'].split(" ") terms = params['terms'].split(" ")
terms.keep_if {|term| term.length >= 3} terms.keep_if {|term| term.length >= 3}
halt 400 if terms.empty? halt 400 if terms.empty?
@searching = true $searching = true
parts = search(terms) parts = search(terms)
@searching = false $searching = false
parts.to_json parts.to_json
end end