drawio_dsl 0.8.9 → 0.8.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 52304d0b7456dc14875a5efa1c23a381519f56df4bad75b064a1099661c1ffb7
4
- data.tar.gz: 36a50a3a283e532237818a90fe35eb2aa251e923a7adc4f10a43fedf008a8886
3
+ metadata.gz: 9319c3a01f6b90a72ad1ea046b4d5b137bc5d95884aa965897107cab42767400
4
+ data.tar.gz: 540afa73c098a5ad7f34385e5daaa2788013fa645ac6fa6fa38bd9ea5bfaf518
5
5
  SHA512:
6
- metadata.gz: c8f281fb7c93e1d144b3eb69f0e5439965b20ba715a9894a3cfb721c6dc4648d40be0a22228062277eb4268bb87465b61fb249ed5187a3e9738348910d40c0fb
7
- data.tar.gz: 5636ebd171bab8dd28ac59a066d969bdcaf84916680c66070531bdb36f5d5208f545792bc46cdd0d8e3b8e58a1e997c20b328c78342b41ea6aafe831528da99e
6
+ metadata.gz: 984f3c6daea4ed175dd45097797ca75e075fd2c7d68b5ae58ce8d291972739b76dd1599e026a5943eaedceb54b5af5d5ed45d01bf65400c85a2da76c30d70a2e
7
+ data.tar.gz: bfab2ad3f796260c5367e9b522a1025a222e9f16e79dae457b63d2488b2fe86c642433346bb55acd56d44eafd14ffb1ff6279e183d282c78b1547ec146e04f63
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,10 @@
1
+ ## [0.8.9](https://github.com/klueless-io/drawio_dsl/compare/v0.8.8...v0.8.9) (2022-03-22)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * configuration for line strokes, connector compass [direction, design, arrows, waypoints] ([f2cd8a7](https://github.com/klueless-io/drawio_dsl/commit/f2cd8a70904054909dcce10535dcab2d6013136d))
7
+
1
8
  ## [0.8.8](https://github.com/klueless-io/drawio_dsl/compare/v0.8.7...v0.8.8) (2022-03-21)
2
9
 
3
10
 
@@ -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>