drawio_dsl 0.8.9 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -0
  3. data/CHANGELOG.md +21 -0
  4. data/config/configuration.json +8 -8
  5. data/docs/domain-modal/domain_model_custom.drawio +2 -2
  6. data/docs/printspeak-architecture-controllers-custom.drawio +93 -0
  7. data/docs/printspeak-architecture-controllers-fat.svg +1 -0
  8. data/docs/printspeak-architecture-controllers-thin.svg +1 -0
  9. data/docs/printspeak-architecture-controllers.drawio +48 -0
  10. data/docs/printspeak-architecture-generator.drawio +106 -42
  11. data/docs/printspeak-architecture-generator.svg +1 -1
  12. data/docs/project-plan/project.drawio +88 -64
  13. data/docs/project-plan/project_done.svg +1 -1
  14. data/docs/project-plan/project_in_progress.svg +1 -1
  15. data/docs/project-plan/project_todo.svg +1 -1
  16. data/docs/samples/grid-direction-horizontal.svg +1 -1
  17. data/docs/samples/grid-direction-vertical.svg +1 -1
  18. data/lib/drawio_dsl/configuration.rb +81 -0
  19. data/lib/drawio_dsl/configuration_shapes.rb +2 -2
  20. data/lib/drawio_dsl/configuration_themes.rb +44 -44
  21. data/lib/drawio_dsl/dom_builder_shapes.rb +3 -3
  22. data/lib/drawio_dsl/drawio_shapes.rb +3 -3
  23. data/lib/drawio_dsl/schema/_.rb +55 -45
  24. data/lib/drawio_dsl/schema/diagram.rb +1 -1
  25. data/lib/drawio_dsl/schema/element.rb +23 -0
  26. data/lib/drawio_dsl/schema/{shapes/face.rb → elements/actor.rb} +2 -2
  27. data/lib/drawio_dsl/schema/{shapes/actor.rb → elements/actor2.rb} +2 -2
  28. data/lib/drawio_dsl/schema/{shapes/circle.rb → elements/callout.rb} +2 -2
  29. data/lib/drawio_dsl/schema/{shapes/callout.rb → elements/callout2.rb} +2 -2
  30. data/lib/drawio_dsl/schema/elements/callout3.rb +9 -0
  31. data/lib/drawio_dsl/schema/elements/callout4.rb +9 -0
  32. data/lib/drawio_dsl/schema/{shapes/cross.rb → elements/circle.rb} +2 -2
  33. data/lib/drawio_dsl/schema/elements/cloud.rb +9 -0
  34. data/lib/drawio_dsl/schema/elements/container.rb +9 -0
  35. data/lib/drawio_dsl/schema/elements/container2.rb +9 -0
  36. data/lib/drawio_dsl/schema/elements/container3.rb +9 -0
  37. data/lib/drawio_dsl/schema/elements/container4.rb +9 -0
  38. data/lib/drawio_dsl/schema/elements/cross.rb +9 -0
  39. data/lib/drawio_dsl/schema/elements/database.rb +9 -0
  40. data/lib/drawio_dsl/schema/{shapes/actor2.rb → elements/db_json.rb} +2 -2
  41. data/lib/drawio_dsl/schema/elements/diamond.rb +9 -0
  42. data/lib/drawio_dsl/schema/elements/document.rb +9 -0
  43. data/lib/drawio_dsl/schema/elements/ellipse.rb +9 -0
  44. data/lib/drawio_dsl/schema/elements/embed_col200.rb +9 -0
  45. data/lib/drawio_dsl/schema/elements/embed_col50.rb +9 -0
  46. data/lib/drawio_dsl/schema/{shapes/callout2.rb → elements/embed_row.rb} +2 -2
  47. data/lib/drawio_dsl/schema/elements/envelop.rb +9 -0
  48. data/lib/drawio_dsl/schema/elements/face.rb +9 -0
  49. data/lib/drawio_dsl/schema/elements/group.rb +9 -0
  50. data/lib/drawio_dsl/schema/elements/hexagon.rb +9 -0
  51. data/lib/drawio_dsl/schema/elements/interface.rb +9 -0
  52. data/lib/drawio_dsl/schema/elements/klass.rb +9 -0
  53. data/lib/drawio_dsl/schema/elements/note.rb +9 -0
  54. data/lib/drawio_dsl/schema/elements/process.rb +9 -0
  55. data/lib/drawio_dsl/schema/elements/rectangle.rb +9 -0
  56. data/lib/drawio_dsl/schema/elements/rectangle2.rb +9 -0
  57. data/lib/drawio_dsl/schema/{shapes/cloud.rb → elements/square.rb} +2 -2
  58. data/lib/drawio_dsl/schema/elements/step.rb +9 -0
  59. data/lib/drawio_dsl/schema/elements/tick.rb +9 -0
  60. data/lib/drawio_dsl/schema/elements/todo.rb +9 -0
  61. data/lib/drawio_dsl/schema/elements/triangle.rb +9 -0
  62. data/lib/drawio_dsl/schema/line.rb +24 -0
  63. data/lib/drawio_dsl/schema/lines/solid.rb +9 -0
  64. data/lib/drawio_dsl/schema/page.rb +8 -6
  65. data/lib/drawio_dsl/schema/{shapes/shape.rb → shape.rb} +14 -22
  66. data/lib/drawio_dsl/schema/text.rb +23 -0
  67. data/lib/drawio_dsl/schema/{shapes → texts}/h1.rb +2 -2
  68. data/lib/drawio_dsl/schema/{shapes → texts}/h2.rb +2 -2
  69. data/lib/drawio_dsl/schema/{shapes → texts}/h3.rb +2 -2
  70. data/lib/drawio_dsl/schema/{shapes → texts}/h4.rb +2 -2
  71. data/lib/drawio_dsl/schema/{shapes → texts}/h5.rb +2 -2
  72. data/lib/drawio_dsl/schema/{shapes → texts}/h6.rb +2 -2
  73. data/lib/drawio_dsl/schema/{shapes → texts}/p.rb +2 -2
  74. data/lib/drawio_dsl/version.rb +1 -1
  75. data/lib/drawio_dsl.rb +7 -9
  76. data/package-lock.json +2 -2
  77. data/package.json +1 -1
  78. metadata +54 -47
  79. data/lib/drawio_dsl/schema/shapes/callout3.rb +0 -9
  80. data/lib/drawio_dsl/schema/shapes/callout4.rb +0 -9
  81. data/lib/drawio_dsl/schema/shapes/container.rb +0 -9
  82. data/lib/drawio_dsl/schema/shapes/container2.rb +0 -9
  83. data/lib/drawio_dsl/schema/shapes/container3.rb +0 -9
  84. data/lib/drawio_dsl/schema/shapes/container4.rb +0 -9
  85. data/lib/drawio_dsl/schema/shapes/database.rb +0 -9
  86. data/lib/drawio_dsl/schema/shapes/db_json.rb +0 -9
  87. data/lib/drawio_dsl/schema/shapes/diamond.rb +0 -9
  88. data/lib/drawio_dsl/schema/shapes/document.rb +0 -9
  89. data/lib/drawio_dsl/schema/shapes/ellipse.rb +0 -9
  90. data/lib/drawio_dsl/schema/shapes/embed_col200.rb +0 -9
  91. data/lib/drawio_dsl/schema/shapes/embed_col50.rb +0 -9
  92. data/lib/drawio_dsl/schema/shapes/embed_row.rb +0 -9
  93. data/lib/drawio_dsl/schema/shapes/envelop.rb +0 -9
  94. data/lib/drawio_dsl/schema/shapes/group.rb +0 -9
  95. data/lib/drawio_dsl/schema/shapes/hexagon.rb +0 -9
  96. data/lib/drawio_dsl/schema/shapes/interface.rb +0 -9
  97. data/lib/drawio_dsl/schema/shapes/klass.rb +0 -9
  98. data/lib/drawio_dsl/schema/shapes/line.rb +0 -9
  99. data/lib/drawio_dsl/schema/shapes/note.rb +0 -9
  100. data/lib/drawio_dsl/schema/shapes/process.rb +0 -9
  101. data/lib/drawio_dsl/schema/shapes/rectangle.rb +0 -9
  102. data/lib/drawio_dsl/schema/shapes/rectangle2.rb +0 -9
  103. data/lib/drawio_dsl/schema/shapes/square.rb +0 -9
  104. data/lib/drawio_dsl/schema/shapes/step.rb +0 -9
  105. data/lib/drawio_dsl/schema/shapes/tick.rb +0 -9
  106. data/lib/drawio_dsl/schema/shapes/todo.rb +0 -9
  107. data/lib/drawio_dsl/schema/shapes/triangle.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 52304d0b7456dc14875a5efa1c23a381519f56df4bad75b064a1099661c1ffb7
4
- data.tar.gz: 36a50a3a283e532237818a90fe35eb2aa251e923a7adc4f10a43fedf008a8886
3
+ metadata.gz: 1c1ea476bcdeedbff0ddd9a333eaba42dd38eb0551800068d0d63fff70847ad9
4
+ data.tar.gz: '019f50e2d62c8d725931c4c69175c10e5e343bbe0b35ca6da344447aa837771e'
5
5
  SHA512:
6
- metadata.gz: c8f281fb7c93e1d144b3eb69f0e5439965b20ba715a9894a3cfb721c6dc4648d40be0a22228062277eb4268bb87465b61fb249ed5187a3e9738348910d40c0fb
7
- data.tar.gz: 5636ebd171bab8dd28ac59a066d969bdcaf84916680c66070531bdb36f5d5208f545792bc46cdd0d8e3b8e58a1e997c20b328c78342b41ea6aafe831528da99e
6
+ metadata.gz: 108f2aafe763bd48d701d2db7962cf681254ebd075fef46dcdabf2c21baa306db3d66b4286d6c4e8fc8c9a9ca0d9b68b077bdc6435c3f90e330f22b9766b6681
7
+ data.tar.gz: de6f4a79058462677df419f1fbaa61515951920c8f0309befff859641f98c371434229dfd75a74b4616482874a9c9bc766c455904c261f5728d043eaea77d072
data/.rubocop.yml CHANGED
@@ -67,6 +67,7 @@ Metrics/ModuleLength:
67
67
  Metrics/AbcSize:
68
68
  Exclude:
69
69
  - "lib/drawio_dsl/drawio_shapes.rb"
70
+ - "lib/drawio_dsl/configuration.rb"
70
71
  - "lib/drawio_dsl/configuration_shapes.rb"
71
72
  - "lib/drawio_dsl/configuration_themes.rb"
72
73
  Metrics/CyclomaticComplexity:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## [0.8.11](https://github.com/klueless-io/drawio_dsl/compare/v0.8.10...v0.8.11) (2022-03-23)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * configuration for lines and texts ([300a51a](https://github.com/klueless-io/drawio_dsl/commit/300a51a357db48ca32c50df128163af1ba24eefb))
7
+
8
+ ## [0.8.10](https://github.com/klueless-io/drawio_dsl/compare/v0.8.9...v0.8.10) (2022-03-23)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * configuration for elements ([ff2b64a](https://github.com/klueless-io/drawio_dsl/commit/ff2b64a50ea7a1504b41e2ca65f281253e582afb))
14
+
15
+ ## [0.8.9](https://github.com/klueless-io/drawio_dsl/compare/v0.8.8...v0.8.9) (2022-03-22)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * configuration for line strokes, connector compass [direction, design, arrows, waypoints] ([f2cd8a7](https://github.com/klueless-io/drawio_dsl/commit/f2cd8a70904054909dcce10535dcab2d6013136d))
21
+
1
22
  ## [0.8.8](https://github.com/klueless-io/drawio_dsl/compare/v0.8.7...v0.8.8) (2022-03-21)
2
23
 
3
24
 
@@ -209,7 +209,7 @@
209
209
  },
