@strapi/database 4.10.0-beta.1 → 4.10.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 (87) hide show
  1. package/coverage/clover.xml +2669 -0
  2. package/coverage/coverage-final.json +56 -0
  3. package/coverage/lcov-report/base.css +224 -0
  4. package/coverage/lcov-report/block-navigation.js +87 -0
  5. package/coverage/lcov-report/favicon.png +0 -0
  6. package/coverage/lcov-report/index.html +356 -0
  7. package/coverage/lcov-report/lib/entity-manager/entity-repository.js.html +532 -0
  8. package/coverage/lcov-report/lib/entity-manager/index.html +176 -0
  9. package/coverage/lcov-report/lib/entity-manager/index.js.html +3832 -0
  10. package/coverage/lcov-report/lib/entity-manager/morph-relations.js.html +274 -0
  11. package/coverage/lcov-report/lib/entity-manager/regular-relations.js.html +1246 -0
  12. package/coverage/lcov-report/lib/entity-manager/relations-orderer.js.html +760 -0
  13. package/coverage/lcov-report/lib/errors/database.js.html +121 -0
  14. package/coverage/lcov-report/lib/errors/index.html +206 -0
  15. package/coverage/lcov-report/lib/errors/index.js.html +136 -0
  16. package/coverage/lcov-report/lib/errors/invalid-date.js.html +127 -0
  17. package/coverage/lcov-report/lib/errors/invalid-datetime.js.html +127 -0
  18. package/coverage/lcov-report/lib/errors/invalid-relation.js.html +127 -0
  19. package/coverage/lcov-report/lib/errors/invalid-time.js.html +127 -0
  20. package/coverage/lcov-report/lib/errors/not-null.js.html +130 -0
  21. package/coverage/lcov-report/lib/fields/biginteger.js.html +136 -0
  22. package/coverage/lcov-report/lib/fields/boolean.js.html +202 -0
  23. package/coverage/lcov-report/lib/fields/date.js.html +133 -0
  24. package/coverage/lcov-report/lib/fields/datetime.js.html +142 -0
  25. package/coverage/lcov-report/lib/fields/field.js.html +136 -0
  26. package/coverage/lcov-report/lib/fields/index.html +266 -0
  27. package/coverage/lcov-report/lib/fields/index.js.html +232 -0
  28. package/coverage/lcov-report/lib/fields/json.js.html +133 -0
  29. package/coverage/lcov-report/lib/fields/number.js.html +154 -0
  30. package/coverage/lcov-report/lib/fields/shared/index.html +116 -0
  31. package/coverage/lcov-report/lib/fields/shared/parsers.js.html +292 -0
  32. package/coverage/lcov-report/lib/fields/string.js.html +136 -0
  33. package/coverage/lcov-report/lib/fields/time.js.html +136 -0
  34. package/coverage/lcov-report/lib/fields/timestamp.js.html +142 -0
  35. package/coverage/lcov-report/lib/index.html +131 -0
  36. package/coverage/lcov-report/lib/index.js.html +457 -0
  37. package/coverage/lcov-report/lib/lifecycles/index.html +116 -0
  38. package/coverage/lcov-report/lib/lifecycles/index.js.html +355 -0
  39. package/coverage/lcov-report/lib/lifecycles/subscribers/index.html +131 -0
  40. package/coverage/lcov-report/lib/lifecycles/subscribers/models-lifecycles.js.html +142 -0
  41. package/coverage/lcov-report/lib/lifecycles/subscribers/timestamps.js.html +280 -0
  42. package/coverage/lcov-report/lib/metadata/index.html +131 -0
  43. package/coverage/lcov-report/lib/metadata/index.js.html +817 -0
  44. package/coverage/lcov-report/lib/metadata/relations.js.html +1783 -0
  45. package/coverage/lcov-report/lib/query/helpers/index.html +191 -0
  46. package/coverage/lcov-report/lib/query/helpers/index.js.html +118 -0
  47. package/coverage/lcov-report/lib/query/helpers/join.js.html +373 -0
  48. package/coverage/lcov-report/lib/query/helpers/order-by.js.html +295 -0
  49. package/coverage/lcov-report/lib/query/helpers/populate/apply.js.html +2077 -0
  50. package/coverage/lcov-report/lib/query/helpers/populate/index.html +146 -0
  51. package/coverage/lcov-report/lib/query/helpers/populate/index.js.html +112 -0
  52. package/coverage/lcov-report/lib/query/helpers/populate/process.js.html +391 -0
  53. package/coverage/lcov-report/lib/query/helpers/search.js.html +337 -0
  54. package/coverage/lcov-report/lib/query/helpers/streams/index.html +131 -0
  55. package/coverage/lcov-report/lib/query/helpers/streams/index.js.html +100 -0
  56. package/coverage/lcov-report/lib/query/helpers/streams/readable.js.html +607 -0
  57. package/coverage/lcov-report/lib/query/helpers/transform.js.html +337 -0
  58. package/coverage/lcov-report/lib/query/helpers/where.js.html +1255 -0
  59. package/coverage/lcov-report/lib/query/index.html +131 -0
  60. package/coverage/lcov-report/lib/query/index.js.html +106 -0
  61. package/coverage/lcov-report/lib/query/query-builder.js.html +1627 -0
  62. package/coverage/lcov-report/lib/schema/builder.js.html +1243 -0
  63. package/coverage/lcov-report/lib/schema/diff.js.html +1207 -0
  64. package/coverage/lcov-report/lib/schema/index.html +176 -0
  65. package/coverage/lcov-report/lib/schema/index.js.html +367 -0
  66. package/coverage/lcov-report/lib/schema/schema.js.html +688 -0
  67. package/coverage/lcov-report/lib/schema/storage.js.html +313 -0
  68. package/coverage/lcov-report/lib/transaction-context.js.html +136 -0
  69. package/coverage/lcov-report/lib/types/index.html +116 -0
  70. package/coverage/lcov-report/lib/types/index.js.html +187 -0
  71. package/coverage/lcov-report/lib/utils/content-types.js.html +205 -0
  72. package/coverage/lcov-report/lib/utils/index.html +131 -0
  73. package/coverage/lcov-report/lib/utils/knex.js.html +151 -0
  74. package/coverage/lcov-report/lib/validations/index.html +116 -0
  75. package/coverage/lcov-report/lib/validations/index.js.html +145 -0
  76. package/coverage/lcov-report/lib/validations/relations/bidirectional.js.html +352 -0
  77. package/coverage/lcov-report/lib/validations/relations/index.html +131 -0
  78. package/coverage/lcov-report/lib/validations/relations/index.js.html +127 -0
  79. package/coverage/lcov-report/prettify.css +1 -0
  80. package/coverage/lcov-report/prettify.js +2 -0
  81. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  82. package/coverage/lcov-report/sorter.js +196 -0
  83. package/coverage/lcov.info +5179 -0
  84. package/lib/dialects/mysql/index.js +5 -1
  85. package/lib/entity-manager/regular-relations.js +1 -1
  86. package/lib/metadata/relations.js +10 -0
  87. package/package.json +2 -2
