======
eparen
======

select (f).getAThing()

---

(ql (moduleMember (select (asExprs (asExpr (qualified_expr (par_expr (variable (varName (simpleId)))) (qualifiedRhs (predicateName))))))))

=====
super
=====

select super.foo(), module::Foo.super.foo()

---

(ql (moduleMember 
  (select 
    (asExprs 
      (asExpr (qualified_expr (super_ref (super)) (qualifiedRhs (predicateName)))) 
      (asExpr (qualified_expr (super_ref (typeExpr (moduleExpr (simpleId)) (className)) (super)) (qualifiedRhs (predicateName))))))))

============
postfix cast
============

select f.(Foo).thing()

---

(ql (moduleMember (select (asExprs (asExpr (qualified_expr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (typeExpr (className)))) (qualifiedRhs (predicateName))))))))

===
any
===

select
  any(Foo f),
  any(Foo f | f = f),
  any(Foo f | | f.thing()),
  any(Foo f | f = f | f.thing())

---

(ql (moduleMember (select (asExprs 
  (asExpr (aggregate (aggId (any)) (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId)))))) 
  (asExpr (aggregate (aggId (any)) (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId))) 
    (comp_term (variable (varName (simpleId))) (compop (eq)) (variable (varName (simpleId))))))) 
  (asExpr (aggregate (aggId (any)) 
    (full_aggregate_body 
      (varDecl (typeExpr (className)) (varName (simpleId))) 
      (asExprs (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))))))) 
  (asExpr (aggregate (aggId (any)) (full_aggregate_body 
    (varDecl (typeExpr (className)) 
      (varName (simpleId))) 
      (comp_term (variable (varName (simpleId))) (compop (eq)) (variable (varName (simpleId)))) 
      (asExprs (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))))))))))) 


=====
range
=====

select [0..10]

---

(ql (moduleMember (select (asExprs (asExpr (range (literal (integer)) (literal (integer))))))))

==========
aggregates
==========

select
  rank[123](Foo f),
  count(f.thing()),
  count(f.thing() as thing order by thing asc, thing desc),
  count(Foo f),
  count(f),
  count (| | f),
  count(),
  count(Foo f | f.thing() ),
  sum(Foo f | | f.x() ),
  sum(Foo f | | f.x() as x),
  sum(Foo f | | f.x() as x order by x),
  sum(Foo f | | f.x() as x order by x asc, f.y()),
  sum(Foo f | f.thing() | f.x() )

---

  (ql (moduleMember (select  (asExprs 
    (asExpr (aggregate (aggId (rank)) (literal (integer)) 
      (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId)))))) 
    (asExpr (aggregate (aggId (count)) 
      (expr_aggregate_body (asExprs (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))))))) 
    (asExpr (aggregate (aggId (count)) 
      (expr_aggregate_body (asExprs 
        (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) (as) (varName (simpleId)))) 
        (orderBys  
        (orderBy (variable (varName (simpleId))) (direction (asc))) 
        (orderBy (variable (varName (simpleId))) (direction (desc))))))) 
    (asExpr (aggregate (aggId (count)) (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId)))))) 
    (asExpr (aggregate (aggId (count)) (expr_aggregate_body (asExprs (asExpr (variable (varName (simpleId)))))))) 
    (asExpr (aggregate (aggId (count)) (full_aggregate_body (asExprs (asExpr (variable (varName (simpleId)))))))) 
    (asExpr (aggregate (aggId (count)))) 
    (asExpr (aggregate (aggId (count)) 
      (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId))) 
        (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))))) 
    (asExpr (aggregate (aggId (sum)) 
      (full_aggregate_body 
        (varDecl (typeExpr (className)) 
        (varName (simpleId))) 
        (asExprs 
        (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))))))) 
    (asExpr (aggregate (aggId (sum)) 
      (full_aggregate_body 
        (varDecl (typeExpr (className)) (varName (simpleId))) 
        (asExprs 
          (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) (as) (varName (simpleId))))))) 
    (asExpr (aggregate (aggId (sum)) (full_aggregate_body 
      (varDecl (typeExpr (className)) (varName (simpleId))) 
      (asExprs 
        (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) (as) (varName (simpleId)))) 
        (orderBys  (orderBy (variable (varName (simpleId)))))))) 
    (asExpr (aggregate (aggId (sum)) 
      (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId))) 
        (asExprs (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) (as) (varName (simpleId)))) 
        (orderBys  
          (orderBy (variable (varName (simpleId))) (direction (asc))) 
          (orderBy (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))))))) 
    (asExpr (aggregate (aggId (sum)) (full_aggregate_body 
      (varDecl (typeExpr (className)) (varName (simpleId))) 
      (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) 
      (asExprs (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))))))))))