Module: Kaisoku::TestMap::DependencyQueries

Included in:
Kaisoku::TestMap
Defined in:
lib/kaisoku/test_map/dependency_queries.rb

Instance Method Summary collapse

Instance Method Details

#checksums_for_file(path) ⇒ Object



15
16
17
18
# File 'lib/kaisoku/test_map/dependency_queries.rb', line 15

def checksums_for_file(path)
  file = configuration.relative_path(path)
  @db.execute('SELECT DISTINCT checksum FROM deps WHERE dep_file = ?', [file]).map { |row| row['checksum'] }
end

#dependencies_for(entity) ⇒ Object



6
7
8
9
10
11
12
13
# File 'lib/kaisoku/test_map/dependency_queries.rb', line 6

def dependencies_for(entity)
  id = entity_id(entity)
  return {} unless id

  @db.execute('SELECT dep_file, checksum FROM deps WHERE entity_id = ?', [id]).to_h do |row|
    [row['dep_file'], row['checksum']]
  end
end

#dependency_entity_count(path, adapter: nil) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/kaisoku/test_map/dependency_queries.rb', line 48

def dependency_entity_count(path, adapter: nil)
  file = configuration.relative_path(path)
  adapter_clause = adapter ? 'AND entities.adapter = ?' : ''
  bind = adapter ? [file, adapter.to_s] : [file]
  sql = <<~SQL
    SELECT COUNT(DISTINCT deps.entity_id)
    FROM deps
    INNER JOIN entities ON entities.id = deps.entity_id
    WHERE deps.dep_file = ?
    #{adapter_clause}
  SQL
  @db.get_first_value(sql, bind).to_i
end

#entities_for_changed_files(paths, adapter: nil) ⇒ Object



27
28
29
30
# File 'lib/kaisoku/test_map/dependency_queries.rb', line 27

def entities_for_changed_files(paths, adapter: nil)
  files = paths.map { |path| configuration.relative_path(path) }.uniq
  entities_for_dependency_keys(files, adapter: adapter)
end

#entities_for_dependency_keys(keys, adapter: nil) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/kaisoku/test_map/dependency_queries.rb', line 32

def entities_for_dependency_keys(keys, adapter: nil)
  return [] if keys.empty?

  adapter_clause = adapter ? 'AND entities.adapter = ?' : ''
  bind = adapter ? keys + [adapter.to_s] : keys
  sql = <<~SQL
    SELECT DISTINCT entities.*
    FROM entities
    INNER JOIN deps ON deps.entity_id = entities.id
    WHERE deps.dep_file IN (#{placeholders(keys)})
    #{adapter_clause}
    ORDER BY entities.file ASC, entities.identifier ASC
  SQL
  @db.execute(sql, bind).map { |row| entity_from_row(row) }
end

#entities_with_dependency_prefixes(prefixes, adapter: nil) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/kaisoku/test_map/dependency_queries.rb', line 62

def entities_with_dependency_prefixes(prefixes, adapter: nil)
  return [] if prefixes.empty?

  clauses = prefixes.map { 'deps.dep_file LIKE ?' }.join(' OR ')
  bind = prefixes.map { |prefix| "#{prefix}%" }
  adapter_clause = adapter ? 'AND entities.adapter = ?' : ''
  bind << adapter.to_s if adapter
  sql = <<~SQL
    SELECT DISTINCT entities.*
    FROM entities
    INNER JOIN deps ON deps.entity_id = entities.id
    WHERE (#{clauses})
    #{adapter_clause}
    ORDER BY entities.file ASC, entities.identifier ASC
  SQL
  @db.execute(sql, bind).map { |row| entity_from_row(row) }
end

#method_checksums_for_file(path) ⇒ Object



20
21
22
23
24
25
# File 'lib/kaisoku/test_map/dependency_queries.rb', line 20

def method_checksums_for_file(path)
  file = configuration.relative_path(path)
  @db.execute('SELECT dep_file, checksum FROM deps WHERE dep_file LIKE ?', ["#{file}#%"]).to_h do |row|
    [row['dep_file'], row['checksum']]
  end
end