User Tools

Site Tools


documentation:tutorials:json_query

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
documentation:tutorials:json_query [2018/11/26 12:27] – Remove unnecessary "nowiki" tag from within code tag rjs7documentation:tutorials:json_query [2022/02/10 13:34] (current) – external edit 127.0.0.1
Line 2094: Line 2094:
  
  
 +==== Choosing the Order of JOINs ====
 +
 +As of Evergreen 3.0.2, we support user-defined join order in cstore and friends. Previously, because the join structure of ''oils_sql'' beyond the specification of a single table was only allowed to be represented as a JSON object, it was subject to potential hash key reordering. By supporting an intervening array layer, one can now specify the exact join order of the tables in a join tree.
 +
 +For example, given the following JSON object passing through a modern Perl 5 interpreter as a nested hash:
 +
 +<code json>
 +{
 +  select : {
 +    acp: ['id'],
 +    acn: ['record'],
 +    acpl: ['name']
 +  },
 +  from : {
 +    acp: {
 +      acn: {filter: {record: 12345} },
 +      acpl: null
 +    }
 +  }
 +}
 +</code>
 +
 +the FROM clause of the query may end up as:
 +
 +<code sql>
 +FROM acp
 +    JOIN acn ON (acp.call_number = acn.id AND acn.record = 12345)
 +    JOIN acpl ON (acp.location = acpl.id)
 +</code>
 +
 +Or as:
 +
 +<code sql>
 +FROM acp
 +    JOIN acpl ON (acp.location = acpl.id)
 +    JOIN acn ON (acp.call_number = acn.id AND acn.record = 12345)
 +</code>
 +
 +In some situations, the join order will matter either to the semantics of the query plan, or to its performance. The following example of the newly supported syntax illustrates how to specify join order:
 +
 +<code json>
 +{
 +  select : {
 +    acp: ['id'],
 +    acn: ['record'],
 +    acpl: ['name']
 +  },
 +  from : {
 +    acp: [
 +      {acn: {filter: {record: 12345} } },
 +      'acpl'
 +    ]
 +  }
 +}
 +</code>
 +
 +And the only FROM clause the can be generated is:
 +
 +<code sql>
 +FROM acp
 +    JOIN acn ON (acp.call_number = acn.id AND acn.record = 12345)
 +    JOIN acpl ON (acp.location = acpl.id)
 +</code>
 ==== Things You Can't Do ==== ==== Things You Can't Do ====
  
documentation/tutorials/json_query.1543253269.txt.gz · Last modified: 2022/02/10 13:33 (external edit)

Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki

© 2008-2022 GPLS and others. Evergreen is open source software, freely licensed under GNU GPLv2 or later.
The Evergreen Project is a U.S. 501(c)3 non-profit organization.