UDT query examples 

Examples of UDT queries. UDTs are a specialization of tuples.

You can query nested tuples and UDTs inside CQL lists and sets. UDTs are a specialization of tuples. In these examples, {!tuple} applies to both UDTs and tuples.

Note: Selecting an entire UDT column in the CQL SELECT clause is supported. Selecting individual fields of a UDT is not supported.

More examples are available in the DataStax Developer Blog post Tuple and UDT support in DSE Search.

Querying fields  

{!tuple}address.street:sesame

Querying dynamic fields 

<dynamicField name="user.position_*" type="text" indexed="true"  stored="true"/>
        {!tuple}user.position_day1:second
        {!tuple}user.position_day2:first

Querying collections 

{!tuple}user.hobbies:swim

Querying across different UDT/tuple fields 

+{!tuple v='father.name.firstname:Sam'} +{!tuple v='mother.name.firstname:Anne'}
Remember on CQL that to use a single quotation mark itself in a string literal, you must escape it using a single quotation mark (so you'll need to double the single quotation marks). Dollar-quoted strings with double dollar signs ($$) support complex quoting. See CQL escaping characters.
You can also use the discouraged syntax:
({!tuple}father.name.firstname:Sam AND {!tuple}mother.name.firstname:Anne)

Querying UDT/tuple fields with several conditions 

You can find a tuple that satisfies several conditions. Notice how all the conditions are on the same tuple all the time. For example:
{!tuple v='address.residents.field1:Alice AND address.residents.field2:Smith'}
You can also use the discouraged syntax:
{!tuple}address.residents.field1:Alice AND address.residents.field2:Smith
Note: The difference in syntax specifies to search across tuples or within a tuple.
  • Across tuples:

    +{!tuple v='condition1'} +{!tuple v='condition2'} +{!tuple v='conditionN'} searches for documents that satisfy all conditions, but are not necessarily satisfied by the same single tuple/UDT.

  • Within a tuple:

    {!tuple v='condition1 AND condition2 AND conditionN'} searches for documents that satisfy all conditions within a single tuple/UDT.

Querying for nested tuples and UDTs 

To query nested tuples and UDTs, use the same dot notation and the tuple query parser. Because UDTs are a specialization of tuples, you use the tuple query parser for tuples and UDTs. In this example, the dot notation identifies address.resident as a UDT.

For this example nested address.residents tuple, you can query for locations that have a resident with the first name Alice:
{!tuple}address.residents.field1:Alice
You can query for locations with a resident that has the first name Alice and second name Smith:
+{!tuple v='address.residents.field1:Alice AND address.residents.field2:Smith'}
Note: Tuples and UDTs are modelled internally as nested documents. The Solr block join is used internally to query them. Parents are identified with the _parent_=true field. Children are identified with _parent_=false. For certain types of queries, including negative queries and empty field queries, you might need to use the _parent_ field.

Querying for empty firstnames 

The negation (-) and inclusion (+) operators must precede the {!tuple} directive.

-{!tuple}_parent_:false AND user.name.firstname:[* TO *]

Negative queries 

Negative queries use this syntax:
select * from demo where solr_query='-{!tuple}name.firstname:*'
Negative queries with more than one condition must follow the Solr rules. Use this syntax:
{!tuple v='address.street:* NOT (address.street:sesame AND address.number:32)'}
or
-{!tuple v='address.street:sesame AND address.number:32'}
or
{!tuple}address.street:* NOT (address.street:sesame AND address.number:32)