@@ -0,0 +1,1246 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for lib/entity-manager/regular-relations.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">lib/entity-manager</a> regular-relations.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">12.35% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>11/89</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/60</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/8</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">12.5% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>11/88</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-yes">1x</span>
456
+ <span class="cline-any cline-yes">1x</span>
457
+ <span class="cline-any cline-neutral">&nbsp;</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-neutral">&nbsp;</span>
461
+ <span class="cline-any cline-neutral">&nbsp;</span>
462
+ <span class="cline-any cline-neutral">&nbsp;</span>
463
+ <span class="cline-any cline-neutral">&nbsp;</span>
464
+ <span class="cline-any cline-neutral">&nbsp;</span>
465
+ <span class="cline-any cline-yes">1x</span>
466
+ <span class="cline-any cline-yes">1x</span>
467
+ <span class="cline-any cline-yes">1x</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-neutral">&nbsp;</span>
472
+ <span class="cline-any cline-neutral">&nbsp;</span>
473
+ <span class="cline-any cline-neutral">&nbsp;</span>
474
+ <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-yes">1x</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-neutral">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-no">&nbsp;</span>
490
+ <span class="cline-any cline-no">&nbsp;</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-neutral">&nbsp;</span>
495
+ <span class="cline-any cline-neutral">&nbsp;</span>
496
+ <span class="cline-any cline-neutral">&nbsp;</span>
497
+ <span class="cline-any cline-neutral">&nbsp;</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-neutral">&nbsp;</span>
501
+ <span class="cline-any cline-neutral">&nbsp;</span>
502
+ <span class="cline-any cline-no">&nbsp;</span>
503
+ <span class="cline-any cline-neutral">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-neutral">&nbsp;</span>
513
+ <span class="cline-any cline-yes">1x</span>
514
+ <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-no">&nbsp;</span>
521
+ <span class="cline-any cline-no">&nbsp;</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-no">&nbsp;</span>
524
+ <span class="cline-any cline-no">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-no">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-no">&nbsp;</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-neutral">&nbsp;</span>
532
+ <span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-neutral">&nbsp;</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-neutral">&nbsp;</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-neutral">&nbsp;</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-no">&nbsp;</span>
542
+ <span class="cline-any cline-neutral">&nbsp;</span>
543
+ <span class="cline-any cline-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-neutral">&nbsp;</span>
545
+ <span class="cline-any cline-neutral">&nbsp;</span>
546
+ <span class="cline-any cline-neutral">&nbsp;</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-neutral">&nbsp;</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-no">&nbsp;</span>
552
+ <span class="cline-any cline-neutral">&nbsp;</span>
553
+ <span class="cline-any cline-neutral">&nbsp;</span>
554
+ <span class="cline-any cline-neutral">&nbsp;</span>
555
+ <span class="cline-any cline-no">&nbsp;</span>
556
+ <span class="cline-any cline-neutral">&nbsp;</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-neutral">&nbsp;</span>
564
+ <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-neutral">&nbsp;</span>
566
+ <span class="cline-any cline-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-yes">1x</span>
577
+ <span class="cline-any cline-neutral">&nbsp;</span>
578
+ <span class="cline-any cline-neutral">&nbsp;</span>
579
+ <span class="cline-any cline-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-no">&nbsp;</span>
585
+ <span class="cline-any cline-no">&nbsp;</span>
586
+ <span class="cline-any cline-no">&nbsp;</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-no">&nbsp;</span>
589
+ <span class="cline-any cline-no">&nbsp;</span>
590
+ <span class="cline-any cline-no">&nbsp;</span>
591
+ <span class="cline-any cline-no">&nbsp;</span>
592
+ <span class="cline-any cline-no">&nbsp;</span>
593
+ <span class="cline-any cline-no">&nbsp;</span>
594
+ <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-neutral">&nbsp;</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-neutral">&nbsp;</span>
599
+ <span class="cline-any cline-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-neutral">&nbsp;</span>
606
+ <span class="cline-any cline-no">&nbsp;</span>
607
+ <span class="cline-any cline-no">&nbsp;</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-no">&nbsp;</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-no">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-neutral">&nbsp;</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-neutral">&nbsp;</span>
619
+ <span class="cline-any cline-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-neutral">&nbsp;</span>
621
+ <span class="cline-any cline-no">&nbsp;</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-no">&nbsp;</span>
625
+ <span class="cline-any cline-neutral">&nbsp;</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span>
627
+ <span class="cline-any cline-neutral">&nbsp;</span>
628
+ <span class="cline-any cline-neutral">&nbsp;</span>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-neutral">&nbsp;</span>
631
+ <span class="cline-any cline-neutral">&nbsp;</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-neutral">&nbsp;</span>
636
+ <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-yes">1x</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-neutral">&nbsp;</span>
654
+ <span class="cline-any cline-no">&nbsp;</span>
655
+ <span class="cline-any cline-no">&nbsp;</span>
656
+ <span class="cline-any cline-no">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-no">&nbsp;</span>
660
+ <span class="cline-any cline-no">&nbsp;</span>
661
+ <span class="cline-any cline-no">&nbsp;</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-no">&nbsp;</span>
665
+ <span class="cline-any cline-no">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-no">&nbsp;</span>
669
+ <span class="cline-any cline-no">&nbsp;</span>
670
+ <span class="cline-any cline-no">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
+ <span class="cline-any cline-no">&nbsp;</span>
674
+ <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-no">&nbsp;</span>
679
+ <span class="cline-any cline-no">&nbsp;</span>
680
+ <span class="cline-any cline-no">&nbsp;</span>
681
+ <span class="cline-any cline-no">&nbsp;</span>
682
+ <span class="cline-any cline-no">&nbsp;</span>
683
+ <span class="cline-any cline-no">&nbsp;</span>
684
+ <span class="cline-any cline-neutral">&nbsp;</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-no">&nbsp;</span>
687
+ <span class="cline-any cline-neutral">&nbsp;</span>
688
+ <span class="cline-any cline-neutral">&nbsp;</span>
689
+ <span class="cline-any cline-no">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-no">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-no">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-yes">1x</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-no">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-no">&nbsp;</span>
799
+ <span class="cline-any cline-no">&nbsp;</span>
800
+ <span class="cline-any cline-no">&nbsp;</span>
801
+ <span class="cline-any cline-no">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-no">&nbsp;</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-neutral">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-yes">1x</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict';
841
+ &nbsp;
842
+ const { map, isEmpty } = require('lodash/fp');
843
+ const { randomBytes } = require('crypto');
844
+ &nbsp;
845
+ const {
846
+ isBidirectional,
847
+ isOneToAny,
848
+ isManyToAny,
849
+ isAnyToOne,
850
+ hasOrderColumn,
851
+ hasInverseOrderColumn,
852
+ } = require('../metadata/relations');
853
+ const { createQueryBuilder } = require('../query');
854
+ const { addSchema } = require('../utils/knex');
855
+ &nbsp;
856
+ /**
857
+ * If some relations currently exist for this oneToX relation, on the one side, this function removes them and update the inverse order if needed.
858
+ * @param {Object} params
859
+ * @param {string} params.id - entity id on which the relations for entities relIdsToadd are created
860
+ * @param {string} params.attribute - attribute of the relation
861
+ * @param {string} params.inverseRelIds - entity ids of the inverse side for which the current relations will be deleted
862
+ * @param {string} params.db - database instance
863
+ */
864
+ const deletePreviousOneToAnyRelations = <span class="fstat-no" title="function not covered" >as</span>ync ({
865
+ id,
866
+ attribute,
867
+ relIdsToadd,
868
+ db,
869
+ transaction: trx,
870
+ }) =&gt; {
871
+ <span class="cstat-no" title="statement not covered" > if (!(isBidirectional(attribute) &amp;&amp; isOneToAny(attribute))) {</span>
872
+ <span class="cstat-no" title="statement not covered" > throw new Error(</span>
873
+ 'deletePreviousOneToAnyRelations can only be called for bidirectional oneToAny relations'
874
+ );
875
+ }
876
+ const { joinTable } = <span class="cstat-no" title="statement not covered" >attribute;</span>
877
+ const { joinColumn, inverseJoinColumn } = <span class="cstat-no" title="statement not covered" >joinTable;</span>
878
+ &nbsp;
879
+ <span class="cstat-no" title="statement not covered" > await createQueryBuilder(joinTable.name, db)</span>
880
+ .delete()
881
+ .where({
882
+ [inverseJoinColumn.name]: relIdsToadd,
883
+ [joinColumn.name]: { $ne: id },
884
+ })
885
+ .where(joinTable.on || {})
886
+ .transacting(trx)
887
+ .execute();
888
+ &nbsp;
889
+ <span class="cstat-no" title="statement not covered" > await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToadd, transaction: trx });</span>
890
+ };
891
+ &nbsp;
892
+ /**
893
+ * If a relation currently exists for this xToOne relations, this function removes it and update the inverse order if needed.
894
+ * @param {Object} params
895
+ * @param {string} params.id - entity id on which the relation for entity relIdToadd is created
896
+ * @param {string} params.attribute - attribute of the relation
897
+ * @param {string} params.relIdToadd - entity id of the new relation
898
+ * @param {string} params.db - database instance
899
+ */
900
+ const deletePreviousAnyToOneRelations = <span class="fstat-no" title="function not covered" >as</span>ync ({
901
+ id,
902
+ attribute,
903
+ relIdToadd,
904
+ db,
905
+ transaction: trx,
906
+ }) =&gt; {
907
+ const { joinTable } = <span class="cstat-no" title="statement not covered" >attribute;</span>
908
+ const { joinColumn, inverseJoinColumn } = <span class="cstat-no" title="statement not covered" >joinTable;</span>
909
+ &nbsp;
910
+ <span class="cstat-no" title="statement not covered" > if (!isAnyToOne(attribute)) {</span>
911
+ <span class="cstat-no" title="statement not covered" > throw new Error('deletePreviousAnyToOneRelations can only be called for anyToOne relations');</span>
912
+ }
913
+ // handling manyToOne
914
+ <span class="cstat-no" title="statement not covered" > if (isManyToAny(attribute)) {</span>
915
+ // if the database integrity was not broken relsToDelete is supposed to be of length 1
916
+ const relsToDelete = <span class="cstat-no" title="statement not covered" >await createQueryBuilder(joinTable.name, db)</span>
917
+ .select(inverseJoinColumn.name)
918
+ .where({
919
+ [joinColumn.name]: id,
920
+ [inverseJoinColumn.name]: { $ne: relIdToadd },
921
+ })
922
+ .where(joinTable.on || {})
923
+ .transacting(trx)
924
+ .execute();
925
+ &nbsp;
926
+ const relIdsToDelete = <span class="cstat-no" title="statement not covered" >map(inverseJoinColumn.name, relsToDelete);</span>
927
+ &nbsp;
928
+ <span class="cstat-no" title="statement not covered" > await createQueryBuilder(joinTable.name, db)</span>
929
+ .delete()
930
+ .where({
931
+ [joinColumn.name]: id,
932
+ [inverseJoinColumn.name]: { $in: relIdsToDelete },
933
+ })
934
+ .where(joinTable.on || {})
935
+ .transacting(trx)
936
+ .execute();
937
+ &nbsp;
938
+ <span class="cstat-no" title="statement not covered" > await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToDelete, transaction: trx });</span>
939
+ &nbsp;
940
+ // handling oneToOne
941
+ } else {
942
+ <span class="cstat-no" title="statement not covered" > await createQueryBuilder(joinTable.name, db)</span>
943
+ .delete()
944
+ .where({
945
+ [joinColumn.name]: id,
946
+ [inverseJoinColumn.name]: { $ne: relIdToadd },
947
+ })
948
+ .where(joinTable.on || {})
949
+ .transacting(trx)
950
+ .execute();
951
+ }
952
+ };
953
+ &nbsp;
954
+ /**
955
+ * Delete all or some relations of entity field
956
+ * @param {Object} params
957
+ * @param {string} params.id - entity id for which the relations will be deleted
958
+ * @param {string} params.attribute - attribute of the relation
959
+ * @param {string} params.db - database instance
960
+ * @param {string} params.relIdsToDelete - ids of entities to remove from the relations. Also accepts 'all'
961
+ * @param {string} params.relIdsToNotDelete - ids of entities to not remove from the relation when relIdsToDelete equals 'all'
962
+ */
963
+ const deleteRelations = <span class="fstat-no" title="function not covered" >as</span>ync ({
964
+ id,
965
+ attribute,
966
+ db,
967
+ relIdsToNotDelete = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span>
968
+ relIdsToDelete = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span>
969
+ transaction: trx,
970
+ }) =&gt; {
971
+ const { joinTable } = <span class="cstat-no" title="statement not covered" >attribute;</span>
972
+ const { joinColumn, inverseJoinColumn } = <span class="cstat-no" title="statement not covered" >joinTable;</span>
973
+ const all = <span class="cstat-no" title="statement not covered" >relIdsToDelete === 'all';</span>
974
+ &nbsp;
975
+ <span class="cstat-no" title="statement not covered" > if (hasOrderColumn(attribute) || hasInverseOrderColumn(attribute)) {</span>
976
+ let lastId = <span class="cstat-no" title="statement not covered" >0;</span>
977
+ let done = <span class="cstat-no" title="statement not covered" >false;</span>
978
+ const batchSize = <span class="cstat-no" title="statement not covered" >100;</span>
979
+ <span class="cstat-no" title="statement not covered" > while (!done) {</span>
980
+ const batchToDelete = <span class="cstat-no" title="statement not covered" >await createQueryBuilder(joinTable.name, db)</span>
981
+ .select(inverseJoinColumn.name)
982
+ .where({
983
+ [joinColumn.name]: id,
984
+ id: { $gt: lastId },
985
+ [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },
986
+ ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),
987
+ })
988
+ .where(joinTable.on || {})
989
+ .orderBy('id')
990
+ .limit(batchSize)
991
+ .transacting(trx)
992
+ .execute();
993
+ <span class="cstat-no" title="statement not covered" > done = batchToDelete.length &lt; batchSize;</span>
994
+ <span class="cstat-no" title="statement not covered" > lastId = batchToDelete[batchToDelete.length - 1]?.id;</span>
995
+ &nbsp;
996
+ const batchIds = <span class="cstat-no" title="statement not covered" >map(inverseJoinColumn.name, batchToDelete);</span>
997
+ &nbsp;
998
+ <span class="cstat-no" title="statement not covered" > await createQueryBuilder(joinTable.name, db)</span>
999
+ .delete()
1000
+ .where({
1001
+ [joinColumn.name]: id,
1002
+ [inverseJoinColumn.name]: { $in: batchIds },
1003
+ })
1004
+ .where(joinTable.on || {})
1005
+ .transacting(trx)
1006
+ .execute();
1007
+ &nbsp;
1008
+ <span class="cstat-no" title="statement not covered" > await cleanOrderColumns({ attribute, db, id, inverseRelIds: batchIds, transaction: trx });</span>
1009
+ }
1010
+ } else {
1011
+ <span class="cstat-no" title="statement not covered" > await createQueryBuilder(joinTable.name, db)</span>
1012
+ .delete()
1013
+ .where({
1014
+ [joinColumn.name]: id,
1015
+ [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },
1016
+ ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),
1017
+ })
1018
+ .where(joinTable.on || {})
1019
+ .transacting(trx)
1020
+ .execute();
1021
+ }
1022
+ };
1023
+ &nbsp;
1024
+ /**
1025
+ * Clean the order columns by ensuring the order value are continuous (ex: 1, 2, 3 and not 1, 5, 10)
1026
+ * @param {Object} params
1027
+ * @param {string} params.id - entity id for which the clean will be done
1028
+ * @param {string} params.attribute - attribute of the relation
1029
+ * @param {string} params.db - database instance
1030
+ * @param {string} params.inverseRelIds - entity ids of the inverse side for which the clean will be done
1031
+ */
1032
+ const cleanOrderColumns = <span class="fstat-no" title="function not covered" >as</span>ync ({ id, attribute, db, inverseRelIds, transaction: trx }) =&gt; {
1033
+ <span class="cstat-no" title="statement not covered" > if (</span>
1034
+ !(hasOrderColumn(attribute) &amp;&amp; id) &amp;&amp;
1035
+ !(hasInverseOrderColumn(attribute) &amp;&amp; !isEmpty(inverseRelIds))
1036
+ ) {
1037
+ <span class="cstat-no" title="statement not covered" > return;</span>
1038
+ }
1039
+ &nbsp;
1040
+ // Handle databases that don't support window function ROW_NUMBER (here it's MySQL 5)
1041
+ <span class="cstat-no" title="statement not covered" > if (!strapi.db.dialect.supportsWindowFunctions()) {</span>
1042
+ <span class="cstat-no" title="statement not covered" > await cleanOrderColumnsForOldDatabases({ id, attribute, db, inverseRelIds, transaction: trx });</span>
1043
+ <span class="cstat-no" title="statement not covered" > return;</span>
1044
+ }
1045
+ &nbsp;
1046
+ const { joinTable } = <span class="cstat-no" title="statement not covered" >attribute;</span>
1047
+ const { joinColumn, inverseJoinColumn, orderColumnName, inverseOrderColumnName } = <span class="cstat-no" title="statement not covered" >joinTable;</span>
1048
+ const update = <span class="cstat-no" title="statement not covered" >[];</span>
1049
+ const updateBinding = <span class="cstat-no" title="statement not covered" >[];</span>
1050
+ const select = <span class="cstat-no" title="statement not covered" >['??'];</span>
1051
+ const selectBinding = <span class="cstat-no" title="statement not covered" >['id'];</span>
1052
+ const where = <span class="cstat-no" title="statement not covered" >[];</span>
1053
+ const whereBinding = <span class="cstat-no" title="statement not covered" >[];</span>
1054
+ &nbsp;
1055
+ <span class="cstat-no" title="statement not covered" > if (hasOrderColumn(attribute) &amp;&amp; id) {</span>
1056
+ <span class="cstat-no" title="statement not covered" > update.push('?? = b.src_order');</span>
1057
+ <span class="cstat-no" title="statement not covered" > updateBinding.push(orderColumnName);</span>
1058
+ <span class="cstat-no" title="statement not covered" > select.push('ROW_NUMBER() OVER (PARTITION BY ?? ORDER BY ??) AS src_order');</span>
1059
+ <span class="cstat-no" title="statement not covered" > selectBinding.push(joinColumn.name, orderColumnName);</span>
1060
+ <span class="cstat-no" title="statement not covered" > where.push('?? = ?');</span>
1061
+ <span class="cstat-no" title="statement not covered" > whereBinding.push(joinColumn.name, id);</span>
1062
+ }
1063
+ &nbsp;
1064
+ <span class="cstat-no" title="statement not covered" > if (hasInverseOrderColumn(attribute) &amp;&amp; !isEmpty(inverseRelIds)) {</span>
1065
+ <span class="cstat-no" title="statement not covered" > update.push('?? = b.inv_order');</span>
1066
+ <span class="cstat-no" title="statement not covered" > updateBinding.push(inverseOrderColumnName);</span>
1067
+ <span class="cstat-no" title="statement not covered" > select.push('ROW_NUMBER() OVER (PARTITION BY ?? ORDER BY ??) AS inv_order');</span>
1068
+ <span class="cstat-no" title="statement not covered" > selectBinding.push(inverseJoinColumn.name, inverseOrderColumnName);</span>
1069
+ <span class="cstat-no" title="statement not covered" > where.push(`?? IN (${inverseRelIds.map(<span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >'?')</span>.join(', ')})`);</span>
1070
+ <span class="cstat-no" title="statement not covered" > whereBinding.push(inverseJoinColumn.name, ...inverseRelIds);</span>
1071
+ }
1072
+ &nbsp;
1073
+ <span class="cstat-no" title="statement not covered" > switch (strapi.db.dialect.client) {</span>
1074
+ case 'mysql':
1075
+ // Here it's MariaDB and MySQL 8
1076
+ <span class="cstat-no" title="statement not covered" > await db</span>
1077
+ .getConnection()
1078
+ .raw(
1079
+ `UPDATE
1080
+ ?? as a,
1081
+ (
1082
+ SELECT ${select.join(', ')}
1083
+ FROM ??
1084
+ WHERE ${where.join(' OR ')}
1085
+ ) AS b
1086
+ SET ${update.join(', ')}
1087
+ WHERE b.id = a.id`,
1088
+ [joinTable.name, ...selectBinding, joinTable.name, ...whereBinding, ...updateBinding]
1089
+ )
1090
+ .transacting(trx);
1091
+ <span class="cstat-no" title="statement not covered" > break;</span>
1092
+ /*
1093
+ UPDATE
1094
+ :joinTable: as a,
1095
+ (
1096
+ SELECT
1097
+ id,
1098
+ ROW_NUMBER() OVER ( PARTITION BY :joinColumn: ORDER BY :orderColumn:) AS src_order,
1099
+ ROW_NUMBER() OVER ( PARTITION BY :inverseJoinColumn: ORDER BY :inverseOrderColumn:) AS inv_order
1100
+ FROM :joinTable:
1101
+ WHERE :joinColumn: = :id OR :inverseJoinColumn: IN (:inverseRelIds)
1102
+ ) AS b
1103
+ SET :orderColumn: = b.src_order, :inverseOrderColumn: = b.inv_order
1104
+ WHERE b.id = a.id;
1105
+ */
1106
+ default: {
1107
+ const joinTableName = <span class="cstat-no" title="statement not covered" >addSchema(joinTable.name);</span>
1108
+ &nbsp;
1109
+ // raw query as knex doesn't allow updating from a subquery
1110
+ // https://github.com/knex/knex/issues/2504
1111
+ <span class="cstat-no" title="statement not covered" > await db.connection</span>
1112
+ .raw(
1113
+ `UPDATE ?? as a
1114
+ SET ${update.join(', ')}
1115
+ FROM (
1116
+ SELECT ${select.join(', ')}
1117
+ FROM ??
1118
+ WHERE ${where.join(' OR ')}
1119
+ ) AS b
1120
+ WHERE b.id = a.id`,
1121
+ [joinTableName, ...updateBinding, ...selectBinding, joinTableName, ...whereBinding]
1122
+ )
1123
+ .transacting(trx);
1124
+ &nbsp;
1125
+ /*
1126
+ UPDATE :joinTable: as a
1127
+ SET :orderColumn: = b.src_order, :inverseOrderColumn: = b.inv_order
1128
+ FROM (
1129
+ SELECT
1130
+ id,
1131
+ ROW_NUMBER() OVER ( PARTITION BY :joinColumn: ORDER BY :orderColumn:) AS src_order,
1132
+ ROW_NUMBER() OVER ( PARTITION BY :inverseJoinColumn: ORDER BY :inverseOrderColumn:) AS inv_order
1133
+ FROM :joinTable:
1134
+ WHERE :joinColumn: = :id OR :inverseJoinColumn: IN (:inverseRelIds)
1135
+ ) AS b
1136
+ WHERE b.id = a.id;
1137
+ */
1138
+ }
1139
+ }
1140
+ };
1141
+ &nbsp;
1142
+ /*
1143
+ * Ensure that orders are following a 1, 2, 3 sequence, without gap.
1144
+ * The use of a session variable instead of a window function makes the query compatible with MySQL 5
1145
+ */
1146
+ const cleanOrderColumnsForOldDatabases = <span class="fstat-no" title="function not covered" >as</span>ync ({
1147
+ id,
1148
+ attribute,
1149
+ db,
1150
+ inverseRelIds,
1151
+ transaction: trx,
1152
+ }) =&gt; {
1153
+ const { joinTable } = <span class="cstat-no" title="statement not covered" >attribute;</span>
1154
+ const { joinColumn, inverseJoinColumn, orderColumnName, inverseOrderColumnName } = <span class="cstat-no" title="statement not covered" >joinTable;</span>
1155
+ &nbsp;
1156
+ const randomSuffix = <span class="cstat-no" title="statement not covered" >`${new Date().valueOf()}_${randomBytes(16).toString('hex')}`;</span>
1157
+ &nbsp;
1158
+ <span class="cstat-no" title="statement not covered" > if (hasOrderColumn(attribute) &amp;&amp; id) {</span>
1159
+ // raw query as knex doesn't allow updating from a subquery
1160
+ // https://github.com/knex/knex/issues/2504
1161
+ const orderVar = <span class="cstat-no" title="statement not covered" >`order_${randomSuffix}`;</span>
1162
+ <span class="cstat-no" title="statement not covered" > await db.connection.raw(`SET @${orderVar} = 0;`).transacting(trx);</span>
1163
+ <span class="cstat-no" title="statement not covered" > await db.connection</span>
1164
+ .raw(
1165
+ `UPDATE :joinTableName: as a, (
1166
+ SELECT id, (@${orderVar}:=@${orderVar} + 1) AS src_order
1167
+ FROM :joinTableName:
1168
+ WHERE :joinColumnName: = :id
1169
+ ORDER BY :orderColumnName:
1170
+ ) AS b
1171
+ SET :orderColumnName: = b.src_order
1172
+ WHERE a.id = b.id
1173
+ AND a.:joinColumnName: = :id`,
1174
+ {
1175
+ joinTableName: joinTable.name,
1176
+ orderColumnName,
1177
+ joinColumnName: joinColumn.name,
1178
+ id,
1179
+ }
1180
+ )
1181
+ .transacting(trx);
1182
+ }
1183
+ &nbsp;
1184
+ <span class="cstat-no" title="statement not covered" > if (hasInverseOrderColumn(attribute) &amp;&amp; !isEmpty(inverseRelIds)) {</span>
1185
+ const orderVar = <span class="cstat-no" title="statement not covered" >`order_${randomSuffix}`;</span>
1186
+ const columnVar = <span class="cstat-no" title="statement not covered" >`col_${randomSuffix}`;</span>
1187
+ <span class="cstat-no" title="statement not covered" > await db.connection.raw(`SET @${orderVar} = 0;`).transacting(trx);</span>
1188
+ <span class="cstat-no" title="statement not covered" > await db.connection</span>
1189
+ .raw(
1190
+ `UPDATE ?? as a, (
1191
+ SELECT
1192
+ id,
1193
+ @${orderVar}:=CASE WHEN @${columnVar} = ?? THEN @${orderVar} + 1 ELSE 1 END AS inv_order,
1194
+ @${columnVar}:=?? ??
1195
+ FROM ?? a
1196
+ WHERE ?? IN(${inverseRelIds.map(<span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >'?')</span>.join(', ')})
1197
+ ORDER BY ??, ??
1198
+ ) AS b
1199
+ SET ?? = b.inv_order
1200
+ WHERE a.id = b.id
1201
+ AND a.?? IN(${inverseRelIds.map(<span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >'?')</span>.join(', ')})`,
1202
+ [
1203
+ joinTable.name,
1204
+ inverseJoinColumn.name,
1205
+ inverseJoinColumn.name,
1206
+ inverseJoinColumn.name,
1207
+ joinTable.name,
1208
+ inverseJoinColumn.name,
1209
+ ...inverseRelIds,
1210
+ inverseJoinColumn.name,
1211
+ joinColumn.name,
1212
+ inverseOrderColumnName,
1213
+ inverseJoinColumn.name,
1214
+ ...inverseRelIds,
1215
+ ]
1216
+ )
1217
+ .transacting(trx);
1218
+ }
1219
+ };
1220
+ &nbsp;
1221
+ module.exports = {
1222
+ deletePreviousOneToAnyRelations,
1223
+ deletePreviousAnyToOneRelations,
1224
+ deleteRelations,
1225
+ cleanOrderColumns,
1226
+ };
1227
+ &nbsp;</pre></td></tr></table></pre>
1228
+
1229
+ <div class='push'></div><!-- for sticky footer -->
1230
+ </div><!-- /wrapper -->
1231
+ <div class='footer quiet pad2 space-top1 center small'>
1232
+ Code coverage generated by
1233
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1234
+ at 2023-03-15T08:52:46.420Z
1235
+ </div>
1236
+ <script src="../../prettify.js"></script>
1237
+ <script>
1238
+ window.onload = function () {
1239
+ prettyPrint();
1240
+ };
1241
+ </script>
1242
+ <script src="../../sorter.js"></script>
1243
+ <script src="../../block-navigation.js"></script>
1244
+ </body>
1245
+ </html>
1246
+