Tweaks the join reordering algorithm to prefer using bound variables

pull/21/head
Tpt 5 years ago
parent cf805ea3d1
commit 58fe455621
  1. 300
      bench/bsbm.explore.svg
  2. 16
      lib/src/sparql/plan_builder.rs

@ -27,354 +27,354 @@ z
" style="fill:#ffffff;"/>
</g>
<g id="patch_3">
<path clip-path="url(#p67969da4ac)" d="M 73.832727 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 73.832727 307.584
L 79.335347 307.584
L 79.335347 251.012211
L 73.832727 251.012211
L 79.335347 251.315159
L 73.832727 251.315159
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_4">
<path clip-path="url(#p67969da4ac)" d="M 101.345824 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 101.345824 307.584
L 106.848444 307.584
L 106.848444 239.522917
L 101.345824 239.522917
L 106.848444 239.887391
L 101.345824 239.887391
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_5">
<path clip-path="url(#p67969da4ac)" d="M 128.858921 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 128.858921 307.584
L 134.361541 307.584
L 134.361541 238.467915
L 128.858921 238.467915
L 134.361541 238.838039
L 128.858921 238.838039
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_6">
<path clip-path="url(#p67969da4ac)" d="M 156.372018 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 156.372018 307.584
L 161.874638 307.584
L 161.874638 230.035973
L 156.372018 230.035973
L 161.874638 230.451251
L 156.372018 230.451251
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_7">
<path clip-path="url(#p67969da4ac)" d="M 183.885116 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 183.885116 307.584
L 189.387735 307.584
L 189.387735 131.686644
L 183.885116 131.686644
L 189.387735 132.628593
L 183.885116 132.628593
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_8">
<path clip-path="url(#p67969da4ac)" d="M 238.91131 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 238.91131 307.584
L 244.413929 307.584
L 244.413929 253.060314
L 238.91131 253.060314
L 244.413929 253.352294
L 238.91131 253.352294
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_9">
<path clip-path="url(#p67969da4ac)" d="M 266.424407 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 266.424407 307.584
L 271.927026 307.584
L 271.927026 241.094654
L 266.424407 241.094654
L 271.927026 241.450712
L 266.424407 241.450712
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_10">
<path clip-path="url(#p67969da4ac)" d="M 293.937504 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 293.937504 307.584
L 299.440123 307.584
L 299.440123 267.294767
L 293.937504 267.294767
L 299.440123 267.51052
L 293.937504 267.51052
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_11">
<path clip-path="url(#p67969da4ac)" d="M 321.450601 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 321.450601 307.584
L 326.95322 307.584
L 326.95322 236.592057
L 321.450601 236.592057
L 326.95322 236.972226
L 321.450601 236.972226
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_12">
<path clip-path="url(#p67969da4ac)" d="M 348.963698 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 348.963698 307.584
L 354.466317 307.584
L 354.466317 268.557001
L 348.963698 268.557001
L 354.466317 268.765995
L 348.963698 268.765995
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_13">
<path clip-path="url(#p67969da4ac)" d="M 376.476795 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 376.476795 307.584
L 381.979414 307.584
L 381.979414 254.847358
L 376.476795 254.847358
L 381.979414 255.129769
L 376.476795 255.129769
z
" style="fill:#1f77b4;"/>
</g>
<g id="patch_14">
<path clip-path="url(#p67969da4ac)" d="M 79.335347 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 79.335347 307.584
L 84.837966 307.584
L 84.837966 304.295193
L 79.335347 304.295193
L 84.837966 304.312805
L 79.335347 304.312805
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_15">
<path clip-path="url(#p67969da4ac)" d="M 106.848444 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 106.848444 307.584
L 112.351063 307.584
L 112.351063 300.861054
L 106.848444 300.861054
L 112.351063 300.897056
L 106.848444 300.897056
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_16">
<path clip-path="url(#p67969da4ac)" d="M 134.361541 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 134.361541 307.584
L 139.86416 307.584
L 139.86416 303.614286
L 134.361541 303.614286
L 139.86416 303.635544
L 134.361541 303.635544
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_17">
<path clip-path="url(#p67969da4ac)" d="M 161.874638 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 161.874638 307.584
L 167.377257 307.584
L 167.377257 303.25903
L 161.874638 303.25903
L 167.377257 303.282191
L 161.874638 303.282191
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_18">
<path clip-path="url(#p67969da4ac)" d="M 189.387735 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 189.387735 307.584
L 194.890354 307.584
L 194.890354 273.958504
L 189.387735 273.958504
L 194.890354 274.138572
L 189.387735 274.138572
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_19">
<path clip-path="url(#p67969da4ac)" d="M 244.413929 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 244.413929 307.584
L 249.916549 307.584
L 249.916549 301.213618
L 244.413929 301.213618
L 249.916549 301.247732
L 244.413929 301.247732
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_20">
<path clip-path="url(#p67969da4ac)" d="M 271.927026 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 271.927026 307.584
L 277.429646 307.584
L 277.429646 302.357434
L 271.927026 302.357434
L 277.429646 302.385423
L 271.927026 302.385423
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_21">
<path clip-path="url(#p67969da4ac)" d="M 299.440123 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 299.440123 307.584
L 304.942743 307.584
L 304.942743 304.688127
L 299.440123 304.688127
L 304.942743 304.703635
L 299.440123 304.703635
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_22">
<path clip-path="url(#p67969da4ac)" d="M 326.95322 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 326.95322 307.584
L 332.45584 307.584
L 332.45584 303.331696
L 326.95322 303.331696
L 332.45584 303.354468
L 326.95322 303.354468
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_23">
<path clip-path="url(#p67969da4ac)" d="M 354.466317 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 354.466317 307.584
L 359.968937 307.584
L 359.968937 304.610079
L 354.466317 304.610079
L 359.968937 304.626004
L 354.466317 304.626004
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_24">
<path clip-path="url(#p67969da4ac)" d="M 381.979414 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 381.979414 307.584
L 387.482034 307.584
L 387.482034 304.338254
L 381.979414 304.338254
L 387.482034 304.355635
L 381.979414 304.355635
z
" style="fill:#ff7f0e;"/>
</g>
<g id="patch_25">
<path clip-path="url(#p67969da4ac)" d="M 84.837966 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 84.837966 307.584
L 90.340586 307.584
L 90.340586 303.302092
L 84.837966 303.302092
L 90.340586 300.747148
L 84.837966 300.747148
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_26">
<path clip-path="url(#p67969da4ac)" d="M 112.351063 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 112.351063 307.584
L 117.853683 307.584
L 117.853683 276.886672
L 112.351063 276.886672
L 117.853683 271.014607
L 112.351063 271.014607
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_27">
<path clip-path="url(#p67969da4ac)" d="M 139.86416 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 139.86416 307.584
L 145.36678 307.584
L 145.36678 299.310847
L 139.86416 299.310847
L 145.36678 295.347802
L 139.86416 295.347802
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_28">
<path clip-path="url(#p67969da4ac)" d="M 167.377257 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 167.377257 307.584
L 172.879877 307.584
L 172.879877 289.274872
L 167.377257 289.274872
L 172.879877 288.727781
L 167.377257 288.727781
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_29">
<path clip-path="url(#p67969da4ac)" d="M 194.890354 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 194.890354 307.584
L 200.392974 307.584
L 200.392974 98.707068
L 194.890354 98.707068
L 200.392974 54.144
L 194.890354 54.144
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_30">
<path clip-path="url(#p67969da4ac)" d="M 249.916549 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 249.916549 307.584
L 255.419168 307.584
L 255.419168 234.810395
L 249.916549 234.810395
L 255.419168 269.970609
L 249.916549 269.970609
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_31">
<path clip-path="url(#p67969da4ac)" d="M 277.429646 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 277.429646 307.584
L 282.932265 307.584
L 282.932265 267.593505
L 277.429646 267.593505
L 282.932265 289.375596
L 277.429646 289.375596
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_32">
<path clip-path="url(#p67969da4ac)" d="M 304.942743 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 304.942743 307.584
L 310.445362 307.584
L 310.445362 305.600489
L 304.942743 305.600489
L 310.445362 305.894864
L 304.942743 305.894864
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_33">
<path clip-path="url(#p67969da4ac)" d="M 332.45584 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 332.45584 307.584
L 337.958459 307.584
L 337.958459 54.144
L 332.45584 54.144
L 337.958459 299.845027
L 332.45584 299.845027
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_34">
<path clip-path="url(#p67969da4ac)" d="M 359.968937 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 359.968937 307.584
L 365.471556 307.584
L 365.471556 305.086444
L 359.968937 305.086444
L 365.471556 304.146836
L 359.968937 304.146836
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_35">
<path clip-path="url(#p67969da4ac)" d="M 387.482034 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 387.482034 307.584
L 392.984653 307.584
L 392.984653 282.01635
L 387.482034 282.01635
L 392.984653 294.670542
L 387.482034 294.670542
z
" style="fill:#2ca02c;"/>
</g>
<g id="patch_36">
<path clip-path="url(#p67969da4ac)" d="M 90.340586 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 90.340586 307.584
L 95.843205 307.584
L 95.843205 297.892515
L 90.340586 297.892515
L 95.843205 297.944414
L 90.340586 297.944414
z
" style="fill:#d62728;"/>
</g>
<g id="patch_37">
<path clip-path="url(#p67969da4ac)" d="M 117.853683 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 117.853683 307.584
L 123.356302 307.584
L 123.356302 268.481644
L 117.853683 268.481644
L 123.356302 268.691041
L 117.853683 268.691041
z
" style="fill:#d62728;"/>
</g>
<g id="patch_38">
<path clip-path="url(#p67969da4ac)" d="M 145.36678 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 145.36678 307.584
L 150.869399 307.584
L 150.869399 294.28344
L 145.36678 294.28344
L 150.869399 294.354665
L 145.36678 294.354665
z
" style="fill:#d62728;"/>
</g>
<g id="patch_39">
<path clip-path="url(#p67969da4ac)" d="M 172.879877 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 172.879877 307.584
L 178.382496 307.584
L 178.382496 269.633534
L 172.879877 269.633534
L 178.382496 269.836763
L 172.879877 269.836763
z
" style="fill:#d62728;"/>
</g>
<g id="patch_40">
<path clip-path="url(#p67969da4ac)" d="M 200.392974 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 200.392974 307.584
L 205.895593 307.584
L 205.895593 290.058049
L 200.392974 290.058049
L 205.895593 290.151902
L 200.392974 290.151902
z
" style="fill:#d62728;"/>
</g>
<g id="patch_41">
<path clip-path="url(#p67969da4ac)" d="M 255.419168 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 255.419168 307.584
L 260.921787 307.584
L 260.921787 273.382559
L 255.419168 273.382559
L 260.921787 273.565711
L 255.419168 273.565711
z
" style="fill:#d62728;"/>
</g>
<g id="patch_42">
<path clip-path="url(#p67969da4ac)" d="M 282.932265 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 282.932265 307.584
L 288.434884 307.584
L 288.434884 287.611629
L 282.932265 287.611629
L 288.434884 287.718583
L 282.932265 287.718583
z
" style="fill:#d62728;"/>
</g>
<g id="patch_43">
<path clip-path="url(#p67969da4ac)" d="M 310.445362 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 310.445362 307.584
L 315.947982 307.584
L 315.947982 303.167525
L 310.445362 303.167525
L 315.947982 303.191176
L 310.445362 303.191176
z
" style="fill:#d62728;"/>
</g>
<g id="patch_44">
<path clip-path="url(#p67969da4ac)" d="M 337.958459 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 337.958459 307.584
L 343.461079 307.584
L 343.461079 281.101298
L 337.958459 281.101298
L 343.461079 281.243115
L 337.958459 281.243115
z
" style="fill:#d62728;"/>
</g>
<g id="patch_45">
<path clip-path="url(#p67969da4ac)" d="M 365.471556 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 365.471556 307.584
L 370.974176 307.584
L 370.974176 303.506633
L 365.471556 303.506633
L 370.974176 303.528467
L 365.471556 303.528467
z
" style="fill:#d62728;"/>
</g>
<g id="patch_46">
<path clip-path="url(#p67969da4ac)" d="M 392.984653 307.584
<path clip-path="url(#p3b05b9f86a)" d="M 392.984653 307.584
L 398.487273 307.584
L 398.487273 291.928524
L 392.984653 291.928524
L 398.487273 292.012361
L 392.984653 292.012361
z
" style="fill:#d62728;"/>
</g>
@ -384,10 +384,10 @@ z
<defs>
<path d="M 0 0
L 0 3.5
" id="m61c3ce9532" style="stroke:#000000;stroke-width:0.8;"/>
" id="m77ec045e3d" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="109.599753" xlink:href="#m61c3ce9532" y="307.584"/>
<use style="stroke:#000000;stroke-width:0.8;" x="109.599753" xlink:href="#m77ec045e3d" y="307.584"/>
</g>
</g>
<g id="text_1">
@ -426,7 +426,7 @@ z
<g id="xtick_2">
<g id="line2d_2">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="164.625948" xlink:href="#m61c3ce9532" y="307.584"/>
<use style="stroke:#000000;stroke-width:0.8;" x="164.625948" xlink:href="#m77ec045e3d" y="307.584"/>
</g>
</g>
<g id="text_2">
@ -458,7 +458,7 @@ z
<g id="xtick_3">
<g id="line2d_3">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="219.652142" xlink:href="#m61c3ce9532" y="307.584"/>
<use style="stroke:#000000;stroke-width:0.8;" x="219.652142" xlink:href="#m77ec045e3d" y="307.584"/>
</g>
</g>
<g id="text_3">
@ -503,7 +503,7 @@ z
<g id="xtick_4">
<g id="line2d_4">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="274.678336" xlink:href="#m61c3ce9532" y="307.584"/>
<use style="stroke:#000000;stroke-width:0.8;" x="274.678336" xlink:href="#m77ec045e3d" y="307.584"/>
</g>
</g>
<g id="text_4">
@ -557,7 +557,7 @@ z
<g id="xtick_5">
<g id="line2d_5">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="329.70453" xlink:href="#m61c3ce9532" y="307.584"/>
<use style="stroke:#000000;stroke-width:0.8;" x="329.70453" xlink:href="#m77ec045e3d" y="307.584"/>
</g>
</g>
<g id="text_5">
@ -607,7 +607,7 @@ z
<g id="xtick_6">
<g id="line2d_6">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="384.730724" xlink:href="#m61c3ce9532" y="307.584"/>
<use style="stroke:#000000;stroke-width:0.8;" x="384.730724" xlink:href="#m77ec045e3d" y="307.584"/>
</g>
</g>
<g id="text_6">
@ -780,10 +780,10 @@ z
<defs>
<path d="M 0 0
L -3.5 0
" id="m14f0d3e4c8" style="stroke:#000000;stroke-width:0.8;"/>
" id="mdd0da8bc57" style="stroke:#000000;stroke-width:0.8;"/>
</defs>
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m14f0d3e4c8" y="307.584"/>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd0da8bc57" y="307.584"/>
</g>
</g>
<g id="text_8">
@ -807,12 +807,12 @@ z
<g id="ytick_2">
<g id="line2d_8">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m14f0d3e4c8" y="253.757369"/>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd0da8bc57" y="254.045616"/>
</g>
</g>
<g id="text_9">
<!-- 0.02 -->
<g transform="translate(28.334375 257.556588)scale(0.1 -0.1)">
<g transform="translate(28.334375 257.844835)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@ -823,12 +823,12 @@ z
<g id="ytick_3">
<g id="line2d_9">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m14f0d3e4c8" y="199.930738"/>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd0da8bc57" y="200.507233"/>
</g>
</g>
<g id="text_10">
<!-- 0.04 -->
<g transform="translate(28.334375 203.729957)scale(0.1 -0.1)">
<g transform="translate(28.334375 204.306452)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@ -839,12 +839,12 @@ z
<g id="ytick_4">
<g id="line2d_10">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m14f0d3e4c8" y="146.104107"/>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd0da8bc57" y="146.968849"/>
</g>
</g>
<g id="text_11">
<!-- 0.06 -->
<g transform="translate(28.334375 149.903326)scale(0.1 -0.1)">
<g transform="translate(28.334375 150.768068)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@ -855,12 +855,12 @@ z
<g id="ytick_5">
<g id="line2d_11">
<g>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#m14f0d3e4c8" y="92.277477"/>
<use style="stroke:#000000;stroke-width:0.8;" x="57.6" xlink:href="#mdd0da8bc57" y="93.430466"/>
</g>
</g>
<g id="text_12">
<!-- 0.08 -->
<g transform="translate(28.334375 96.076695)scale(0.1 -0.1)">
<g transform="translate(28.334375 97.229685)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-48"/>
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
@ -1492,7 +1492,7 @@ z
</g>
</g>
<defs>
<clipPath id="p67969da4ac">
<clipPath id="p3b05b9f86a">
<rect height="266.112" width="357.12" x="57.6" y="41.472"/>
</clipPath>
</defs>

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

@ -934,25 +934,31 @@ fn count_pattern_binds(
pattern: &TripleOrPathPattern,
assigned_variables: &HashSet<&Variable>,
) -> u8 {
let mut count = 3;
let mut count = 12;
if let TermOrVariable::Variable(v) = pattern.subject() {
if !assigned_variables.contains(v) {
count -= 1;
count -= 4;
}
} else {
count -= 1;
}
if let TripleOrPathPattern::Triple(t) = pattern {
if let NamedNodeOrVariable::Variable(v) = &t.predicate {
if !assigned_variables.contains(v) {
count -= 1;
}
count -= 4;
}
} else {
count -= 1;
}
} else {
count -= 3;
}
if let TermOrVariable::Variable(v) = pattern.object() {
if !assigned_variables.contains(v) {
count -= 1;
count -= 4;
}
} else {
count -= 1;
}
count
}

Loading…
Cancel
Save