Technology•October 23, 2015
Tuple and UDT support in DSE Search

CREATE KEYSPACE udt WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
USE udt;
CREATE TYPE Alias (
known_alias text,
use_alias_always boolean,
alternate_alias_ frozen<map<text, text>>
);
CREATE TYPE Name (firstname text, surname text, alias_data frozen<Alias>);
CREATE table demo (
"id" VARCHAR PRIMARY KEY,
"name" frozen<Name>,
"friends" list<frozen<Name>>,
"magic_numbers" frozen<tuple<int, int, int>>,
"status" VARCHAR);
dsetool create_core udt.demo generateResources=true
insert into demo (id, name, friends, magic_numbers) values ('2', {firstname:'Sergio', surname:'Bossa', alias_data:{known_alias:'Sergio', use_alias_always:false}}, [{firstname:'Berenguer', surname:'Blasi'}, {firstname:'Maciej', surname:'Zasada'}], (23,543,234));
curl http://localhost:8983/solr/udt.demo/update -H 'Content-type:application/json' -d '[{"id":"1","name":"{\"firstname\":\"Berenguer\", \"surname\": \"Blasi\", \"alias_data\":{\"know_alias\":\"Bereng\", \"use_alias_always\":true}}", "friends":"[{\"firstname\":\"Sergio\", \"surname\": \"Bossa\"}, {\"firstname\":\"Maciej\", \"surname\": \"Zasada\"}]", "magic_numbers":"{\"field1\":14, \"field2\":57, \"field3\":65}" }]'
dsetool get_core_schema udt.demo
...
<fields>
<field indexed="true" multiValued="false" name="id" stored="true" type="StrField"/>
<field indexed="true" multiValued="true" name="friends" stored="true" type="TupleField"/>
<field indexed="true" multiValued="false" name="friends.firstname" stored="true" type="TextField"/>
<field indexed="true" multiValued="false" name="friends.surname" stored="true" type="TextField"/>
<field indexed="true" multiValued="false" name="friends.alias_data" stored="true" type="TupleField"/>
<field indexed="true" multiValued="false" name="friends.alias_data.known_alias" stored="true" type="TextField"/>
<field indexed="true" multiValued="false" name="friends.alias_data.use_alias_always" stored="true" type="BoolField"/>
<dynamicField indexed="true" multiValued="false" name="friends.alias_data.alternate_alias_*" stored="true" type="TextField"/>
<field indexed="true" multiValued="false" name="name" stored="true" type="TupleField"/>
<field indexed="true" multiValued="false" name="name.firstname" stored="true" type="TextField"/>
<field indexed="true" multiValued="false" name="name.surname" stored="true" type="TextField"/>
<field indexed="true" multiValued="false" name="name.alias_data" stored="true" type="TupleField"/>
<field indexed="true" multiValued="false" name="name.alias_data.known_alias" stored="true" type="TextField"/>
<field indexed="true" multiValued="false" name="name.alias_data.use_alias_always" stored="true" type="BoolField"/>
<dynamicField indexed="true" multiValued="false" name="name.alias_data.alternate_alias_*" stored="true" type="TextField"/>
<field indexed="true" multiValued="false" name="status" stored="true" type="TextField"/>
<field indexed="true" multiValued="false" name="magic_numbers" stored="true" type="TupleField"/>
<field indexed="true" multiValued="false" name="magic_numbers.field1" stored="true" type="TrieIntField"/>
<field indexed="true" multiValued="false" name="magic_numbers.field2" stored="true" type="TrieIntField"/>
<field indexed="true" multiValued="false" name="magic_numbers.field3" stored="true" type="TrieIntField"/>
</fields>
...
select * from udt.demo where solr_query='*:*';
id | friends | magic_numbers | name | solr_query | status
----+----------------------------------------------------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------------------------------------------------------------------+------------+--------
1 | [{firstname: 'Sergio', surname: 'Bossa', alias_data: null}, {firstname: 'Maciej', surname: 'Zasada', alias_data: null}] | (14, 57, 65) | {firstname: 'Berenguer', surname: 'Blasi', alias_data: {known_alias: null, use_alias_always: True, alternate_alias_: null}} | null | null
2 | [{firstname: 'Berenguer', surname: 'Blasi', alias_data: null}, {firstname: 'Maciej', surname: 'Zasada', alias_data: null}] | (23, 543, 234) | {firstname: 'Sergio', surname: 'Bossa', alias_data: {known_alias: 'Sergio', use_alias_always: False, alternate_alias_: null}} | null | null
select * from udt.demo where solr_query='{!tuple}name.firstname:Berenguer';
id | friends | magic_numbers | name | solr_query | status
----+-------------------------------------------------------------------------------------------------------------------------+---------------+-----------------------------------------------------------------------------------------------------------------------------+------------+--------
1 | [{firstname: 'Sergio', surname: 'Bossa', alias_data: null}, {firstname: 'Maciej', surname: 'Zasada', alias_data: null}] | (14, 57, 65) | {firstname: 'Berenguer', surname: 'Blasi', alias_data: {known_alias: null, use_alias_always: True, alternate_alias_: null}} | null | null
select * from udt.demo where solr_query='{!tuple}magic_numbers.field1:14';
id | friends | magic_numbers | name | solr_query | status
----+-------------------------------------------------------------------------------------------------------------------------+---------------+-----------------------------------------------------------------------------------------------------------------------------+------------+--------
1 | [{firstname: 'Sergio', surname: 'Bossa', alias_data: null}, {firstname: 'Maciej', surname: 'Zasada', alias_data: null}] | (14, 57, 65) | {firstname: 'Berenguer', surname: 'Blasi', alias_data: {known_alias: null, use_alias_always: True, alternate_alias_: null}} | null | null
select * from udt.demo where solr_query='{!tuple}friends.surname:Zasada';
id | friends | magic_numbers | name | solr_query | status
----+----------------------------------------------------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------------------------------------------------------------------+------------+--------
1 | [{firstname: 'Sergio', surname: 'Bossa', alias_data: null}, {firstname: 'Maciej', surname: 'Zasada', alias_data: null}] | (14, 57, 65) | {firstname: 'Berenguer', surname: 'Blasi', alias_data: {known_alias: null, use_alias_always: True, alternate_alias_: null}} | null | null
2 | [{firstname: 'Berenguer', surname: 'Blasi', alias_data: null}, {firstname: 'Maciej', surname: 'Zasada', alias_data: null}] | (23, 543, 234) | {firstname: 'Sergio', surname: 'Bossa', alias_data: {known_alias: 'Sergio', use_alias_always: False, alternate_alias_: null}} | null | null
select * from udt.demo where solr_query='{!tuple}name.alias_data.use_alias_always:false';
id | friends | magic_numbers | name | solr_query | status
----+----------------------------------------------------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------------------------------------------------------------------+------------+--------
2 | [{firstname: 'Berenguer', surname: 'Blasi', alias_data: null}, {firstname: 'Maciej', surname: 'Zasada', alias_data: null}] | (23, 543, 234) | {firstname: 'Sergio', surname: 'Bossa', alias_data: {known_alias: 'Sergio', use_alias_always: False, alternate_alias_: null}} | null | null
select * from udt.demo where solr_query='({!tuple}friends.surname:Zasada AND {!tuple}friends.surname:Blasi)';
id | friends | magic_numbers | name | solr_query | status
----+----------------------------------------------------------------------------------------------------------------------------+----------------+-------------------------------------------------------------------------------------------------------------------------------+------------+--------
2 | [{firstname: 'Berenguer', surname: 'Blasi', alias_data: null}, {firstname: 'Maciej', surname: 'Zasada', alias_data: null}] | (23, 543, 234) | {firstname: 'Sergio', surname: 'Bossa', alias_data: {known_alias: 'Sergio', use_alias_always: False, alternate_alias_: null}} | null | null
select * from udt.demo where solr_query='-{!tuple}name.alias_data.known_alias:*';
id | friends | magic_numbers | name | solr_query | status
----+-------------------------------------------------------------------------------------------------------------------------+---------------+-----------------------------------------------------------------------------------------------------------------------------+------------+--------
1 | [{firstname: 'Sergio', surname: 'Bossa', alias_data: null}, {firstname: 'Maciej', surname: 'Zasada', alias_data: null}] | (14, 57, 65) | {firstname: 'Berenguer', surname: 'Blasi', alias_data: {known_alias: null, use_alias_always: True, alternate_alias_: null}} | null | null
insert into demo (id, name, friends, magic_numbers) values ('3', {firstname:'Maciej', surname:'Zasada', alias_data:{known_alias:'Maciej', use_alias_always:false, alternate_alias_:{'alternate_alias_one':'Super-Maciej', 'alternate_alias_two':'The-Great-Maciej'}}}, [{firstname:'Berenguer', surname:'Blasi'}, {firstname:'Sergio', surname:'Bossa'}], (2423,23,423));
select * from udt.demo where solr_query='{!tuple}name.alias_data.alternate_alias_one:*';
id | friends | magic_numbers | name | solr_query | status
----+---------------------------------------------------------------------------------------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+--------
3 | [{firstname: 'Berenguer', surname: 'Blasi', alias_data: null}, {firstname: 'Sergio', surname: 'Bossa', alias_data: null}] | (2423, 23, 423) | {firstname: 'Maciej', surname: 'Zasada', alias_data: {known_alias: 'Maciej', use_alias_always: False, alternate_alias_: {'alternate_alias_one': 'Super-Maciej', 'alternate_alias_two': 'The-Great-Maciej'}}} | null | null
1. dsetool get_core_schema udt.demo current=true > currentSchema.xml
2. Edit the currentSchema.xml and remove the 'use_alias_always' fields that you want to remove
3. dsetool reload_core udt.demo schema=currentSchema.xml reindex=true
select * from udt.demo where solr_query='{!tuple}name.alias_data.use_alias_always:*';
ServerError: <ErrorMessage code=0000 [Server error] message="undefined field name.alias_data.use_alias_always">