Base selectors
--------------

Selectors are scoring functions that are called by the view dispatcher to tell
whenever a view can be applied to a given result set of a request. Selector sets
are the glue that tie views to the data model. Using them appropriately is an
essential part of the construction of well behaved cubes.


*CubicWeb* provides its own set of selectors that you can use and here is a
description of some of the most common used:

Of course you will write your own set of selectors as you get familiar with the
framework.


:yes([score=1]):
  Return the score given as parameter (default to 1). Usually used for appobjects
  which can be selected whatever the context, or also sometimes to add arbitrary
  points to a score. Take care, `yes(0)` could be named 'no'...


Rset selectors
~~~~~~~~~~~~~~
:none_rset():
  Return 1 if the result set is None.

:any_rset():
  Return 1 for any result set, whatever the number of rows in it.

:nonempty_rset():
  Return 1 for non empty result set.

:empty_rset():
  Return 1 for empty result set.

:one_line_rset():
  Return 1 if the result set is of size 1 or if a row is specified.

:two_lines_rset():
  Return 1 if the result set has *at least* two rows.

:two_cols_rset():
  Return 1 if the result set is not empty and has *at least* two columns per
  row.

:paginated_rset():
  Return 1 if the result set has more rows the specified by the
  `navigation.page-size` property.

:sorted_rset():
  Return 1 if the result set has an ORDERBY clause.

:one_etype_rset():
  Return 1 if the result set has entities which are all of the same type in a
  given column (default to column 0).

:non_final_entity():
  Return 1 if the result set contains entities in a given column (the first one
  by default), and no "final" values such as string of int.

:implements(<iface or etype>, ...):
  Return positive score if entities in the result set are of the given entity
  type or implements given interface.  If multiple arguments are given, matching
  one of them is enough. Returned score reflects the "distance" between expected
  type or interface and matched entities. Entity types are usually given as
  string, the corresponding class will be fetched from the vregistry.

:two_etypes_rset(): XXX
:entity_implements(): XXX
:relation_possible(): XXX
:partial_relation_possible(): XXX
:may_add_relation(): XXX
:partial_may_add_relation(): XXX
:has_related_entities(): XXX
:partial_has_related_entities(): XXX
:has_permission(): XXX
:has_add_permission(): XXX
:rql_condition(): XXX
:but_etype(): XXX
:score_entity(): XXX

Request selectors
~~~~~~~~~~~~~~~~~~
:anonymous_user():
  Return 1 if user isn't authenticated (eg is the anonymous user).

:authenticated_user():
  Return 1 if user is authenticated.

:match_user_groups(): XXX
:match_search_state(): XXX
:match_form_params(): XXX

Other selectors
~~~~~~~~~~~~~~~
:match_kwargs(): XXX
:match_context_prop(): XXX
:appobject_selectable(): XXX
:specified_etype_implements(): XXX
:primary_view(): XXX