======
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) (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId))))))
  (asExpr (aggregate (aggId) (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId)))
    (comp_term (variable (varName (simpleId))) (compop) (variable (varName (simpleId)))))))
  (asExpr (aggregate (aggId)
    (full_aggregate_body
      (varDecl (typeExpr (className)) (varName (simpleId)))
      (asExprs (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))))))
  (asExpr (aggregate (aggId) (full_aggregate_body
    (varDecl (typeExpr (className))
      (varName (simpleId)))
      (comp_term (variable (varName (simpleId))) (compop) (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) (literal (integer))
      (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId))))))
    (asExpr (aggregate (aggId)
      (expr_aggregate_body (asExprs (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))))))
    (asExpr (aggregate (aggId)
      (expr_aggregate_body (asExprs
        (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) (varName (simpleId))))
        (orderBys
        (orderBy (variable (varName (simpleId))) (direction))
        (orderBy (variable (varName (simpleId))) (direction))))))
    (asExpr (aggregate (aggId) (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId))))))
    (asExpr (aggregate (aggId) (expr_aggregate_body (asExprs (asExpr (variable (varName (simpleId))))))))
    (asExpr (aggregate (aggId) (full_aggregate_body (asExprs (asExpr (variable (varName (simpleId))))))))
    (asExpr (aggregate (aggId)))
    (asExpr (aggregate (aggId)
      (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId)))
        (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))))
    (asExpr (aggregate (aggId)
      (full_aggregate_body
        (varDecl (typeExpr (className))
        (varName (simpleId)))
        (asExprs
        (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))))))
    (asExpr (aggregate (aggId)
      (full_aggregate_body
        (varDecl (typeExpr (className)) (varName (simpleId)))
        (asExprs
          (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) (varName (simpleId)))))))
    (asExpr (aggregate (aggId) (full_aggregate_body
      (varDecl (typeExpr (className)) (varName (simpleId)))
      (asExprs
        (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) (varName (simpleId))))
        (orderBys  (orderBy (variable (varName (simpleId))))))))
    (asExpr (aggregate (aggId)
      (full_aggregate_body (varDecl (typeExpr (className)) (varName (simpleId)))
        (asExprs (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))) (varName (simpleId))))
        (orderBys
          (orderBy (variable (varName (simpleId))) (direction))
          (orderBy (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))))))
    (asExpr (aggregate (aggId) (full_aggregate_body
      (varDecl (typeExpr (className)) (varName (simpleId)))
      (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName)))
      (asExprs (asExpr (qualified_expr (variable (varName (simpleId))) (qualifiedRhs (predicateName))))))))))))
