Ticket #250 (closed defect: fixed)

Opened 3 years ago

Last modified 3 years ago

SURFmedia 'best' query is broken

Reported by: Michiel.Schok Owned by:
Priority: major Milestone: MediaMosa 2.1
Component: Core Version: 2.1.2
Keywords: Cc:
MoSCoW: Must Have Estimated time after impact analysis:
Related to project: none Tested: yes
Accepted: yes Estimated Hours:

Description

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <header>
    <item_count>0</item_count>
    <item_count_total>0</item_count_total>
    <item_offset>0</item_offset>
    <request_matched_method>GET</request_matched_method>
    <request_matched_uri>/asset</request_matched_uri>
    <request_process_time>0.0812</request_process_time>
    <request_result>error</request_result>
    <request_result_description>PDOException caught; SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM 
mediamosa_aut_group ag
WHERE  (aut_group_id IN  ('16', '14', '9', '12'))' at line 1,
trace; #0 /var/opt/www/vpcore/htdocs/includes/database/database.inc(1735): PDOStatement-&gt;execute(Array)
#1 /var/opt/www/vpcore/htdocs/includes/database/database.inc(568): DatabaseStatementBase-&gt;execute(Array, Array)
#2 /var/opt/www/vpcore/htdocs/includes/database/select.inc(1089): DatabaseConnection-&gt;query('SELECT ?FROM ?{...', Array, Array)
#3 /var/opt/www/vpcore/htdocs/sites/all/modules/mediamosa/core/aut/mediamosa_aut.inc(328): SelectQuery-&gt;execute()
#4 /var/opt/www/vpcore/htdocs/sites/all/modules/mediamosa/core/aut/mediamosa_aut.inc(1100): mediamosa_aut::build_access(Array, NULL, Array, 'surfnet.nl', NULL, Array)
#5 /var/opt/www/vpcore/htdocs/sites/all/modules/mediamosa/core/asset/mediamosa_asset_search.inc(383): mediamosa_aut::build_access_where(Array, 'MEDIAFILE', NULL, Array, NULL, Array, 'surfnet.nl', NULL, Array, false, true)
#6 /var/opt/www/vpcore/htdocs/sites/all/modules/mediamosa/modules/asset/mediamosa_asset.rest.inc(508): mediamosa_asset_search::asset_search(Object(mediamosa_response), Array, ' sortby rating/...', NULL, Array, 'surfnet.nl', NULL, NULL, NULL, NULL, true, true, false, true, false, false, true, false, true, 3, 0)
#7 /var/opt/www/vpcore/htdocs/sites/all/modules/mediamosa/rest/mediamosa_rest_call.inc(269): mediamosa_rest_call_asset_search-&gt;do_call()
#8 /var/opt/www/vpcore/htdocs/sites/all/modules/mediamosa/rest/mediamosa_rest.inc(304): mediamosa_rest_call-&gt;process_call()
#9 /var/opt/www/vpcore/htdocs/sites/all/modules/mediamosa/response/mediamosa_response.inc(125): mediamosa_rest-&gt;process_call(Array)
#10 /var/opt/www/vpcore/htdocs/sites/all/modules/mediamosa/mediamosa.module(94): mediamosa_response-&gt;process_rest()
#11 [internal function]: mediamosa_init()
#12 /var/opt/www/vpcore/htdocs/includes/module.inc(413): call_user_func_array('mediamosa_init', Array)
#13 /var/opt/www/vpcore/htdocs/includes/common.inc(3769): module_invoke_all('init')
#14 /var/opt/www/vpcore/htdocs/includes/bootstrap.inc(1551): _drupal_bootstrap_full()
#15 /var/opt/www/vpcore/htdocs/includes/bootstrap.inc(1417): _drupal_bootstrap(8)
#16 /var/opt/www/vpcore/htdocs/index.php(21): drupal_bootstrap(8)
#17 {main},
Query string; SELECT 
FROM 
{mediamosa_aut_group} ag
WHERE  (aut_group_id IN  (:db_condition_placeholder_0, :db_condition_placeholder_1, :db_condition_placeholder_2, :db_condition_placeholder_3)) ,
Args; Array
(
    [:db_condition_placeholder_0] =&gt; 16
    [:db_condition_placeholder_1] =&gt; 14
    [:db_condition_placeholder_2] =&gt; 9
    [:db_condition_placeholder_3] =&gt; 12
)
</request_result_description>
    <request_result_id>500</request_result_id>
    <request_uri>[GET] /asset?granted=true&amp;amp;is_public_list=true&amp;amp;hide_empty_assets=true&amp;amp;cql=+sortby+rating/sort.descending&amp;amp;limit=3&amp;amp;offset=0&amp;amp;aut_domain=surfnet.nl</request_uri>
    <version>2.1.0.236:07ebc5929cac</version>
    <errors>
      <error>Warning: Illegal offset type in isset or empty, SelectQuery-&gt;addField()() in file /var/opt/www/vpcore/htdocs/includes/database/select.inc on line 1104.</error>
      <error>Warning: Illegal offset type in isset or empty, SelectQuery-&gt;addField()() in file /var/opt/www/vpcore/htdocs/includes/database/select.inc on line 1111.</error>
      <error>Warning: Illegal offset type, SelectQuery-&gt;addField()() in file /var/opt/www/vpcore/htdocs/includes/database/select.inc on line 1116.</error>
    </errors>
  </header>
  <items/>