210
210
  "shapes": [
211
211
  {
212
- "type": "line",
212
+ "type": "solid",
213
213
  "category": "line",
214
214
  "x": 0,
215
215
  "y": 0,
@@ -224,7 +224,7 @@
224
224
  "y": 0,
225
225
  "w": 100,
226
226
  "h": 50,
227
- "style_modifiers": "text;fontSize=89;fontColor=#ffffff;fontStyle=1;fillColor=none"
227
+ "style_modifiers": "text;fontSize=89;fontStyle=1;fillColor=none"
228
228
  },
229
229
  {
230
230
  "type": "h2",
@@ -233,7 +233,7 @@
233
233
  "y": 0,
234
234
  "w": 100,
235
235
  "h": 50,
236
- "style_modifiers": "text;fontSize=67;fontColor=#ffffff;fontStyle=1;fillColor=none"
236
+ "style_modifiers": "text;fontSize=67;fontStyle=1;fillColor=none"
237
237
  },
238
238
  {
239
239
  "type": "h3",
@@ -242,7 +242,7 @@
242
242
  "y": 0,
243
243
  "w": 100,
244
244
  "h": 50,
245
- "style_modifiers": "text;fontSize=50;fontColor=#ffffff;fontStyle=1;fillColor=none"
245
+ "style_modifiers": "text;fontSize=50;fontStyle=1;fillColor=none"
246
246
  },
247
247
  {
248
248
  "type": "h4",
@@ -251,7 +251,7 @@
251
251
  "y": 0,
252
252
  "w": 100,
253
253
  "h": 50,
254
- "style_modifiers": "text;fontSize=37;fontColor=#ffffff;fontStyle=1;fillColor=none"
254
+ "style_modifiers": "text;fontSize=37;fontStyle=1;fillColor=none"
255
255
  },
256
256
  {
257
257
  "type": "h5",
@@ -260,7 +260,7 @@
260
260
  "y": 0,
261
261
  "w": 100,
262
262
  "h": 50,
263
- "style_modifiers": "text;fontSize=28;fontColor=#ffffff;fontStyle=1;fillColor=none"
263
+ "style_modifiers": "text;fontSize=28;fontStyle=1;fillColor=none"
264
264
  },
265
265
  {
266
266
  "type": "h6",
@@ -269,7 +269,7 @@
269
269
  "y": 0,
270
270
  "w": 100,
271
271
  "h": 50,
272
- "style_modifiers": "text;fontSize=21;fontColor=#ffffff;fontStyle=1;fillColor=none"
272
+ "style_modifiers": "text;fontSize=21;fontStyle=1;fillColor=none"
273
273
  },
274
274
  {
275
275
  "type": "p",
@@ -278,7 +278,7 @@
278
278
  "y": 0,
279
279
  "w": 100,
280
280
  "h": 50,
281
- "style_modifiers": "text;fontSize=16;fontColor=#ffffff;fontStyle=1;fillColor=none"
281
+ "style_modifiers": "text;fontSize=16;fontStyle=1;fillColor=none"
282
282
  },
283
283
  {
284
284
  "type": "actor",
@@ -1,6 +1,6 @@
1
1
  <mxfile host="65bd71144e">
2
2
  <diagram id="9JO" name="Domain Modal">
3
- <mxGraphModel dx="1347" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#FFFFFF" math="0" shadow="0">
3
+ <mxGraphModel dx="1172" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#FFFFFF" math="0" shadow="0">
4
4
  <root>
5
5
  <mxCell id="page_root_9JO"/>
6
6
  <mxCell id="node_root_9JO" parent="page_root_9JO"/>
@@ -330,7 +330,7 @@
330
330
  <mxGeometry relative="1" as="geometry"/>
331
331
  </mxCell>
332
332
  <mxCell id="1" value="" style="group" vertex="1" connectable="0" parent="node_root_9JO">
333
- <mxGeometry x="35" y="28" width="569" height="347" as="geometry"/>
333
+ <mxGeometry x="35" y="35" width="569" height="347" as="geometry"/>
334
334
  </mxCell>
335
335
  <mxCell id="p1n56-78arLZspwxZ9LU-1" value="Configuration" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;verticalAlign=top;fontSize=20;" parent="1" vertex="1">
336
336
  <mxGeometry width="569" height="347" as="geometry"/>
@@ -0,0 +1,93 @@
1
+ <mxfile host="65bd71144e">
2
+ <diagram id="hn6" name="Fat Controllers">
3
+ <mxGraphModel dx="932" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
4
+ <root>
5
+ <mxCell id="page_root_hn6"/>
6
+ <mxCell id="node_root_hn6" parent="page_root_hn6"/>
7
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-5" value="" style="whiteSpace=wrap;html=1;align=left;fillColor=#eeeeee;rounded=0;strokeColor=#36393d;" vertex="1" parent="node_root_hn6">
8
+ <mxGeometry x="396" y="354" width="450" height="205" as="geometry"/>
9
+ </mxCell>
10
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-3" value="" style="whiteSpace=wrap;html=1;align=left;fillColor=#eeeeee;rounded=0;strokeColor=#36393d;" vertex="1" parent="node_root_hn6">
11
+ <mxGeometry x="396" y="137" width="450" height="205" as="geometry"/>
12
+ </mxCell>
13
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-1" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1.008;exitY=0.43;exitDx=0;exitDy=0;entryX=-0.004;entryY=0.53;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2" target="hn6-4">
14
+ <mxGeometry relative="1" as="geometry"/>
15
+ </mxCell>
16
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-2" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1;exitY=0.596;exitDx=0;exitDy=0;entryX=0.011;entryY=0.663;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2" target="hn6-5">
17
+ <mxGeometry relative="1" as="geometry"/>
18
+ </mxCell>
19
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-7" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1;exitY=0.913;exitDx=0;exitDy=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2" target="hn6-7">
20
+ <mxGeometry relative="1" as="geometry"/>
21
+ </mxCell>
22
+ <mxCell id="hn6-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Reports#sales_by_profit&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h3 style=&quot;margin:0px;margin-left:4px;margin-bottom:6.912px&quot;&gt;Fat Controller&lt;/h3&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Param marshalling&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_from]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_to]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort] || &quot;gross_sales&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction] || &quot;desc&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:filter_str]&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Dynamic query construction&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;switch params[:filter_str]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;invoice_date_query&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ugly query&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Query in controller&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ActiveRecord::Base.connection.execute(query)&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Build outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@net_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@vat_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@gross_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@document_data&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Composite outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction]&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_hn6" vertex="1">
23
+ <mxGeometry x="35" y="74" width="255" height="427" as="geometry"/>
24
+ </mxCell>
25
+ <mxCell id="hn6-3" value="&lt;b&gt;Paramater marshalling&lt;/b&gt;&lt;br&gt;&lt;br&gt;reading the params[] object&lt;br&gt;setting sane defaults&lt;br&gt;&lt;i&gt;should not alter and reuse params[]&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_hn6" vertex="1">
26
+ <mxGeometry x="407" y="13" width="200" height="120" as="geometry"/>
27
+ </mxCell>
28
+ <mxCell id="hn6-4" value="&lt;b&gt;Dynamic query construction&lt;/b&gt;&lt;br&gt;&lt;br&gt;query = &quot;select ...&quot;&lt;br&gt;&lt;i&gt;ActiveRelation vs interpolation&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_hn6" vertex="1">
29
+ <mxGeometry x="407" y="149" width="200" height="120" as="geometry"/>
30
+ </mxCell>
31
+ <mxCell id="hn6-5" value="&lt;b&gt;Query in controller&lt;/b&gt;&lt;br&gt;&lt;i&gt;Move out to Query object&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_hn6" vertex="1">
32
+ <mxGeometry x="635" y="202" width="200" height="120" as="geometry"/>
33
+ </mxCell>
34
+ <mxCell id="hn6-6" value="&lt;b&gt;Build outputs&lt;/b&gt;&lt;br&gt;Multiple @instance vars&lt;br&gt;&lt;i&gt;single view model @vm&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_hn6" vertex="1">
35
+ <mxGeometry x="407" y="363" width="200" height="83" as="geometry"/>
36
+ </mxCell>
37
+ <mxCell id="hn6-7" value="&lt;b&gt;Composite outputs&lt;/b&gt;&lt;br&gt;sort, direction, page_no, page_size&lt;br&gt;&lt;i&gt;single order, page or list object&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_hn6" vertex="1">
38
+ <mxGeometry x="635" y="429" width="200" height="120" as="geometry"/>
39
+ </mxCell>
40
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-0" style="edgeStyle=none;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;fillColor=#f8cecc;strokeColor=#b85450;entryX=0.021;entryY=0.455;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2" target="hn6-3">
41
+ <mxGeometry relative="1" as="geometry">
42
+ <mxPoint x="321" y="216" as="sourcePoint"/>
43
+ <mxPoint x="448" y="161.7312775330396" as="targetPoint"/>
44
+ </mxGeometry>
45
+ </mxCell>
46
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-6" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=0.997;exitY=0.796;exitDx=0;exitDy=0;entryX=-0.004;entryY=0.53;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2">
47
+ <mxGeometry relative="1" as="geometry">
48
+ <mxPoint x="289.99999999999994" y="418.01" as="sourcePoint"/>
49
+ <mxPoint x="409.16" y="417" as="targetPoint"/>
50
+ </mxGeometry>
51
+ </mxCell>
52
+ </root>
53
+ </mxGraphModel>
54
+ </diagram>
55
+ <diagram id="mBj" name="Thin Controllers">
56
+ <mxGraphModel dx="932" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
57
+ <root>
58
+ <mxCell id="page_root_mBj"/>
59
+ <mxCell id="node_root_mBj" parent="page_root_mBj"/>
60
+ <mxCell id="21RrXMzRurO5l1FjHA6U-0" style="edgeStyle=none;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;fillColor=#f8cecc;strokeColor=#b85450;" parent="node_root_mBj" source="mBj-2" target="mBj-3" edge="1">
61
+ <mxGeometry relative="1" as="geometry"/>
62
+ </mxCell>
63
+ <mxCell id="21RrXMzRurO5l1FjHA6U-1" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.027;entryY=0.547;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;" parent="node_root_mBj" source="mBj-2" target="mBj-4" edge="1">
64
+ <mxGeometry relative="1" as="geometry"/>
65
+ </mxCell>
66
+ <mxCell id="21RrXMzRurO5l1FjHA6U-2" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0.017;entryY=0.455;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;" parent="node_root_mBj" source="mBj-2" target="mBj-5" edge="1">
67
+ <mxGeometry relative="1" as="geometry"/>
68
+ </mxCell>
69
+ <mxCell id="21RrXMzRurO5l1FjHA6U-5" style="edgeStyle=none;shape=connector;rounded=1;html=1;entryX=0.002;entryY=0.48;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitX=0.987;exitY=1.02;exitDx=0;exitDy=0;exitPerimeter=0;" parent="node_root_mBj" source="mBj-3" target="21RrXMzRurO5l1FjHA6U-4" edge="1">
70
+ <mxGeometry relative="1" as="geometry"/>
71
+ </mxCell>
72
+ <mxCell id="mBj-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Reports#sales_by_profit&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h3 style=&quot;margin:0px;margin-left:4px;margin-bottom:6.912px&quot;&gt;Thin Controller&lt;/h3&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Param marshalling&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;my_action_params()&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Call query&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;MyActionQuery.query(scope, **inputs)&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Present&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@vm = MyActionPresenter.new(**outputs)&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_mBj" vertex="1">
73
+ <mxGeometry x="72" y="167" width="249" height="196" as="geometry"/>
74
+ </mxCell>
75
+ <mxCell id="mBj-3" value="&lt;b&gt;Param marshaling&lt;/b&gt;&lt;br&gt;&lt;br&gt;@sales_by_profit_params ||= &lt;br&gt;params.permit(...)&lt;br&gt;&amp;nbsp;&amp;nbsp;.symbolize_keys" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_mBj" vertex="1">
76
+ <mxGeometry x="448" y="59" width="200" height="120" as="geometry"/>
77
+ </mxCell>
78
+ <mxCell id="mBj-4" value="&lt;b&gt;Call Query&lt;/b&gt;&lt;br&gt;&lt;br&gt;SalesByProfitQuery&lt;br&gt;&amp;nbsp;&amp;nbsp;.query(scope, **custom, **params)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_mBj" vertex="1">
79
+ <mxGeometry x="448" y="202" width="200" height="120" as="geometry"/>
80
+ </mxCell>
81
+ <mxCell id="mBj-5" value="&lt;b&gt;Present&lt;/b&gt;&lt;br&gt;&lt;br&gt;SalesByProfitPresenter&lt;br&gt;&amp;nbsp;&amp;nbsp;.new(**query.outputs)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_mBj" vertex="1">
82
+ <mxGeometry x="448" y="351" width="200" height="120" as="geometry"/>
83
+ </mxCell>
84
+ <mxCell id="21RrXMzRurO5l1FjHA6U-3" value="&lt;b&gt;Form Object&lt;/b&gt;&lt;br&gt;&lt;br&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_mBj" vertex="1">
85
+ <mxGeometry x="671" y="59" width="200" height="53" as="geometry"/>
86
+ </mxCell>
87
+ <mxCell id="21RrXMzRurO5l1FjHA6U-4" value="&lt;b&gt;Query#contract&lt;/b&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_mBj" vertex="1">
88
+ <mxGeometry x="671" y="169" width="200" height="53" as="geometry"/>
89
+ </mxCell>
90
+ </root>
91
+ </mxGraphModel>
92
+ </diagram>
93
+ </mxfile>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="812px" height="547px" viewBox="-0.5 -0.5 812 547" content="&lt;mxfile&gt;&lt;diagram id=&quot;hn6&quot; name=&quot;Fat Controllers&quot;&gt;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&lt;/diagram&gt;&lt;diagram id=&quot;mBj&quot; name=&quot;Thin Controllers&quot;&gt;7Vlbb+I4GP01SG2lRrkDj0CH6Us1nXZX231CTmIgrRNnHAfI/Pr97DiQGwxlaTvabVuV+Ph+vmMfx/SsSbT5ylCyvKMBJj1TDzY966ZnmkPLhP8CyAvAGVgFsGBhUED6DngMf+ICNEo0CwOcKqyAOKWEh0kd9GkcY5/XMMQYXdeLzSkJakCCFrgFPPqItNG/woAvFWq4w13GLQ4XS9X1wOwXGR7yXxaMZrHqr2dacyR+i+wIlW2piaZLFNB1BbK+9KwJo5QXT9FmgomgtqRN9DwT+bNo/CzbmO4pGUNQ6iVh2AzH/LUNmcYDe7r7+ZCxbw4xps+3I/fP63L8PC85wwFQqJIxjeFjvOQRgZQBj3gT8qfK89/wrGumo5I3Qjl6mchVYh4SMqGEMtmDNR/42PcBTzmjL7iS4w0c2xE12vPsoCGlGfPVqAG8VmLliC0w38FKsmJeFVUojr5iGmHOcijAMEE8XNWlg5QCF9tyO4bhQZH8CsKNYwgHOSUiqdaFoGcs1YgDxf0vQ3I4IkAry59kQR00rwBV094Cu8oyVat9j1kIlGCmQII8TMbbdVNGNcBzlBEuVEBjPkVRSEQzt5isMA99pDLU3mEYKt2ujuNgJLYEQQtBaRoeVtA+zZ1TWfZvpSzznZTVP15aRkNatuN8SusoaTm/lbSc80urohLdbKhk8B8WSbmmdG046FfWlaEVNOxfV5BozvkkxVltxXUG/cN2t8qyWCGS4fII5so4JDUhuj8yccYaRzCbMO5ZIz3ZbJPXBM8hc2RXMY9yTqMtyvGGXyMSLkRlH3gEcretwtNCfcq+vRJ4wAllPIXApnDYTGdePksYnYe8LAlz9Jq1AUua2JKJ6ZQH57JfozqEaauOdS4KXG1omJDTmvAfS2jJ1CewEhglRHJSzkF03xiQc7aYaIOu4dwjhiJ57mawyxASxovqgJzmgM6qkdZoonyGfB7SeJaIcaUXlwcj/NbkTJBcPT8yLJbZh7Fyl48kKd/FODQ5movUp2AJJqx4/eoqjJOMp4e5OmU1vLn4GE7F/vpx1PZsfSXkLxvXS6LVuDDTYry+uLqiGT9AcMO/18uQ48cESWNYw8t/3Z53vt3lZXPsdr+/Bf2hp+sNCwW8+AFcbbQ3BQdjusJsTqSnij4aXmzuN+1jfA/ahs39oHWp3L5yG3XLYbjqFmC9uzMwbXVlsKxcFxhD9zxuZ+11u62JNLbA+g7YshqPHUBsvWFaah8TCutPxJ/UWbtmUUxLMItCfqFp2mVnfygSaoq9NOlIa2keeZRAiGcvOE/PKszAwYPA7hLmwPQs1z0gzPLwGm0W4iZM8xAc8DSf0CyYMXE1dV7F2XDGrUrOGbYVp+sdiisvnP6t4uxfK075yveGr7xKa49CaOP8Xsqs1tIrFNPhJX6Wiv1SpQpdXn5qSQnHfGcxOUdsXy0TPV1HW+M7QUuFVUpFaTvD/NQNPFmO8Y666XzlPMIHp5QJG/zmPUtGTrTA/2fE3b5xkus41hvF+wgXUqZh+eJVFO0L+Wc45bn17eIJyd23WTKv8o2h9eUf&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(250, 250, 250);"><defs/><g><rect x="361" y="341" width="450" height="205" fill="#eeeeee" stroke="#36393d" pointer-events="all"/><rect x="361" y="124" width="450" height="205" fill="#eeeeee" stroke="#36393d" pointer-events="all"/><path d="M 257.04 244.61 L 365.28 201.94" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 370.16 200.01 L 364.93 205.83 L 365.28 201.94 L 362.36 199.32 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/><path d="M 255 315.49 L 595.89 269.41" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 601.09 268.71 L 594.62 273.12 L 595.89 269.41 L 593.69 266.18 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/><path d="M 255 450.85 L 593.64 469.99" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 598.88 470.29 L 591.7 473.38 L 593.64 469.99 L 592.09 466.4 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="61" width="255" height="427" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 257px; height: 427px; padding-top: 61px; margin-left: 0px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left; width: 255px; height: 427px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;"><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px ; text-align: center"><b>Reports#sales_by_profit</b></p><hr size="1" /><h3 style="margin: 0px ; margin-left: 4px ; margin-bottom: 6.912px">Fat Controller</h3><h5 style="margin: 0px ; margin-left: 4px ; margin-bottom: 4.8px">Param marshalling</h5><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">params[:date_from]</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">params[:date_to]</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">params[:sort] || "gross_sales"</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">params[:direction] || "desc"</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">params[:filter_str]</p><h5 style="margin: 0px ; margin-left: 4px ; margin-bottom: 4.8px">Dynamic query construction</h5><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">switch params[:filter_str]</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">invoice_date_query</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">ugly query</p><hr size="1" /><h5 style="margin: 0px ; margin-left: 4px ; margin-bottom: 4.8px">Query in controller</h5><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">ActiveRecord::Base.connection.execute(query)</p><hr size="1" /><h5 style="margin: 0px ; margin-left: 4px ; margin-bottom: 4.8px">Build outputs</h5><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">@net_sales_total</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">@vat_total</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">@gross_sales_total</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">@document_data</p><h5 style="margin: 0px ; margin-left: 4px ; margin-bottom: 4.8px">Composite outputs</h5><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">params[:sort]</p><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">params[:direction]</p></div></div></div></foreignObject><text x="0" y="278" fill="#333333" font-family="Helvetica" font-size="12px">Reports#sales_by_profit...</text></switch></g><path d="M 379.96 0 C 375.57 0 372 2.6 372 5.8 C 372 7.55 373.1 9.21 374.97 10.32 C 373.09 11.41 372 13.08 372 14.83 C 372 16.59 373.1 18.25 374.97 19.35 C 373.09 20.45 372 22.11 372 23.86 C 372 25.62 373.1 27.28 374.97 28.38 C 373.09 29.48 372 31.14 372 32.9 C 372 34.65 373.1 36.32 374.97 37.42 C 373.09 38.51 372 40.18 372 41.93 C 372 43.69 373.1 45.35 374.97 46.45 C 373.09 47.55 372 49.21 372 50.97 C 372 52.72 373.1 54.38 374.97 55.48 C 373.09 56.58 372 58.24 372 60 C 372 61.76 373.1 63.42 374.97 64.51 C 373.09 65.61 372 67.28 372 69.03 C 372 70.79 373.1 72.45 374.97 73.55 C 373.09 74.65 372 76.31 372 78.07 C 372 79.82 373.1 81.48 374.97 82.58 C 373.09 83.68 372 85.34 372 87.1 C 372 88.86 373.1 90.52 374.97 91.61 C 373.09 92.72 372 94.38 372 96.13 C 372 97.89 373.1 99.55 374.97 100.65 C 373.09 101.74 372 103.41 372 105.17 C 372 106.92 373.1 108.58 374.97 109.68 C 373.09 110.78 372 112.45 372 114.2 C 372 117.4 375.57 120 379.96 120 C 382.62 120 385.12 119.03 386.59 117.41 C 388.06 119.03 390.55 120 393.22 120 C 395.84 120 398.3 119.05 399.79 117.48 C 401.27 119.05 403.72 120 406.35 120 C 408.97 120 411.43 119.05 412.91 117.48 C 414.39 119.05 416.85 120 419.47 120 C 422.1 120 424.55 119.05 426.04 117.48 C 427.52 119.05 429.97 120 432.6 120 C 435.23 120 437.68 119.05 439.17 117.48 C 440.65 119.05 443.1 120 445.73 120 C 448.35 120 450.81 119.05 452.3 117.48 C 453.78 119.05 456.23 120 458.85 120 C 461.48 120 463.94 119.05 465.42 117.48 C 466.91 119.05 469.36 120 471.98 120 C 474.61 120 477.06 119.05 478.55 117.48 C 480.04 119.05 482.48 120 485.11 120 C 487.73 120 490.2 119.05 491.68 117.48 C 493.16 119.05 495.61 120 498.24 120 C 500.86 120 503.33 119.05 504.8 117.48 C 506.29 119.05 508.75 120 511.36 120 C 514 120 516.45 119.05 517.93 117.48 C 519.42 119.05 521.87 120 524.5 120 C 527.12 120 529.58 119.05 531.06 117.48 C 532.54 119.05 535 120 537.62 120 C 540.25 120 542.71 119.05 544.18 117.48 C 545.67 119.05 548.13 120 550.75 120 C 553.42 120 555.92 119.01 557.4 117.39 C 558.86 119.02 561.36 120 564.04 120 C 568.43 120 572 117.4 572 114.2 C 572 112.45 570.91 110.79 569.03 109.68 C 570.91 108.59 572 106.92 572 105.17 C 572 103.41 570.91 101.75 569.03 100.65 C 570.91 99.55 572 97.89 572 96.13 C 572 94.38 570.91 92.72 569.03 91.62 C 570.91 90.52 572 88.86 572 87.1 C 572 85.35 570.91 83.69 569.03 82.58 C 570.91 81.49 572 79.82 572 78.07 C 572 76.31 570.91 74.65 569.03 73.55 C 570.91 72.45 572 70.79 572 69.03 C 572 67.28 570.91 65.62 569.03 64.52 C 570.91 63.42 572 61.76 572 60 C 572 58.25 570.91 56.58 569.03 55.49 C 570.91 54.38 572 52.72 572 50.97 C 572 49.21 570.91 47.55 569.03 46.45 C 570.91 45.35 572 43.69 572 41.93 C 572 40.18 570.91 38.52 569.03 37.42 C 570.91 36.32 572 34.66 572 32.9 C 572 31.14 570.91 29.48 569.03 28.39 C 570.91 27.28 572 25.62 572 23.86 C 572 22.11 570.91 20.45 569.03 19.35 C 570.91 18.25 572 16.59 572 14.83 C 572 13.08 570.91 11.42 569.03 10.32 C 570.91 9.22 572 7.55 572 5.8 C 572 2.6 568.43 0 564.04 0 C 561.37 0 558.86 0.99 557.4 2.61 C 555.93 0.98 553.42 0 550.75 0 C 548.12 0 545.66 0.95 544.18 2.52 C 542.7 0.95 540.24 0 537.62 0 C 534.99 0 532.53 0.95 531.05 2.52 C 529.57 0.95 527.11 0 524.5 0 C 521.86 0 519.41 0.95 517.92 2.52 C 516.44 0.95 513.99 0 511.36 0 C 508.74 0 506.28 0.95 504.79 2.52 C 503.32 0.95 500.86 0 498.24 0 C 495.61 0 493.15 0.95 491.67 2.52 C 490.19 0.95 487.73 0 485.11 0 C 482.48 0 480.03 0.95 478.54 2.52 C 477.06 0.95 474.61 0 471.98 0 C 469.36 0 466.9 0.95 465.41 2.52 C 463.94 0.95 461.48 0 458.85 0 C 456.23 0 453.77 0.95 452.29 2.52 C 450.81 0.95 448.35 0 445.73 0 C 443.1 0 440.65 0.95 439.16 2.52 C 437.67 0.95 435.23 0 432.6 0 C 429.97 0 427.52 0.95 426.03 2.52 C 424.55 0.95 422.1 0 419.47 0 C 416.85 0 414.39 0.95 412.91 2.52 C 411.42 0.95 408.97 0 406.35 0 C 403.72 0 401.26 0.95 399.78 2.52 C 398.29 0.95 395.84 0 393.22 0 C 390.55 0 388.06 0.97 386.59 2.59 C 385.12 0.97 382.62 0 379.96 0 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 60px; margin-left: 373px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Paramater marshalling</b><br /><br />reading the params[] object<br />setting sane defaults<br /><i>do not alter and reuse params[]</i></div></div></div></foreignObject><text x="472" y="64" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Paramater marshalling...</text></switch></g><path d="M 379.96 136 C 375.57 136 372 138.6 372 141.8 C 372 143.55 373.1 145.21 374.97 146.32 C 373.09 147.41 372 149.08 372 150.83 C 372 152.59 373.1 154.25 374.97 155.35 C 373.09 156.45 372 158.11 372 159.86 C 372 161.62 373.1 163.28 374.97 164.38 C 373.09 165.48 372 167.14 372 168.9 C 372 170.65 373.1 172.32 374.97 173.42 C 373.09 174.51 372 176.18 372 177.93 C 372 179.69 373.1 181.35 374.97 182.45 C 373.09 183.55 372 185.21 372 186.97 C 372 188.72 373.1 190.38 374.97 191.48 C 373.09 192.58 372 194.24 372 196 C 372 197.76 373.1 199.42 374.97 200.51 C 373.09 201.61 372 203.28 372 205.03 C 372 206.79 373.1 208.45 374.97 209.55 C 373.09 210.65 372 212.31 372 214.07 C 372 215.82 373.1 217.48 374.97 218.58 C 373.09 219.68 372 221.34 372 223.1 C 372 224.86 373.1 226.52 374.97 227.61 C 373.09 228.72 372 230.38 372 232.13 C 372 233.89 373.1 235.55 374.97 236.65 C 373.09 237.74 372 239.41 372 241.17 C 372 242.92 373.1 244.58 374.97 245.68 C 373.09 246.78 372 248.45 372 250.2 C 372 253.4 375.57 256 379.96 256 C 382.62 256 385.12 255.03 386.59 253.41 C 388.06 255.03 390.55 256 393.22 256 C 395.84 256 398.3 255.05 399.79 253.48 C 401.27 255.05 403.72 256 406.35 256 C 408.97 256 411.43 255.05 412.91 253.48 C 414.39 255.05 416.85 256 419.47 256 C 422.1 256 424.55 255.05 426.04 253.48 C 427.52 255.05 429.97 256 432.6 256 C 435.23 256 437.68 255.05 439.17 253.48 C 440.65 255.05 443.1 256 445.73 256 C 448.35 256 450.81 255.05 452.3 253.48 C 453.78 255.05 456.23 256 458.85 256 C 461.48 256 463.94 255.05 465.42 253.48 C 466.91 255.05 469.36 256 471.98 256 C 474.61 256 477.06 255.05 478.55 253.48 C 480.04 255.05 482.48 256 485.11 256 C 487.73 256 490.2 255.05 491.68 253.48 C 493.16 255.05 495.61 256 498.24 256 C 500.86 256 503.33 255.05 504.8 253.48 C 506.29 255.05 508.75 256 511.36 256 C 514 256 516.45 255.05 517.93 253.48 C 519.42 255.05 521.87 256 524.5 256 C 527.12 256 529.58 255.05 531.06 253.48 C 532.54 255.05 535 256 537.62 256 C 540.25 256 542.71 255.05 544.18 253.48 C 545.67 255.05 548.13 256 550.75 256 C 553.42 256 555.92 255.01 557.4 253.39 C 558.86 255.02 561.36 256 564.04 256 C 568.43 256 572 253.4 572 250.2 C 572 248.45 570.91 246.79 569.03 245.68 C 570.91 244.59 572 242.92 572 241.17 C 572 239.41 570.91 237.75 569.03 236.65 C 570.91 235.55 572 233.89 572 232.13 C 572 230.38 570.91 228.72 569.03 227.62 C 570.91 226.52 572 224.86 572 223.1 C 572 221.35 570.91 219.69 569.03 218.58 C 570.91 217.49 572 215.82 572 214.07 C 572 212.31 570.91 210.65 569.03 209.55 C 570.91 208.45 572 206.79 572 205.03 C 572 203.28 570.91 201.62 569.03 200.52 C 570.91 199.42 572 197.76 572 196 C 572 194.25 570.91 192.58 569.03 191.49 C 570.91 190.38 572 188.72 572 186.97 C 572 185.21 570.91 183.55 569.03 182.45 C 570.91 181.35 572 179.69 572 177.93 C 572 176.18 570.91 174.52 569.03 173.42 C 570.91 172.32 572 170.66 572 168.9 C 572 167.14 570.91 165.48 569.03 164.39 C 570.91 163.28 572 161.62 572 159.86 C 572 158.11 570.91 156.45 569.03 155.35 C 570.91 154.25 572 152.59 572 150.83 C 572 149.08 570.91 147.42 569.03 146.32 C 570.91 145.22 572 143.55 572 141.8 C 572 138.6 568.43 136 564.04 136 C 561.37 136 558.86 136.99 557.4 138.61 C 555.93 136.98 553.42 136 550.75 136 C 548.12 136 545.66 136.95 544.18 138.52 C 542.7 136.95 540.24 136 537.62 136 C 534.99 136 532.53 136.95 531.05 138.52 C 529.57 136.95 527.11 136 524.5 136 C 521.86 136 519.41 136.95 517.92 138.52 C 516.44 136.95 513.99 136 511.36 136 C 508.74 136 506.28 136.95 504.79 138.52 C 503.32 136.95 500.86 136 498.24 136 C 495.61 136 493.15 136.95 491.67 138.52 C 490.19 136.95 487.73 136 485.11 136 C 482.48 136 480.03 136.95 478.54 138.52 C 477.06 136.95 474.61 136 471.98 136 C 469.36 136 466.9 136.95 465.41 138.52 C 463.94 136.95 461.48 136 458.85 136 C 456.23 136 453.77 136.95 452.29 138.52 C 450.81 136.95 448.35 136 445.73 136 C 443.1 136 440.65 136.95 439.16 138.52 C 437.67 136.95 435.23 136 432.6 136 C 429.97 136 427.52 136.95 426.03 138.52 C 424.55 136.95 422.1 136 419.47 136 C 416.85 136 414.39 136.95 412.91 138.52 C 411.42 136.95 408.97 136 406.35 136 C 403.72 136 401.26 136.95 399.78 138.52 C 398.29 136.95 395.84 136 393.22 136 C 390.55 136 388.06 136.97 386.59 138.59 C 385.12 136.97 382.62 136 379.96 136 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 196px; margin-left: 373px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Dynamic query construction</b><br /><br />query = "select ..."<br /><i>ActiveRelation vs interpolation</i></div></div></div></foreignObject><text x="472" y="200" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Dynamic query construction...</text></switch></g><path d="M 607.96 189 C 603.57 189 600 191.6 600 194.8 C 600 196.55 601.1 198.21 602.97 199.32 C 601.09 200.41 600 202.08 600 203.83 C 600 205.59 601.1 207.25 602.97 208.35 C 601.09 209.45 600 211.11 600 212.86 C 600 214.62 601.1 216.28 602.97 217.38 C 601.09 218.48 600 220.14 600 221.9 C 600 223.65 601.1 225.32 602.97 226.42 C 601.09 227.51 600 229.18 600 230.93 C 600 232.69 601.1 234.35 602.97 235.45 C 601.09 236.55 600 238.21 600 239.97 C 600 241.72 601.1 243.38 602.97 244.48 C 601.09 245.58 600 247.24 600 249 C 600 250.76 601.1 252.42 602.97 253.51 C 601.09 254.61 600 256.28 600 258.03 C 600 259.79 601.1 261.45 602.97 262.55 C 601.09 263.65 600 265.31 600 267.07 C 600 268.82 601.1 270.48 602.97 271.58 C 601.09 272.68 600 274.34 600 276.1 C 600 277.86 601.1 279.52 602.97 280.61 C 601.09 281.72 600 283.38 600 285.13 C 600 286.89 601.1 288.55 602.97 289.65 C 601.09 290.74 600 292.41 600 294.17 C 600 295.92 601.1 297.58 602.97 298.68 C 601.09 299.78 600 301.45 600 303.2 C 600 306.4 603.57 309 607.96 309 C 610.62 309 613.12 308.03 614.59 306.41 C 616.06 308.03 618.55 309 621.22 309 C 623.84 309 626.3 308.05 627.79 306.48 C 629.27 308.05 631.72 309 634.35 309 C 636.97 309 639.43 308.05 640.91 306.48 C 642.39 308.05 644.85 309 647.47 309 C 650.1 309 652.55 308.05 654.04 306.48 C 655.52 308.05 657.97 309 660.6 309 C 663.23 309 665.68 308.05 667.17 306.48 C 668.65 308.05 671.1 309 673.73 309 C 676.35 309 678.81 308.05 680.3 306.48 C 681.78 308.05 684.23 309 686.85 309 C 689.48 309 691.94 308.05 693.42 306.48 C 694.91 308.05 697.36 309 699.98 309 C 702.61 309 705.06 308.05 706.55 306.48 C 708.04 308.05 710.48 309 713.11 309 C 715.73 309 718.2 308.05 719.68 306.48 C 721.16 308.05 723.61 309 726.24 309 C 728.86 309 731.33 308.05 732.8 306.48 C 734.29 308.05 736.75 309 739.36 309 C 742 309 744.45 308.05 745.93 306.48 C 747.42 308.05 749.87 309 752.5 309 C 755.12 309 757.58 308.05 759.06 306.48 C 760.54 308.05 763 309 765.62 309 C 768.25 309 770.71 308.05 772.18 306.48 C 773.67 308.05 776.13 309 778.75 309 C 781.42 309 783.92 308.01 785.4 306.39 C 786.86 308.02 789.36 309 792.04 309 C 796.43 309 800 306.4 800 303.2 C 800 301.45 798.91 299.79 797.03 298.68 C 798.91 297.59 800 295.92 800 294.17 C 800 292.41 798.91 290.75 797.03 289.65 C 798.91 288.55 800 286.89 800 285.13 C 800 283.38 798.91 281.72 797.03 280.62 C 798.91 279.52 800 277.86 800 276.1 C 800 274.35 798.91 272.69 797.03 271.58 C 798.91 270.49 800 268.82 800 267.07 C 800 265.31 798.91 263.65 797.03 262.55 C 798.91 261.45 800 259.79 800 258.03 C 800 256.28 798.91 254.62 797.03 253.52 C 798.91 252.42 800 250.76 800 249 C 800 247.25 798.91 245.58 797.03 244.49 C 798.91 243.38 800 241.72 800 239.97 C 800 238.21 798.91 236.55 797.03 235.45 C 798.91 234.35 800 232.69 800 230.93 C 800 229.18 798.91 227.52 797.03 226.42 C 798.91 225.32 800 223.66 800 221.9 C 800 220.14 798.91 218.48 797.03 217.39 C 798.91 216.28 800 214.62 800 212.86 C 800 211.11 798.91 209.45 797.03 208.35 C 798.91 207.25 800 205.59 800 203.83 C 800 202.08 798.91 200.42 797.03 199.32 C 798.91 198.22 800 196.55 800 194.8 C 800 191.6 796.43 189 792.04 189 C 789.37 189 786.86 189.99 785.4 191.61 C 783.93 189.98 781.42 189 778.75 189 C 776.12 189 773.66 189.95 772.18 191.52 C 770.7 189.95 768.24 189 765.62 189 C 762.99 189 760.53 189.95 759.05 191.52 C 757.57 189.95 755.11 189 752.5 189 C 749.86 189 747.41 189.95 745.92 191.52 C 744.44 189.95 741.99 189 739.36 189 C 736.74 189 734.28 189.95 732.79 191.52 C 731.32 189.95 728.86 189 726.24 189 C 723.61 189 721.15 189.95 719.67 191.52 C 718.19 189.95 715.73 189 713.11 189 C 710.48 189 708.03 189.95 706.54 191.52 C 705.06 189.95 702.61 189 699.98 189 C 697.36 189 694.9 189.95 693.41 191.52 C 691.94 189.95 689.48 189 686.85 189 C 684.23 189 681.77 189.95 680.29 191.52 C 678.81 189.95 676.35 189 673.73 189 C 671.1 189 668.65 189.95 667.16 191.52 C 665.67 189.95 663.23 189 660.6 189 C 657.97 189 655.52 189.95 654.03 191.52 C 652.55 189.95 650.1 189 647.47 189 C 644.85 189 642.39 189.95 640.91 191.52 C 639.42 189.95 636.97 189 634.35 189 C 631.72 189 629.26 189.95 627.78 191.52 C 626.29 189.95 623.84 189 621.22 189 C 618.55 189 616.06 189.97 614.59 191.59 C 613.12 189.97 610.62 189 607.96 189 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 249px; margin-left: 601px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Query in controller</b><br /><i>Move out to Query object</i></div></div></div></foreignObject><text x="700" y="253" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Query in controller...</text></switch></g><path d="M 379.96 350 C 375.57 350 372 351.8 372 354.01 C 372 355.23 373.1 356.37 374.97 357.14 C 373.09 357.89 372 359.05 372 360.26 C 372 361.47 373.1 362.62 374.97 363.38 C 373.09 364.14 372 365.29 372 366.51 C 372 367.72 373.1 368.87 374.97 369.63 C 373.09 370.39 372 371.54 372 372.75 C 372 373.97 373.1 375.12 374.97 375.88 C 373.09 376.64 372 377.79 372 379 C 372 380.22 373.1 381.37 374.97 382.13 C 373.09 382.89 372 384.04 372 385.25 C 372 386.47 373.1 387.61 374.97 388.37 C 373.09 389.14 372 390.28 372 391.5 C 372 392.72 373.1 393.86 374.97 394.62 C 373.09 395.38 372 396.53 372 397.75 C 372 398.96 373.1 400.11 374.97 400.87 C 373.09 401.63 372 402.78 372 404 C 372 405.21 373.1 406.36 374.97 407.12 C 373.09 407.88 372 409.03 372 410.25 C 372 411.46 373.1 412.61 374.97 413.37 C 373.09 414.13 372 415.28 372 416.49 C 372 417.7 373.1 418.86 374.97 419.61 C 373.09 420.37 372 421.53 372 422.74 C 372 423.95 373.1 425.1 374.97 425.86 C 373.09 426.62 372 427.77 372 428.99 C 372 431.2 375.57 433 379.96 433 C 382.62 433 385.12 432.33 386.59 431.21 C 388.06 432.33 390.55 433 393.22 433 C 395.84 433 398.3 432.35 399.79 431.26 C 401.27 432.35 403.72 433 406.35 433 C 408.97 433 411.43 432.35 412.91 431.26 C 414.39 432.35 416.85 433 419.47 433 C 422.1 433 424.55 432.35 426.04 431.26 C 427.52 432.35 429.97 433 432.6 433 C 435.23 433 437.68 432.35 439.17 431.26 C 440.65 432.35 443.1 433 445.73 433 C 448.35 433 450.81 432.35 452.3 431.26 C 453.78 432.35 456.23 433 458.85 433 C 461.48 433 463.94 432.35 465.42 431.26 C 466.91 432.35 469.36 433 471.98 433 C 474.61 433 477.06 432.35 478.55 431.26 C 480.04 432.35 482.48 433 485.11 433 C 487.73 433 490.2 432.35 491.68 431.26 C 493.16 432.35 495.61 433 498.24 433 C 500.86 433 503.33 432.35 504.8 431.26 C 506.29 432.35 508.75 433 511.36 433 C 514 433 516.45 432.35 517.93 431.26 C 519.42 432.35 521.87 433 524.5 433 C 527.12 433 529.58 432.35 531.06 431.26 C 532.54 432.35 535 433 537.62 433 C 540.25 433 542.71 432.35 544.18 431.26 C 545.67 432.35 548.13 433 550.75 433 C 553.42 433 555.92 432.32 557.4 431.19 C 558.86 432.32 561.36 433 564.04 433 C 568.43 433 572 431.2 572 428.99 C 572 427.77 570.91 426.63 569.03 425.86 C 570.91 425.11 572 423.95 572 422.74 C 572 421.53 570.91 420.38 569.03 419.62 C 570.91 418.86 572 417.71 572 416.49 C 572 415.28 570.91 414.13 569.03 413.37 C 570.91 412.61 572 411.46 572 410.25 C 572 409.03 570.91 407.88 569.03 407.12 C 570.91 406.36 572 405.21 572 404 C 572 402.78 570.91 401.63 569.03 400.87 C 570.91 400.11 572 398.96 572 397.75 C 572 396.53 570.91 395.39 569.03 394.63 C 570.91 393.86 572 392.72 572 391.5 C 572 390.29 570.91 389.14 569.03 388.38 C 570.91 387.61 572 386.47 572 385.25 C 572 384.04 570.91 382.89 569.03 382.13 C 570.91 381.37 572 380.22 572 379 C 572 377.79 570.91 376.64 569.03 375.88 C 570.91 375.12 572 373.97 572 372.75 C 572 371.54 570.91 370.39 569.03 369.63 C 570.91 368.87 572 367.72 572 366.51 C 572 365.29 570.91 364.14 569.03 363.39 C 570.91 362.62 572 361.47 572 360.26 C 572 359.05 570.91 357.9 569.03 357.14 C 570.91 356.38 572 355.23 572 354.01 C 572 351.8 568.43 350 564.04 350 C 561.37 350 558.86 350.68 557.4 351.81 C 555.93 350.68 553.42 350 550.75 350 C 548.12 350 545.66 350.65 544.18 351.74 C 542.7 350.65 540.24 350 537.62 350 C 534.99 350 532.53 350.65 531.05 351.74 C 529.57 350.65 527.11 350 524.5 350 C 521.86 350 519.41 350.65 517.92 351.74 C 516.44 350.65 513.99 350 511.36 350 C 508.74 350 506.28 350.65 504.79 351.74 C 503.32 350.65 500.86 350 498.24 350 C 495.61 350 493.15 350.65 491.67 351.74 C 490.19 350.65 487.73 350 485.11 350 C 482.48 350 480.03 350.65 478.54 351.74 C 477.06 350.65 474.61 350 471.98 350 C 469.36 350 466.9 350.65 465.41 351.74 C 463.94 350.65 461.48 350 458.85 350 C 456.23 350 453.77 350.65 452.29 351.74 C 450.81 350.65 448.35 350 445.73 350 C 443.1 350 440.65 350.65 439.16 351.74 C 437.67 350.65 435.23 350 432.6 350 C 429.97 350 427.52 350.65 426.03 351.74 C 424.55 350.65 422.1 350 419.47 350 C 416.85 350 414.39 350.65 412.91 351.74 C 411.42 350.65 408.97 350 406.35 350 C 403.72 350 401.26 350.65 399.78 351.74 C 398.29 350.65 395.84 350 393.22 350 C 390.55 350 388.06 350.67 386.59 351.79 C 385.12 350.67 382.62 350 379.96 350 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 392px; margin-left: 373px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Build outputs</b><br />Multiple @instance vars<br /><i>single view model @vm</i></div></div></div></foreignObject><text x="472" y="395" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Build outputs...</text></switch></g><path d="M 607.96 416 C 603.57 416 600 418.6 600 421.8 C 600 423.55 601.1 425.21 602.97 426.32 C 601.09 427.41 600 429.08 600 430.83 C 600 432.59 601.1 434.25 602.97 435.35 C 601.09 436.45 600 438.11 600 439.86 C 600 441.62 601.1 443.28 602.97 444.38 C 601.09 445.48 600 447.14 600 448.9 C 600 450.65 601.1 452.32 602.97 453.42 C 601.09 454.51 600 456.18 600 457.93 C 600 459.69 601.1 461.35 602.97 462.45 C 601.09 463.55 600 465.21 600 466.97 C 600 468.72 601.1 470.38 602.97 471.48 C 601.09 472.58 600 474.24 600 476 C 600 477.76 601.1 479.42 602.97 480.51 C 601.09 481.61 600 483.28 600 485.03 C 600 486.79 601.1 488.45 602.97 489.55 C 601.09 490.65 600 492.31 600 494.07 C 600 495.82 601.1 497.48 602.97 498.58 C 601.09 499.68 600 501.34 600 503.1 C 600 504.86 601.1 506.52 602.97 507.61 C 601.09 508.72 600 510.38 600 512.13 C 600 513.89 601.1 515.55 602.97 516.65 C 601.09 517.74 600 519.41 600 521.17 C 600 522.92 601.1 524.58 602.97 525.68 C 601.09 526.78 600 528.45 600 530.2 C 600 533.4 603.57 536 607.96 536 C 610.62 536 613.12 535.03 614.59 533.41 C 616.06 535.03 618.55 536 621.22 536 C 623.84 536 626.3 535.05 627.79 533.48 C 629.27 535.05 631.72 536 634.35 536 C 636.97 536 639.43 535.05 640.91 533.48 C 642.39 535.05 644.85 536 647.47 536 C 650.1 536 652.55 535.05 654.04 533.48 C 655.52 535.05 657.97 536 660.6 536 C 663.23 536 665.68 535.05 667.17 533.48 C 668.65 535.05 671.1 536 673.73 536 C 676.35 536 678.81 535.05 680.3 533.48 C 681.78 535.05 684.23 536 686.85 536 C 689.48 536 691.94 535.05 693.42 533.48 C 694.91 535.05 697.36 536 699.98 536 C 702.61 536 705.06 535.05 706.55 533.48 C 708.04 535.05 710.48 536 713.11 536 C 715.73 536 718.2 535.05 719.68 533.48 C 721.16 535.05 723.61 536 726.24 536 C 728.86 536 731.33 535.05 732.8 533.48 C 734.29 535.05 736.75 536 739.36 536 C 742 536 744.45 535.05 745.93 533.48 C 747.42 535.05 749.87 536 752.5 536 C 755.12 536 757.58 535.05 759.06 533.48 C 760.54 535.05 763 536 765.62 536 C 768.25 536 770.71 535.05 772.18 533.48 C 773.67 535.05 776.13 536 778.75 536 C 781.42 536 783.92 535.01 785.4 533.39 C 786.86 535.02 789.36 536 792.04 536 C 796.43 536 800 533.4 800 530.2 C 800 528.45 798.91 526.79 797.03 525.68 C 798.91 524.59 800 522.92 800 521.17 C 800 519.41 798.91 517.75 797.03 516.65 C 798.91 515.55 800 513.89 800 512.13 C 800 510.38 798.91 508.72 797.03 507.62 C 798.91 506.52 800 504.86 800 503.1 C 800 501.35 798.91 499.69 797.03 498.58 C 798.91 497.49 800 495.82 800 494.07 C 800 492.31 798.91 490.65 797.03 489.55 C 798.91 488.45 800 486.79 800 485.03 C 800 483.28 798.91 481.62 797.03 480.52 C 798.91 479.42 800 477.76 800 476 C 800 474.25 798.91 472.58 797.03 471.49 C 798.91 470.38 800 468.72 800 466.97 C 800 465.21 798.91 463.55 797.03 462.45 C 798.91 461.35 800 459.69 800 457.93 C 800 456.18 798.91 454.52 797.03 453.42 C 798.91 452.32 800 450.66 800 448.9 C 800 447.14 798.91 445.48 797.03 444.39 C 798.91 443.28 800 441.62 800 439.86 C 800 438.11 798.91 436.45 797.03 435.35 C 798.91 434.25 800 432.59 800 430.83 C 800 429.08 798.91 427.42 797.03 426.32 C 798.91 425.22 800 423.55 800 421.8 C 800 418.6 796.43 416 792.04 416 C 789.37 416 786.86 416.99 785.4 418.61 C 783.93 416.98 781.42 416 778.75 416 C 776.12 416 773.66 416.95 772.18 418.52 C 770.7 416.95 768.24 416 765.62 416 C 762.99 416 760.53 416.95 759.05 418.52 C 757.57 416.95 755.11 416 752.5 416 C 749.86 416 747.41 416.95 745.92 418.52 C 744.44 416.95 741.99 416 739.36 416 C 736.74 416 734.28 416.95 732.79 418.52 C 731.32 416.95 728.86 416 726.24 416 C 723.61 416 721.15 416.95 719.67 418.52 C 718.19 416.95 715.73 416 713.11 416 C 710.48 416 708.03 416.95 706.54 418.52 C 705.06 416.95 702.61 416 699.98 416 C 697.36 416 694.9 416.95 693.41 418.52 C 691.94 416.95 689.48 416 686.85 416 C 684.23 416 681.77 416.95 680.29 418.52 C 678.81 416.95 676.35 416 673.73 416 C 671.1 416 668.65 416.95 667.16 418.52 C 665.67 416.95 663.23 416 660.6 416 C 657.97 416 655.52 416.95 654.03 418.52 C 652.55 416.95 650.1 416 647.47 416 C 644.85 416 642.39 416.95 640.91 418.52 C 639.42 416.95 636.97 416 634.35 416 C 631.72 416 629.26 416.95 627.78 418.52 C 626.29 416.95 623.84 416 621.22 416 C 618.55 416 616.06 416.97 614.59 418.59 C 613.12 416.97 610.62 416 607.96 416 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 476px; margin-left: 601px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Composite outputs</b><br />sort, direction, page_no, page_size<br /><i>single order, page or list object</i></div></div></div></foreignObject><text x="700" y="480" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Composite outputs...</text></switch></g><path d="M 255 167.75 L 371.55 58.95" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 375.38 55.36 L 372.65 62.7 L 371.55 58.95 L 367.88 57.58 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/><path d="M 254.23 400.89 L 367.79 403.84" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 373.04 403.97 L 365.95 407.29 L 367.79 403.84 L 366.14 400.29 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="800px" height="413px" viewBox="-0.5 -0.5 800 413" content="&lt;mxfile&gt;&lt;diagram id=&quot;hn6&quot; name=&quot;Fat Controllers&quot;&gt;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&lt;/diagram&gt;&lt;diagram id=&quot;mBj&quot; name=&quot;Thin Controllers&quot;&gt;7Vlbb+I4GP01SG2lRrkDj0CH6Us1nXZX231CTmIgrRNnHAfI/Pr97DiQGwxlaTvabVuV+Ph+vmMfx/SsSbT5ylCyvKMBJj1TDzY966ZnmkPLhP8CyAvAGVgFsGBhUED6DngMf+ICNEo0CwOcKqyAOKWEh0kd9GkcY5/XMMQYXdeLzSkJakCCFrgFPPqItNG/woAvFWq4w13GLQ4XS9X1wOwXGR7yXxaMZrHqr2dacyR+i+wIlW2piaZLFNB1BbK+9KwJo5QXT9FmgomgtqRN9DwT+bNo/CzbmO4pGUNQ6iVh2AzH/LUNmcYDe7r7+ZCxbw4xps+3I/fP63L8PC85wwFQqJIxjeFjvOQRgZQBj3gT8qfK89/wrGumo5I3Qjl6mchVYh4SMqGEMtmDNR/42PcBTzmjL7iS4w0c2xE12vPsoCGlGfPVqAG8VmLliC0w38FKsmJeFVUojr5iGmHOcijAMEE8XNWlg5QCF9tyO4bhQZH8CsKNYwgHOSUiqdaFoGcs1YgDxf0vQ3I4IkAry59kQR00rwBV094Cu8oyVat9j1kIlGCmQII8TMbbdVNGNcBzlBEuVEBjPkVRSEQzt5isMA99pDLU3mEYKt2ujuNgJLYEQQtBaRoeVtA+zZ1TWfZvpSzznZTVP15aRkNatuN8SusoaTm/lbSc80urohLdbKhk8B8WSbmmdG046FfWlaEVNOxfV5BozvkkxVltxXUG/cN2t8qyWCGS4fII5so4JDUhuj8yccYaRzCbMO5ZIz3ZbJPXBM8hc2RXMY9yTqMtyvGGXyMSLkRlH3gEcretwtNCfcq+vRJ4wAllPIXApnDYTGdePksYnYe8LAlz9Jq1AUua2JKJ6ZQH57JfozqEaauOdS4KXG1omJDTmvAfS2jJ1CewEhglRHJSzkF03xiQc7aYaIOu4dwjhiJ57mawyxASxovqgJzmgM6qkdZoonyGfB7SeJaIcaUXlwcj/NbkTJBcPT8yLJbZh7Fyl48kKd/FODQ5movUp2AJJqx4/eoqjJOMp4e5OmU1vLn4GE7F/vpx1PZsfSXkLxvXS6LVuDDTYry+uLqiGT9AcMO/18uQ48cESWNYw8t/3Z53vt3lZXPsdr+/Bf2hp+sNCwW8+AFcbbQ3BQdjusJsTqSnij4aXmzuN+1jfA/ahs39oHWp3L5yG3XLYbjqFmC9uzMwbXVlsKxcFxhD9zxuZ+11u62JNLbA+g7YshqPHUBsvWFaah8TCutPxJ/UWbtmUUxLMItCfqFp2mVnfygSaoq9NOlIa2keeZRAiGcvOE/PKszAwYPA7hLmwPQs1z0gzPLwGm0W4iZM8xAc8DSf0CyYMXE1dV7F2XDGrUrOGbYVp+sdiisvnP6t4uxfK075yveGr7xKa49CaOP8Xsqs1tIrFNPhJX6Wiv1SpQpdXn5qSQnHfGcxOUdsXy0TPV1HW+M7QUuFVUpFaTvD/NQNPFmO8Y666XzlPMIHp5QJG/zmPUtGTrTA/2fE3b5xkus41hvF+wgXUqZh+eJVFO0L+Wc45bn17eIJyd23WTKv8o2h9eUf&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(250, 250, 250);"><defs/><g><path d="M 249 157 L 370.14 105.23" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 374.97 103.17 L 369.91 109.14 L 370.14 105.23 L 367.16 102.7 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/><path d="M 249 206 L 375.03 208.51" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 380.28 208.62 L 373.21 211.98 L 375.03 208.51 L 373.35 204.98 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/><path d="M 249 255 L 374.19 342.94" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 378.49 345.96 L 370.75 344.8 L 374.19 342.94 L 374.77 339.07 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/><path d="M 573.4 122.4 L 593.71 132.59" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 598.4 134.94 L 590.57 134.93 L 593.71 132.59 L 593.71 128.67 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="108" width="249" height="196" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 251px; height: 196px; padding-top: 108px; margin-left: 0px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left; width: 249px; height: 196px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;"><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px ; text-align: center"><b>Reports#sales_by_profit</b></p><hr size="1" /><h3 style="margin: 0px ; margin-left: 4px ; margin-bottom: 6.912px">Thin Controller</h3><h5 style="margin: 0px ; margin-left: 4px ; margin-bottom: 4.8px">Param marshalling</h5><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">my_action_params()</p><h5 style="margin: 0px ; margin-left: 4px ; margin-bottom: 4.8px">Call query</h5><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">MyActionQuery.query(scope, **inputs)</p><hr size="1" /><h5 style="margin: 0px ; margin-left: 4px ; margin-bottom: 4.8px">Present</h5><p style="margin: 0px ; margin-left: 4px ; margin-bottom: 4px">@vm = MyActionPresenter.new(**outputs)</p></div></div></div></foreignObject><text x="0" y="210" fill="#333333" font-family="Helvetica" font-size="12px">Reports#sales_by_profit...</text></switch></g><path d="M 383.96 0 C 379.57 0 376 2.6 376 5.8 C 376 7.55 377.1 9.21 378.97 10.32 C 377.09 11.41 376 13.08 376 14.83 C 376 16.59 377.1 18.25 378.97 19.35 C 377.09 20.45 376 22.11 376 23.86 C 376 25.62 377.1 27.28 378.97 28.38 C 377.09 29.48 376 31.14 376 32.9 C 376 34.65 377.1 36.32 378.97 37.42 C 377.09 38.51 376 40.18 376 41.93 C 376 43.69 377.1 45.35 378.97 46.45 C 377.09 47.55 376 49.21 376 50.97 C 376 52.72 377.1 54.38 378.97 55.48 C 377.09 56.58 376 58.24 376 60 C 376 61.76 377.1 63.42 378.97 64.51 C 377.09 65.61 376 67.28 376 69.03 C 376 70.79 377.1 72.45 378.97 73.55 C 377.09 74.65 376 76.31 376 78.07 C 376 79.82 377.1 81.48 378.97 82.58 C 377.09 83.68 376 85.34 376 87.1 C 376 88.86 377.1 90.52 378.97 91.61 C 377.09 92.72 376 94.38 376 96.13 C 376 97.89 377.1 99.55 378.97 100.65 C 377.09 101.74 376 103.41 376 105.17 C 376 106.92 377.1 108.58 378.97 109.68 C 377.09 110.78 376 112.45 376 114.2 C 376 117.4 379.57 120 383.96 120 C 386.62 120 389.12 119.03 390.59 117.41 C 392.06 119.03 394.55 120 397.22 120 C 399.84 120 402.3 119.05 403.79 117.48 C 405.27 119.05 407.72 120 410.35 120 C 412.97 120 415.43 119.05 416.91 117.48 C 418.39 119.05 420.85 120 423.47 120 C 426.1 120 428.55 119.05 430.04 117.48 C 431.52 119.05 433.97 120 436.6 120 C 439.23 120 441.68 119.05 443.17 117.48 C 444.65 119.05 447.1 120 449.73 120 C 452.35 120 454.81 119.05 456.3 117.48 C 457.78 119.05 460.23 120 462.85 120 C 465.48 120 467.94 119.05 469.42 117.48 C 470.91 119.05 473.36 120 475.98 120 C 478.61 120 481.06 119.05 482.55 117.48 C 484.04 119.05 486.48 120 489.11 120 C 491.73 120 494.2 119.05 495.68 117.48 C 497.16 119.05 499.61 120 502.24 120 C 504.86 120 507.33 119.05 508.8 117.48 C 510.29 119.05 512.75 120 515.36 120 C 518 120 520.45 119.05 521.93 117.48 C 523.42 119.05 525.87 120 528.5 120 C 531.12 120 533.58 119.05 535.06 117.48 C 536.54 119.05 539 120 541.62 120 C 544.25 120 546.71 119.05 548.18 117.48 C 549.67 119.05 552.13 120 554.75 120 C 557.42 120 559.92 119.01 561.4 117.39 C 562.86 119.02 565.36 120 568.04 120 C 572.43 120 576 117.4 576 114.2 C 576 112.45 574.91 110.79 573.03 109.68 C 574.91 108.59 576 106.92 576 105.17 C 576 103.41 574.91 101.75 573.03 100.65 C 574.91 99.55 576 97.89 576 96.13 C 576 94.38 574.91 92.72 573.03 91.62 C 574.91 90.52 576 88.86 576 87.1 C 576 85.35 574.91 83.69 573.03 82.58 C 574.91 81.49 576 79.82 576 78.07 C 576 76.31 574.91 74.65 573.03 73.55 C 574.91 72.45 576 70.79 576 69.03 C 576 67.28 574.91 65.62 573.03 64.52 C 574.91 63.42 576 61.76 576 60 C 576 58.25 574.91 56.58 573.03 55.49 C 574.91 54.38 576 52.72 576 50.97 C 576 49.21 574.91 47.55 573.03 46.45 C 574.91 45.35 576 43.69 576 41.93 C 576 40.18 574.91 38.52 573.03 37.42 C 574.91 36.32 576 34.66 576 32.9 C 576 31.14 574.91 29.48 573.03 28.39 C 574.91 27.28 576 25.62 576 23.86 C 576 22.11 574.91 20.45 573.03 19.35 C 574.91 18.25 576 16.59 576 14.83 C 576 13.08 574.91 11.42 573.03 10.32 C 574.91 9.22 576 7.55 576 5.8 C 576 2.6 572.43 0 568.04 0 C 565.37 0 562.86 0.99 561.4 2.61 C 559.93 0.98 557.42 0 554.75 0 C 552.12 0 549.66 0.95 548.18 2.52 C 546.7 0.95 544.24 0 541.62 0 C 538.99 0 536.53 0.95 535.05 2.52 C 533.57 0.95 531.11 0 528.5 0 C 525.86 0 523.41 0.95 521.92 2.52 C 520.44 0.95 517.99 0 515.36 0 C 512.74 0 510.28 0.95 508.79 2.52 C 507.32 0.95 504.86 0 502.24 0 C 499.61 0 497.15 0.95 495.67 2.52 C 494.19 0.95 491.73 0 489.11 0 C 486.48 0 484.03 0.95 482.54 2.52 C 481.06 0.95 478.61 0 475.98 0 C 473.36 0 470.9 0.95 469.41 2.52 C 467.94 0.95 465.48 0 462.85 0 C 460.23 0 457.77 0.95 456.29 2.52 C 454.81 0.95 452.35 0 449.73 0 C 447.1 0 444.65 0.95 443.16 2.52 C 441.67 0.95 439.23 0 436.6 0 C 433.97 0 431.52 0.95 430.03 2.52 C 428.55 0.95 426.1 0 423.47 0 C 420.85 0 418.39 0.95 416.91 2.52 C 415.42 0.95 412.97 0 410.35 0 C 407.72 0 405.26 0.95 403.78 2.52 C 402.29 0.95 399.84 0 397.22 0 C 394.55 0 392.06 0.97 390.59 2.59 C 389.12 0.97 386.62 0 383.96 0 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 60px; margin-left: 377px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Param marshaling</b><br /><br />@sales_by_profit_params ||= <br />params.permit(...)<br />  .symbolize_keys</div></div></div></foreignObject><text x="476" y="64" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Param marshaling...</text></switch></g><path d="M 383.96 143 C 379.57 143 376 145.6 376 148.8 C 376 150.55 377.1 152.21 378.97 153.32 C 377.09 154.41 376 156.08 376 157.83 C 376 159.59 377.1 161.25 378.97 162.35 C 377.09 163.45 376 165.11 376 166.86 C 376 168.62 377.1 170.28 378.97 171.38 C 377.09 172.48 376 174.14 376 175.9 C 376 177.65 377.1 179.32 378.97 180.42 C 377.09 181.51 376 183.18 376 184.93 C 376 186.69 377.1 188.35 378.97 189.45 C 377.09 190.55 376 192.21 376 193.97 C 376 195.72 377.1 197.38 378.97 198.48 C 377.09 199.58 376 201.24 376 203 C 376 204.76 377.1 206.42 378.97 207.51 C 377.09 208.61 376 210.28 376 212.03 C 376 213.79 377.1 215.45 378.97 216.55 C 377.09 217.65 376 219.31 376 221.07 C 376 222.82 377.1 224.48 378.97 225.58 C 377.09 226.68 376 228.34 376 230.1 C 376 231.86 377.1 233.52 378.97 234.61 C 377.09 235.72 376 237.38 376 239.13 C 376 240.89 377.1 242.55 378.97 243.65 C 377.09 244.74 376 246.41 376 248.17 C 376 249.92 377.1 251.58 378.97 252.68 C 377.09 253.78 376 255.45 376 257.2 C 376 260.4 379.57 263 383.96 263 C 386.62 263 389.12 262.03 390.59 260.41 C 392.06 262.03 394.55 263 397.22 263 C 399.84 263 402.3 262.05 403.79 260.48 C 405.27 262.05 407.72 263 410.35 263 C 412.97 263 415.43 262.05 416.91 260.48 C 418.39 262.05 420.85 263 423.47 263 C 426.1 263 428.55 262.05 430.04 260.48 C 431.52 262.05 433.97 263 436.6 263 C 439.23 263 441.68 262.05 443.17 260.48 C 444.65 262.05 447.1 263 449.73 263 C 452.35 263 454.81 262.05 456.3 260.48 C 457.78 262.05 460.23 263 462.85 263 C 465.48 263 467.94 262.05 469.42 260.48 C 470.91 262.05 473.36 263 475.98 263 C 478.61 263 481.06 262.05 482.55 260.48 C 484.04 262.05 486.48 263 489.11 263 C 491.73 263 494.2 262.05 495.68 260.48 C 497.16 262.05 499.61 263 502.24 263 C 504.86 263 507.33 262.05 508.8 260.48 C 510.29 262.05 512.75 263 515.36 263 C 518 263 520.45 262.05 521.93 260.48 C 523.42 262.05 525.87 263 528.5 263 C 531.12 263 533.58 262.05 535.06 260.48 C 536.54 262.05 539 263 541.62 263 C 544.25 263 546.71 262.05 548.18 260.48 C 549.67 262.05 552.13 263 554.75 263 C 557.42 263 559.92 262.01 561.4 260.39 C 562.86 262.02 565.36 263 568.04 263 C 572.43 263 576 260.4 576 257.2 C 576 255.45 574.91 253.79 573.03 252.68 C 574.91 251.59 576 249.92 576 248.17 C 576 246.41 574.91 244.75 573.03 243.65 C 574.91 242.55 576 240.89 576 239.13 C 576 237.38 574.91 235.72 573.03 234.62 C 574.91 233.52 576 231.86 576 230.1 C 576 228.35 574.91 226.69 573.03 225.58 C 574.91 224.49 576 222.82 576 221.07 C 576 219.31 574.91 217.65 573.03 216.55 C 574.91 215.45 576 213.79 576 212.03 C 576 210.28 574.91 208.62 573.03 207.52 C 574.91 206.42 576 204.76 576 203 C 576 201.25 574.91 199.58 573.03 198.49 C 574.91 197.38 576 195.72 576 193.97 C 576 192.21 574.91 190.55 573.03 189.45 C 574.91 188.35 576 186.69 576 184.93 C 576 183.18 574.91 181.52 573.03 180.42 C 574.91 179.32 576 177.66 576 175.9 C 576 174.14 574.91 172.48 573.03 171.39 C 574.91 170.28 576 168.62 576 166.86 C 576 165.11 574.91 163.45 573.03 162.35 C 574.91 161.25 576 159.59 576 157.83 C 576 156.08 574.91 154.42 573.03 153.32 C 574.91 152.22 576 150.55 576 148.8 C 576 145.6 572.43 143 568.04 143 C 565.37 143 562.86 143.99 561.4 145.61 C 559.93 143.98 557.42 143 554.75 143 C 552.12 143 549.66 143.95 548.18 145.52 C 546.7 143.95 544.24 143 541.62 143 C 538.99 143 536.53 143.95 535.05 145.52 C 533.57 143.95 531.11 143 528.5 143 C 525.86 143 523.41 143.95 521.92 145.52 C 520.44 143.95 517.99 143 515.36 143 C 512.74 143 510.28 143.95 508.79 145.52 C 507.32 143.95 504.86 143 502.24 143 C 499.61 143 497.15 143.95 495.67 145.52 C 494.19 143.95 491.73 143 489.11 143 C 486.48 143 484.03 143.95 482.54 145.52 C 481.06 143.95 478.61 143 475.98 143 C 473.36 143 470.9 143.95 469.41 145.52 C 467.94 143.95 465.48 143 462.85 143 C 460.23 143 457.77 143.95 456.29 145.52 C 454.81 143.95 452.35 143 449.73 143 C 447.1 143 444.65 143.95 443.16 145.52 C 441.67 143.95 439.23 143 436.6 143 C 433.97 143 431.52 143.95 430.03 145.52 C 428.55 143.95 426.1 143 423.47 143 C 420.85 143 418.39 143.95 416.91 145.52 C 415.42 143.95 412.97 143 410.35 143 C 407.72 143 405.26 143.95 403.78 145.52 C 402.29 143.95 399.84 143 397.22 143 C 394.55 143 392.06 143.97 390.59 145.59 C 389.12 143.97 386.62 143 383.96 143 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 203px; margin-left: 377px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Call Query</b><br /><br />SalesByProfitQuery<br />  .query(scope, **custom, **params)</div></div></div></foreignObject><text x="476" y="207" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Call Query...</text></switch></g><path d="M 383.96 292 C 379.57 292 376 294.6 376 297.8 C 376 299.55 377.1 301.21 378.97 302.32 C 377.09 303.41 376 305.08 376 306.83 C 376 308.59 377.1 310.25 378.97 311.35 C 377.09 312.45 376 314.11 376 315.86 C 376 317.62 377.1 319.28 378.97 320.38 C 377.09 321.48 376 323.14 376 324.9 C 376 326.65 377.1 328.32 378.97 329.42 C 377.09 330.51 376 332.18 376 333.93 C 376 335.69 377.1 337.35 378.97 338.45 C 377.09 339.55 376 341.21 376 342.97 C 376 344.72 377.1 346.38 378.97 347.48 C 377.09 348.58 376 350.24 376 352 C 376 353.76 377.1 355.42 378.97 356.51 C 377.09 357.61 376 359.28 376 361.03 C 376 362.79 377.1 364.45 378.97 365.55 C 377.09 366.65 376 368.31 376 370.07 C 376 371.82 377.1 373.48 378.97 374.58 C 377.09 375.68 376 377.34 376 379.1 C 376 380.86 377.1 382.52 378.97 383.61 C 377.09 384.72 376 386.38 376 388.13 C 376 389.89 377.1 391.55 378.97 392.65 C 377.09 393.74 376 395.41 376 397.17 C 376 398.92 377.1 400.58 378.97 401.68 C 377.09 402.78 376 404.45 376 406.2 C 376 409.4 379.57 412 383.96 412 C 386.62 412 389.12 411.03 390.59 409.41 C 392.06 411.03 394.55 412 397.22 412 C 399.84 412 402.3 411.05 403.79 409.48 C 405.27 411.05 407.72 412 410.35 412 C 412.97 412 415.43 411.05 416.91 409.48 C 418.39 411.05 420.85 412 423.47 412 C 426.1 412 428.55 411.05 430.04 409.48 C 431.52 411.05 433.97 412 436.6 412 C 439.23 412 441.68 411.05 443.17 409.48 C 444.65 411.05 447.1 412 449.73 412 C 452.35 412 454.81 411.05 456.3 409.48 C 457.78 411.05 460.23 412 462.85 412 C 465.48 412 467.94 411.05 469.42 409.48 C 470.91 411.05 473.36 412 475.98 412 C 478.61 412 481.06 411.05 482.55 409.48 C 484.04 411.05 486.48 412 489.11 412 C 491.73 412 494.2 411.05 495.68 409.48 C 497.16 411.05 499.61 412 502.24 412 C 504.86 412 507.33 411.05 508.8 409.48 C 510.29 411.05 512.75 412 515.36 412 C 518 412 520.45 411.05 521.93 409.48 C 523.42 411.05 525.87 412 528.5 412 C 531.12 412 533.58 411.05 535.06 409.48 C 536.54 411.05 539 412 541.62 412 C 544.25 412 546.71 411.05 548.18 409.48 C 549.67 411.05 552.13 412 554.75 412 C 557.42 412 559.92 411.01 561.4 409.39 C 562.86 411.02 565.36 412 568.04 412 C 572.43 412 576 409.4 576 406.2 C 576 404.45 574.91 402.79 573.03 401.68 C 574.91 400.59 576 398.92 576 397.17 C 576 395.41 574.91 393.75 573.03 392.65 C 574.91 391.55 576 389.89 576 388.13 C 576 386.38 574.91 384.72 573.03 383.62 C 574.91 382.52 576 380.86 576 379.1 C 576 377.35 574.91 375.69 573.03 374.58 C 574.91 373.49 576 371.82 576 370.07 C 576 368.31 574.91 366.65 573.03 365.55 C 574.91 364.45 576 362.79 576 361.03 C 576 359.28 574.91 357.62 573.03 356.52 C 574.91 355.42 576 353.76 576 352 C 576 350.25 574.91 348.58 573.03 347.49 C 574.91 346.38 576 344.72 576 342.97 C 576 341.21 574.91 339.55 573.03 338.45 C 574.91 337.35 576 335.69 576 333.93 C 576 332.18 574.91 330.52 573.03 329.42 C 574.91 328.32 576 326.66 576 324.9 C 576 323.14 574.91 321.48 573.03 320.39 C 574.91 319.28 576 317.62 576 315.86 C 576 314.11 574.91 312.45 573.03 311.35 C 574.91 310.25 576 308.59 576 306.83 C 576 305.08 574.91 303.42 573.03 302.32 C 574.91 301.22 576 299.55 576 297.8 C 576 294.6 572.43 292 568.04 292 C 565.37 292 562.86 292.99 561.4 294.61 C 559.93 292.98 557.42 292 554.75 292 C 552.12 292 549.66 292.95 548.18 294.52 C 546.7 292.95 544.24 292 541.62 292 C 538.99 292 536.53 292.95 535.05 294.52 C 533.57 292.95 531.11 292 528.5 292 C 525.86 292 523.41 292.95 521.92 294.52 C 520.44 292.95 517.99 292 515.36 292 C 512.74 292 510.28 292.95 508.79 294.52 C 507.32 292.95 504.86 292 502.24 292 C 499.61 292 497.15 292.95 495.67 294.52 C 494.19 292.95 491.73 292 489.11 292 C 486.48 292 484.03 292.95 482.54 294.52 C 481.06 292.95 478.61 292 475.98 292 C 473.36 292 470.9 292.95 469.41 294.52 C 467.94 292.95 465.48 292 462.85 292 C 460.23 292 457.77 292.95 456.29 294.52 C 454.81 292.95 452.35 292 449.73 292 C 447.1 292 444.65 292.95 443.16 294.52 C 441.67 292.95 439.23 292 436.6 292 C 433.97 292 431.52 292.95 430.03 294.52 C 428.55 292.95 426.1 292 423.47 292 C 420.85 292 418.39 292.95 416.91 294.52 C 415.42 292.95 412.97 292 410.35 292 C 407.72 292 405.26 292.95 403.78 294.52 C 402.29 292.95 399.84 292 397.22 292 C 394.55 292 392.06 292.97 390.59 294.59 C 389.12 292.97 386.62 292 383.96 292 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 352px; margin-left: 377px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Present</b><br /><br />SalesByProfitPresenter<br />  .new(**query.outputs)</div></div></div></foreignObject><text x="476" y="356" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Present...</text></switch></g><path d="M 606.96 0 C 602.57 0 599 1.15 599 2.56 C 599 3.34 600.1 4.07 601.97 4.56 C 600.09 5.04 599 5.78 599 6.55 C 599 7.33 600.1 8.06 601.97 8.54 C 600.09 9.03 599 9.76 599 10.54 C 599 11.32 600.1 12.05 601.97 12.53 C 600.09 13.02 599 13.75 599 14.53 C 599 15.31 600.1 16.04 601.97 16.53 C 600.09 17.01 599 17.75 599 18.52 C 599 19.3 600.1 20.03 601.97 20.52 C 600.09 21 599 21.74 599 22.51 C 599 23.29 600.1 24.02 601.97 24.5 C 600.09 24.99 599 25.72 599 26.5 C 599 27.28 600.1 28.01 601.97 28.49 C 600.09 28.98 599 29.71 599 30.49 C 599 31.26 600.1 32 601.97 32.48 C 600.09 32.97 599 33.7 599 34.48 C 599 35.25 600.1 35.99 601.97 36.47 C 600.09 36.96 599 37.69 599 38.47 C 599 39.25 600.1 39.98 601.97 40.46 C 600.09 40.95 599 41.68 599 42.46 C 599 43.23 600.1 43.97 601.97 44.45 C 600.09 44.94 599 45.67 599 46.45 C 599 47.22 600.1 47.96 601.97 48.44 C 600.09 48.93 599 49.66 599 50.44 C 599 51.85 602.57 53 606.96 53 C 609.62 53 612.12 52.57 613.59 51.86 C 615.06 52.57 617.55 53 620.22 53 C 622.84 53 625.3 52.58 626.79 51.89 C 628.27 52.58 630.72 53 633.35 53 C 635.97 53 638.43 52.58 639.91 51.89 C 641.39 52.58 643.85 53 646.47 53 C 649.1 53 651.55 52.58 653.04 51.89 C 654.52 52.58 656.97 53 659.6 53 C 662.23 53 664.68 52.58 666.17 51.89 C 667.65 52.58 670.1 53 672.73 53 C 675.35 53 677.81 52.58 679.3 51.89 C 680.78 52.58 683.23 53 685.85 53 C 688.48 53 690.94 52.58 692.42 51.89 C 693.91 52.58 696.36 53 698.98 53 C 701.61 53 704.06 52.58 705.55 51.89 C 707.04 52.58 709.48 53 712.11 53 C 714.73 53 717.2 52.58 718.68 51.89 C 720.16 52.58 722.61 53 725.24 53 C 727.86 53 730.33 52.58 731.8 51.89 C 733.29 52.58 735.75 53 738.36 53 C 741 53 743.45 52.58 744.93 51.89 C 746.42 52.58 748.87 53 751.5 53 C 754.12 53 756.58 52.58 758.06 51.89 C 759.54 52.58 762 53 764.62 53 C 767.25 53 769.71 52.58 771.18 51.89 C 772.67 52.58 775.13 53 777.75 53 C 780.42 53 782.92 52.56 784.4 51.85 C 785.86 52.57 788.36 53 791.04 53 C 795.43 53 799 51.85 799 50.44 C 799 49.66 797.91 48.93 796.03 48.44 C 797.91 47.96 799 47.22 799 46.45 C 799 45.67 797.91 44.94 796.03 44.46 C 797.91 43.97 799 43.24 799 42.46 C 799 41.68 797.91 40.95 796.03 40.47 C 797.91 39.98 799 39.25 799 38.47 C 799 37.69 797.91 36.96 796.03 36.47 C 797.91 35.99 799 35.25 799 34.48 C 799 33.7 797.91 32.97 796.03 32.48 C 797.91 32 799 31.26 799 30.49 C 799 29.71 797.91 28.98 796.03 28.5 C 797.91 28.01 799 27.28 799 26.5 C 799 25.73 797.91 24.99 796.03 24.51 C 797.91 24.02 799 23.29 799 22.51 C 799 21.74 797.91 21 796.03 20.52 C 797.91 20.03 799 19.3 799 18.52 C 799 17.75 797.91 17.01 796.03 16.53 C 797.91 16.04 799 15.31 799 14.53 C 799 13.75 797.91 13.02 796.03 12.54 C 797.91 12.05 799 11.32 799 10.54 C 799 9.76 797.91 9.03 796.03 8.55 C 797.91 8.06 799 7.33 799 6.55 C 799 5.78 797.91 5.04 796.03 4.56 C 797.91 4.07 799 3.34 799 2.56 C 799 1.15 795.43 0 791.04 0 C 788.37 0 785.86 0.44 784.4 1.15 C 782.93 0.43 780.42 0 777.75 0 C 775.12 0 772.66 0.42 771.18 1.11 C 769.7 0.42 767.24 0 764.62 0 C 761.99 0 759.53 0.42 758.05 1.11 C 756.57 0.42 754.11 0 751.5 0 C 748.86 0 746.41 0.42 744.92 1.11 C 743.44 0.42 740.99 0 738.36 0 C 735.74 0 733.28 0.42 731.79 1.11 C 730.32 0.42 727.86 0 725.24 0 C 722.61 0 720.15 0.42 718.67 1.11 C 717.19 0.42 714.73 0 712.11 0 C 709.48 0 707.03 0.42 705.54 1.11 C 704.06 0.42 701.61 0 698.98 0 C 696.36 0 693.9 0.42 692.41 1.11 C 690.94 0.42 688.48 0 685.85 0 C 683.23 0 680.77 0.42 679.29 1.11 C 677.81 0.42 675.35 0 672.73 0 C 670.1 0 667.65 0.42 666.16 1.11 C 664.67 0.42 662.23 0 659.6 0 C 656.97 0 654.52 0.42 653.03 1.11 C 651.55 0.42 649.1 0 646.47 0 C 643.85 0 641.39 0.42 639.91 1.11 C 638.42 0.42 635.97 0 633.35 0 C 630.72 0 628.26 0.42 626.78 1.11 C 625.29 0.42 622.84 0 620.22 0 C 617.55 0 615.06 0.43 613.59 1.14 C 612.12 0.43 609.62 0 606.96 0 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 27px; margin-left: 600px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Form Object</b><br /><br /></div></div></div></foreignObject><text x="699" y="30" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Form Object...</text></switch></g><path d="M 606.96 110 C 602.57 110 599 111.15 599 112.56 C 599 113.34 600.1 114.07 601.97 114.56 C 600.09 115.04 599 115.78 599 116.55 C 599 117.33 600.1 118.06 601.97 118.54 C 600.09 119.03 599 119.76 599 120.54 C 599 121.32 600.1 122.05 601.97 122.53 C 600.09 123.02 599 123.75 599 124.53 C 599 125.31 600.1 126.04 601.97 126.53 C 600.09 127.01 599 127.75 599 128.52 C 599 129.3 600.1 130.03 601.97 130.52 C 600.09 131 599 131.74 599 132.51 C 599 133.29 600.1 134.02 601.97 134.5 C 600.09 134.99 599 135.72 599 136.5 C 599 137.28 600.1 138.01 601.97 138.49 C 600.09 138.98 599 139.71 599 140.49 C 599 141.26 600.1 142 601.97 142.48 C 600.09 142.97 599 143.7 599 144.48 C 599 145.25 600.1 145.99 601.97 146.47 C 600.09 146.96 599 147.69 599 148.47 C 599 149.25 600.1 149.98 601.97 150.46 C 600.09 150.95 599 151.68 599 152.46 C 599 153.23 600.1 153.97 601.97 154.45 C 600.09 154.94 599 155.67 599 156.45 C 599 157.22 600.1 157.96 601.97 158.44 C 600.09 158.93 599 159.66 599 160.44 C 599 161.85 602.57 163 606.96 163 C 609.62 163 612.12 162.57 613.59 161.86 C 615.06 162.57 617.55 163 620.22 163 C 622.84 163 625.3 162.58 626.79 161.89 C 628.27 162.58 630.72 163 633.35 163 C 635.97 163 638.43 162.58 639.91 161.89 C 641.39 162.58 643.85 163 646.47 163 C 649.1 163 651.55 162.58 653.04 161.89 C 654.52 162.58 656.97 163 659.6 163 C 662.23 163 664.68 162.58 666.17 161.89 C 667.65 162.58 670.1 163 672.73 163 C 675.35 163 677.81 162.58 679.3 161.89 C 680.78 162.58 683.23 163 685.85 163 C 688.48 163 690.94 162.58 692.42 161.89 C 693.91 162.58 696.36 163 698.98 163 C 701.61 163 704.06 162.58 705.55 161.89 C 707.04 162.58 709.48 163 712.11 163 C 714.73 163 717.2 162.58 718.68 161.89 C 720.16 162.58 722.61 163 725.24 163 C 727.86 163 730.33 162.58 731.8 161.89 C 733.29 162.58 735.75 163 738.36 163 C 741 163 743.45 162.58 744.93 161.89 C 746.42 162.58 748.87 163 751.5 163 C 754.12 163 756.58 162.58 758.06 161.89 C 759.54 162.58 762 163 764.62 163 C 767.25 163 769.71 162.58 771.18 161.89 C 772.67 162.58 775.13 163 777.75 163 C 780.42 163 782.92 162.56 784.4 161.85 C 785.86 162.57 788.36 163 791.04 163 C 795.43 163 799 161.85 799 160.44 C 799 159.66 797.91 158.93 796.03 158.44 C 797.91 157.96 799 157.22 799 156.45 C 799 155.67 797.91 154.94 796.03 154.46 C 797.91 153.97 799 153.24 799 152.46 C 799 151.68 797.91 150.95 796.03 150.47 C 797.91 149.98 799 149.25 799 148.47 C 799 147.69 797.91 146.96 796.03 146.47 C 797.91 145.99 799 145.25 799 144.48 C 799 143.7 797.91 142.97 796.03 142.48 C 797.91 142 799 141.26 799 140.49 C 799 139.71 797.91 138.98 796.03 138.5 C 797.91 138.01 799 137.28 799 136.5 C 799 135.73 797.91 134.99 796.03 134.51 C 797.91 134.02 799 133.29 799 132.51 C 799 131.74 797.91 131 796.03 130.52 C 797.91 130.03 799 129.3 799 128.52 C 799 127.75 797.91 127.01 796.03 126.53 C 797.91 126.04 799 125.31 799 124.53 C 799 123.75 797.91 123.02 796.03 122.54 C 797.91 122.05 799 121.32 799 120.54 C 799 119.76 797.91 119.03 796.03 118.55 C 797.91 118.06 799 117.33 799 116.55 C 799 115.78 797.91 115.04 796.03 114.56 C 797.91 114.07 799 113.34 799 112.56 C 799 111.15 795.43 110 791.04 110 C 788.37 110 785.86 110.44 784.4 111.15 C 782.93 110.43 780.42 110 777.75 110 C 775.12 110 772.66 110.42 771.18 111.11 C 769.7 110.42 767.24 110 764.62 110 C 761.99 110 759.53 110.42 758.05 111.11 C 756.57 110.42 754.11 110 751.5 110 C 748.86 110 746.41 110.42 744.92 111.11 C 743.44 110.42 740.99 110 738.36 110 C 735.74 110 733.28 110.42 731.79 111.11 C 730.32 110.42 727.86 110 725.24 110 C 722.61 110 720.15 110.42 718.67 111.11 C 717.19 110.42 714.73 110 712.11 110 C 709.48 110 707.03 110.42 705.54 111.11 C 704.06 110.42 701.61 110 698.98 110 C 696.36 110 693.9 110.42 692.41 111.11 C 690.94 110.42 688.48 110 685.85 110 C 683.23 110 680.77 110.42 679.29 111.11 C 677.81 110.42 675.35 110 672.73 110 C 670.1 110 667.65 110.42 666.16 111.11 C 664.67 110.42 662.23 110 659.6 110 C 656.97 110 654.52 110.42 653.03 111.11 C 651.55 110.42 649.1 110 646.47 110 C 643.85 110 641.39 110.42 639.91 111.11 C 638.42 110.42 635.97 110 633.35 110 C 630.72 110 628.26 110.42 626.78 111.11 C 625.29 110.42 622.84 110 620.22 110 C 617.55 110 615.06 110.43 613.59 111.14 C 612.12 110.43 609.62 110 606.96 110 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 137px; margin-left: 600px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><b>Query#contract</b></div></div></div></foreignObject><text x="699" y="140" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Query#contract</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg>
@@ -0,0 +1,48 @@
1
+ <mxfile host="65bd71144e">
2
+ <diagram id="lIO" name="Fat Controllers">
3
+ <mxGraphModel dx="932" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
4
+ <root>
5
+ <mxCell id="page_root_lIO"/>
6
+ <mxCell id="node_root_lIO" parent="page_root_lIO"/>
7
+ <mxCell id="lIO-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Reports#sales_by_profit&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h3 style=&quot;margin:0px;margin-left:4px;margin-bottom:6.912px&quot;&gt;Thin Controller&lt;/h3&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Param marshalling&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;my_action_params()&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Call query&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;MyActionQuery.query(scope, **inputs)&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Present&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@vm = MyActionPresenter.new(**outputs)&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_lIO" vertex="1">
8
+ <mxGeometry x="30" y="30" width="160" height="160" as="geometry"/>
9
+ </mxCell>
10
+ <mxCell id="lIO-3" value="&lt;b&gt;Param marshaling&lt;/b&gt;&lt;br&gt;&lt;br&gt;@sales_by_profit_params ||= &lt;br&gt;params.permit(...)&lt;br&gt;&amp;nbsp;&amp;nbsp;.symbolize_keys" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_lIO" vertex="1">
11
+ <mxGeometry x="230" y="50" width="200" height="120" as="geometry"/>
12
+ </mxCell>
13
+ <mxCell id="lIO-4" value="&lt;b&gt;Call Query&lt;/b&gt;&lt;br&gt;&lt;br&gt;SalesByProfitQuery&lt;br&gt;&amp;nbsp;&amp;nbsp;.query(scope, **custom, **params)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_lIO" vertex="1">
14
+ <mxGeometry x="450" y="50" width="200" height="120" as="geometry"/>
15
+ </mxCell>
16
+ <mxCell id="lIO-5" value="&lt;b&gt;Present&lt;/b&gt;&lt;br&gt;&lt;br&gt;SalesByProfitPresenter&lt;br&gt;&amp;nbsp;&amp;nbsp;.new(**query.outputs)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_lIO" vertex="1">
17
+ <mxGeometry x="670" y="50" width="200" height="120" as="geometry"/>
18
+ </mxCell>
19
+ </root>
20
+ </mxGraphModel>
21
+ </diagram>
22
+ <diagram id="nmw" name="Fat Controllers">
23
+ <mxGraphModel dx="932" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
24
+ <root>
25
+ <mxCell id="page_root_nmw"/>
26
+ <mxCell id="node_root_nmw" parent="page_root_nmw"/>
27
+ <mxCell id="nmw-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Reports#sales_by_profit&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h3 style=&quot;margin:0px;margin-left:4px;margin-bottom:6.912px&quot;&gt;Fat Controller&lt;/h3&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Param marshalling&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_from]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_to]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort] || &quot;gross_sales&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction] || &quot;desc&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:filter_str]&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Dynamic query construction&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;switch params[:filter_str]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;invoice_date_query&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ugly query&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Query in controller&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ActiveRecord::Base.connection.execute(query)&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Build outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@net_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@vat_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@gross_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@document_data&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Composite outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction]&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_nmw" vertex="1">
28
+ <mxGeometry x="30" y="30" width="160" height="160" as="geometry"/>
29
+ </mxCell>
30
+ <mxCell id="nmw-3" value="&lt;b&gt;Paramater marshalling&lt;/b&gt;&lt;br&gt;&lt;br&gt;reading the params[] object&lt;br&gt;setting sane defaults&lt;br&gt;&lt;i&gt;do not alter and reuse params[]&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_nmw" vertex="1">
31
+ <mxGeometry x="230" y="50" width="200" height="120" as="geometry"/>
32
+ </mxCell>
33
+ <mxCell id="nmw-4" value="&lt;b&gt;Dynamic query construction&lt;/b&gt;&lt;br&gt;&lt;br&gt;query = &quot;select ...&quot;&lt;br&gt;&lt;i&gt;ActiveRelation vs interpolation&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_nmw" vertex="1">
34
+ <mxGeometry x="450" y="50" width="200" height="120" as="geometry"/>
35
+ </mxCell>
36
+ <mxCell id="nmw-5" value="&lt;b&gt;Query in controller&lt;/b&gt;&lt;br&gt;&lt;i&gt;Move out to Query object&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_nmw" vertex="1">
37
+ <mxGeometry x="670" y="50" width="200" height="120" as="geometry"/>
38
+ </mxCell>
39
+ <mxCell id="nmw-6" value="&lt;b&gt;Build outputs&lt;/b&gt;&lt;br&gt;Multiple @instance vars&lt;br&gt;&lt;i&gt;single view model @vm&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_nmw" vertex="1">
40
+ <mxGeometry x="10" y="270" width="200" height="120" as="geometry"/>
41
+ </mxCell>
42
+ <mxCell id="nmw-7" value="&lt;b&gt;Composite outputs&lt;/b&gt;&lt;br&gt;sort, direction, page_no, page_size&lt;br&gt;&lt;i&gt;single order, page or list object&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_nmw" vertex="1">
43
+ <mxGeometry x="230" y="270" width="200" height="120" as="geometry"/>
44
+ </mxCell>
45
+ </root>
46
+ </mxGraphModel>
47
+ </diagram>
48
+ </mxfile>