Skip to content

Commit 42a869a

Browse files
authored
Merge pull request demarche-numerique#12511 from mfo/US/perf-api
amelioration API: demarche ac 246 champs conditionnels sur 312
2 parents d6f0245 + 8c9722b commit 42a869a

3 files changed

Lines changed: 51 additions & 2 deletions

File tree

app/models/concerns/champ_conditional_concern.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,21 @@ def submitted_filled?
3434

3535
def reset_visible # recompute after a dossier update
3636
remove_instance_variable :@visible if instance_variable_defined? :@visible
37+
remove_instance_variable :@champs_for_condition if instance_variable_defined? :@champs_for_condition
3738
end
3839

3940
private
4041

4142
def champs_for_condition
42-
dossier.filled_champs.filter { _1.row_id.nil? || _1.row_id == row_id }
43+
if row_id.nil?
44+
Array(filled_champs_by_row_id[nil])
45+
else
46+
Array(filled_champs_by_row_id[row_id]) + Array(filled_champs_by_row_id[nil])
47+
end
48+
end
49+
50+
def filled_champs_by_row_id
51+
@filled_champs_by_row_id ||= dossier.filled_champs.group_by(&:row_id)
4352
end
4453

4554
def parent_hidden?

app/models/procedure_revision_type_de_champ.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,19 @@ class ProcedureRevisionTypeDeChamp < ApplicationRecord
1414
scope :public_only, -> { joins(:type_de_champ).where(types_de_champ: { private: false }) }
1515
scope :private_only, -> { joins(:type_de_champ).where(types_de_champ: { private: true }) }
1616

17-
delegate :stable_id, :libelle, :description, :type_champ, :header_section?, :repetition?, :mandatory?, :public?, :private?, :to_typed_id, to: :type_de_champ
17+
delegate :libelle, :description, :type_champ, :header_section?, :repetition?, :mandatory?, :public?, :private?, :to_typed_id, to: :type_de_champ
1818
delegate :type_de_champ, to: :parent, prefix: true, allow_nil: true
1919

2020
default_scope { eager_load(:type_de_champ) }
2121

2222
def revision_types_de_champ = revision.revision_types_de_champ.filter { _1.persisted? ? _1.parent_id == id : _1.parent == self }.sort_by(&:position)
2323
def types_de_champ = revision_types_de_champ.map(&:type_de_champ)
2424

25+
# significant perf gain when accessed hundreds of thousands of times in API or export context
26+
def stable_id
27+
@stable_id ||= type_de_champ.stable_id
28+
end
29+
2530
def root?
2631
persisted? ? parent_id.nil? : parent.nil?
2732
end

lib/tasks/benchmarks.rake

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,41 @@ namespace :benchmarks do
4141
end
4242
end
4343

44+
desc 'graphql query - quick benchmark'
45+
task graphql_quick: :environment do
46+
query = API::V2::StoredQuery::QUERY_V2
47+
48+
procedure = Procedure.find(ENV.fetch('PROCEDURE_ID', 107325).to_i)
49+
administrateur = procedure.administrateurs.first
50+
51+
variables = { "demarcheNumber": procedure.id, "includeDossiers": true, "first": 20 }
52+
context = {
53+
administrateur_id: administrateur.id,
54+
procedure_ids: administrateur.procedure_ids,
55+
write_access: true,
56+
}
57+
operation_name = 'getDemarche'
58+
59+
Rails.application.routes.default_url_options[:only_path] = true
60+
61+
# Nombre d'itérations depuis env ou 1 par défaut
62+
iterations = ENV.fetch('ITERATIONS', 1).to_i
63+
64+
# Warmup
65+
puts "Warmup..."
66+
API::V2::Schema.execute(query:, variables:, context:, operation_name:)
67+
68+
puts "\nRunning #{iterations} iterations..."
69+
70+
Benchmark.bm(30) do |x|
71+
x.report("GraphQL API (#{iterations}x):") do
72+
iterations.times do
73+
API::V2::Schema.execute(query:, variables:, context:, operation_name:)
74+
end
75+
end
76+
end
77+
end
78+
4479
# Benchmark une action Rails spécifique, y compris le temps de génération des views.
4580
# Optionnellement, compare avec une autre implémentation de l’action
4681
# sur la même branche ou sur deux branches git.

0 commit comments

Comments
 (0)