</response>

Change History

Changed 3 years ago by robert

  • status changed from new to closed
  • resolution set to ready_for_review

2.1 release.

Changed 3 years ago by robert

  • status changed from closed to reopened
  • resolution ready_for_review deleted

Changed 3 years ago by robert

  • status changed from reopened to closed
  • resolution set to fixed

Changed 3 years ago by Michiel.Schok

  • tested changed from no to yes
  • accepted changed from no to yes

De call geeft nu geen stacktrace, maar een nette output.
wel had ik het idee dat de call 'wat lang' duurde. Wellicht dat er nog optimalisaties mogelijk zijn?

Ik krijg nu ook weer een total_count terug.

Changed 3 years ago by robert

hmmm die total_count is denk ik de oorzaak van de langzame query. In 1.7.x zit een hack dat als de limit lager is dan 7 er geen total count wordt berekent. Ik zal die hack weer terug plaatsen, maar hier moeten we met de volgende development overleg over hebben; er is door die hack geen mogelijkheid om wel het total aantal terug krijgen limit < 7. Plus het staat nergens in de documentatie. Denk dat we een extra parameter moeten nemen waarbij je aangeeft geen total_count wilt berekeken, die standaard op true staat.

Changed 3 years ago by robert

Er is (al) een parameter 'calculate_total_count' in 2.x die je op false kan zetten om de query sneller te maken. Had dus al gezien dat deze hack niet zo netjes was.

Om de hack te simuleren zal ik bij een limit < 7 deze op 'false' zetten tenzij specifiek 'true' wordt meegegeven aan 'calculate_total_count'.

Eigenlijk op deze manier wordt de 'default' waarde van 'calculate_total_count' op 'false' gezet bij limit < 7 en hoger op 'true'. Denk dat dit de beste oplossing is.

De interne documentatie is ook aangepast.

Changed 3 years ago by Michiel.Schok

Ik ga kijken of ik met de komende SURFmedia-release (ETA eind mei) deze parameter al kan implementeren.
Core 1.7 zal deze parameter negeren. Als het zou lukken om SURFmedia 2.3 eerder in productie te nemen dan Core 2.1, dan is de hack voor het zetten van default waarden in VP-Core van de baan. Anders zou daar weer een release overheen gaan. Ook geen ramp, maar zou misschien netter zijn.

Changed 3 years ago by Michiel.Schok

  • status changed from closed to reopened
  • resolution fixed deleted

OK, in SURFmedia 2.3 (productierelease 26 mei avond) gaan we de 'best' en 'recent' queries (met limit=3 en limit=6) ombouwen zodat 'calculate_total_count=false' meegenomen wordt.

Wat mij betreft zou dus in MM 2.1.2 de ingewikkelde default kunnen vervallen, en standaard voor 'true' gekozen worden.

Changed 3 years ago by MC-arjen

  • status changed from reopened to closed
  • version set to 2.1.2
  • resolution set to fixed

Done, and improved documentation for it (will be deployed later on mediamosa.org/api).

Changed 3 years ago by Michiel.Schok

For the record, production release SURFmedia 2.3 is rescheduled to May 27.

Changed 3 years ago by Michiel.Schok

  • accepted changed from yes to no

Are you sure that the default of parameter 'calculate_total_count' is set to 'true'.

compare:

[get] /asset

    <item_count>10</item_count>
    <item_count_total>10</item_count_total>
[GET] asset?calculate_total_count=false

    <item_count>10</item_count>
    <item_count_total>10</item_count_total>
[GET] asset?calculate_total_count=true

    <item_count>10</item_count>
    <item_count_total>32723</item_count_total>

Changed 3 years ago by Michiel.Schok

You are right... But can you please explain my results above?
the results with parameter omitted are identical to parameter=false.

Changed 3 years ago by Michiel.Schok

  • accepted changed from no to yes

OK, now it seems allright:

[GET] asset

    <item_count>10</item_count>
    <item_count_total>32735</item_count_total>
Note: See TracTickets for help on using tickets.