Given the AQL syntax and its current specifications, nothing stops you from
using the WHERE clause. However, you should consider the consequences of
using the WHERE clause to express that constraint.

if you'd like to express any other criteria such as a particular
DV_QUANTITY/magnitude value being greater than x (.../magnitude >= x) this
will go WHERE clause as well. Since multiple constraints in the WHERE
clause have to be connected by logical operators, you now have to write:

WHERE e/ehr_id/value = $ehrId AND c/..../magnitude >= x

so you'll have to express the implicitly stated (when you use
[ehr_id/value=..] AND condition explicitly and think about that logic. I'd
say it is possible that this will lead to bugs especially in complicated
AQL queries.

the second reason, which is pure speculation: is that some back ends are
likely to have mechanisms that process different constraints in an AQL
query in different ways. Pretty similar to query planners in relational
databases. The back end you're using may end up selecting all ehrs(!) and
then applying a filter due to ehr id constraint being in the WHERE clause.
This may or may not be the case, but I would not risk it.

Finally, to make things even more complicated, as per the predicates
section of aql spec (
https://www.openehr.org/releases/QUERY/latest/docs/AQL/AQL.html#_predicates
), there is nothing that stops you from moving a constraint in the WHERE
clause into the FROm clause (in some cases). Why? Because both archetype
and node predicates are syntactic sugar for standard predicate. So if you
have a standard predicate such as the dv_quantity example I gave you above,
you could move it into FROM clause as follows:

... COMPOSITION c[/bla/bla/bla/magnitude >= x] CONTAINS bla bla

But in that case you would not be able to express boolean operations where
the operands are constrains of the nodes in the FROM clause. That's why I
said in some cases above.

My suggestion: stick to conventions as much as you can, there is quite a
bit of flexibility in the AQL syntax and its semantics is not formally
defined (as in no formal backing model of queries and match operation etc)
and you don't want to fall into those cracks. You may get wrong results due
to interpretation differences between vendors and your queries may lose
portability.

All the best
Seref




On Mon, Oct 8, 2018 at 8:46 AM Georg Fette <georg.fe...@uni-wuerzburg.de>
wrote:

> Hello,
> In the AQL documentation there is a query
>
> SELECT c/uid/value, instruction
> FROM EHR e[ehr_id/value=$ehrid]
> CONTAINS COMPOSITION c
> CONTAINS INSTRUCTION instruction[openEHR-EHR-INSTRUCTION.referral.v1]
> WHERE EXISTS
>
> instruction/links[target='ehr://327000002/87284370-2D4B-4e3d-A3F3-F303D2F4F34B@latest_trunk_version
> ']
>
> When I reduce this query to
>
> SELECT e FROM EHR e[ehr_id/value=$ehrid]
>
> why is the constraint on the ehr_id done in the FROM section and not in
> the WHERE section like
>
> SELECT e
> FROM EHR e
> WHERE e/ehr_id/value = $ehrid
>
> Greetings
> Geirg
>
> --
> ---------------------------------------------------------------------
> Dipl.-Inf. Georg Fette      Raum: B001
> Universität Würzburg        Tel.: +49-(0)931-31-85516
> Am Hubland                  Fax.: +49-(0)931-31-86732
> 97074 Würzburg              mail: georg.fe...@uni-wuerzburg.de
> ---------------------------------------------------------------------
>
>
> _______________________________________________
> openEHR-implementers mailing list
> openEHR-implementers@lists.openehr.org
>
> http://lists.openehr.org/mailman/listinfo/openehr-implementers_lists.openehr.org
>
_______________________________________________
openEHR-implementers mailing list
openEHR-implementers@lists.openehr.org
http://lists.openehr.org/mailman/listinfo/openehr-implementers_lists.openehr.org

Reply via email to