FieldType field1 = typeManager.createFieldType(stringValueType, new QName(NS, "sf_field1"), Scope.VERSIONED);
FieldType field2 = typeManager.createFieldType(linkValueType, new QName(NS, "sf_field2"), Scope.VERSIONED);
RecordType supertype1 = typeManager.newRecordType(new QName(NS, "sf_supertype1"));
supertype1 = typeManager.createRecordType(supertype1);
RecordType supertype2 = typeManager.newRecordType(new QName(NS, "sf_supertype2"));
supertype2 = typeManager.createRecordType(supertype2);
// Create a record type with two versions
RecordType rt = typeManager.newRecordType(new QName(NS, "sf_rt"));
rt.addFieldTypeEntry(field1.getId(), false);
rt.addFieldTypeEntry(field2.getId(), false);
rt.addSupertype(supertype1.getId());
rt = typeManager.createRecordType(rt);
rt.addSupertype(supertype2.getId(), supertype2.getVersion());
rt = typeManager.updateRecordType(rt);
RecordType rt2 = typeManager.newRecordType(new QName(NS, "sf_rt2"));
rt2.addFieldTypeEntry(field1.getId(), false);
rt2.addFieldTypeEntry(field2.getId(), false);
rt2 = typeManager.createRecordType(rt2);
//
// Change indexer conf
//
log.debug("Begin test V402");
changeIndexUpdater("indexerconf_sysfields.xml");
//
// Create content
//
// Create a record that uses version 1 of the record type
log.debug("Begin test V403");
Record record1 = defaultTable.newRecord(idGenerator.newRecordId());
record1.setRecordType(rt.getName(), 1L);
record1.setField(field1.getName(), "acute");
expectEvent(CREATE, Table.RECORD.name, record1.getId(), 1L, null, field1.getId());
record1 = defaultTable.createOrUpdate(record1);
// Create a record that uses version 2 of the record type
log.debug("Begin test V405");
Record record2 = defaultTable.newRecord(idGenerator.newRecordId());
record2.setRecordType(rt.getName(), 2L);
record2.setField(field1.getName(), "obtuse");
expectEvent(CREATE, Table.RECORD.name, record2.getId(), 1L, null, field1.getId());
record2 = defaultTable.createOrUpdate(record2);
// Create a record which links to one of the other records
log.debug("Begin test V406");
Record record3 = defaultTable.newRecord(idGenerator.newRecordId());
record3.setRecordType(rt.getName());
record3.setField(field2.getName(), new Link(record2.getId()));
expectEvent(CREATE, Table.RECORD.name, record3.getId(), 1L, null, field2.getId());
record3 = defaultTable.createOrUpdate(record3);
//
// Test searches
//
commitIndex();
log.debug("Begin test V407");
verifyResultCount("sf_field1_string:acute", 1);
verifyResultCount("sf_field1_string:obtuse", 1);
// recordType
verifyResultCount("+sf_field1_string:acute +recordType_literal:" +
qesc("{org.lilyproject.indexer.test}sf_rt"), 1);
verifyResultCount("+sf_field1_string:obtuse +recordType_literal:" +
qesc("{org.lilyproject.indexer.test}sf_rt"), 1);
// recordTypeWithVersion
verifyResultCount("+sf_field1_string:acute +recordTypeWithVersion_literal:" +
qesc("{org.lilyproject.indexer.test}sf_rt:1"), 1);
verifyResultCount("+sf_field1_string:acute +recordTypeWithVersion_literal:" +
qesc("{org.lilyproject.indexer.test}sf_rt:2"), 0);
verifyResultCount("+sf_field1_string:obtuse +recordTypeWithVersion_literal:" +
qesc("{org.lilyproject.indexer.test}sf_rt:2"), 1);
// recordTypeName
verifyResultCount("+sf_field1_string:acute +recordTypeName_literal:" + qesc("sf_rt"), 1);
// recordTypeNamespace
verifyResultCount("+sf_field1_string:acute +recordTypeNamespace_literal:" +
qesc("org.lilyproject.indexer.test"), 1);
// recordTypeVersion
verifyResultCount("+sf_field1_string:acute +recordTypeVersion_literal:1", 1);
verifyResultCount("+sf_field1_string:obtuse +recordTypeVersion_literal:2", 1);
// supertypes
verifyResultCount("+sf_field1_string:acute +supertypes_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_supertype1"), 1);
verifyResultCount("+sf_field1_string:acute +supertypes_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_supertype2"), 0);
verifyResultCount("+sf_field1_string:acute +supertypes_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_rt"), 0);
verifyResultCount("+sf_field1_string:obtuse +supertypes_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_supertype1"), 1);
verifyResultCount("+sf_field1_string:obtuse +supertypes_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_supertype2"), 1);
// supertypesWithVersion
verifyResultCount("+sf_field1_string:acute +supertypesWithVersion_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_supertype1:1"), 1);
// supertypeNames
verifyResultCount("+sf_field1_string:obtuse +supertypeNames_literal_mv:" + qesc("sf_supertype1"), 1);
verifyResultCount("+sf_field1_string:obtuse +supertypeNames_literal_mv:" + qesc("sf_supertype2"), 1);
verifyResultCount("+sf_field1_string:obtuse +supertypeNames_literal_mv:" + qesc("sf_supertype_not_existing"), 0);
// supertypeNamespaces
verifyResultCount("+sf_field1_string:obtuse +supertypeNamespaces_literal_mv:" +
qesc("org.lilyproject.indexer.test"), 1);
// recordTypes (record type + supertypes)
verifyResultCount("+sf_field1_string:acute +recordTypes_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_supertype1"), 1);
verifyResultCount("+sf_field1_string:acute +recordTypes_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_supertype2"), 0);
verifyResultCount("+sf_field1_string:acute +recordTypes_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_rt"), 1);
// recordTypesWithVersion
verifyResultCount("+sf_field1_string:obtuse +recordTypesWithVersion_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_supertype1:1"), 1);
verifyResultCount("+sf_field1_string:obtuse +recordTypesWithVersion_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_supertype2:1"), 1);
verifyResultCount("+sf_field1_string:obtuse +recordTypesWithVersion_literal_mv:" +
qesc("{org.lilyproject.indexer.test}sf_rt:2"), 1);
// recordTypeNames
verifyResultCount("+sf_field1_string:obtuse +recordTypeNames_literal_mv:" + qesc("sf_supertype1"), 1);
verifyResultCount("+sf_field1_string:obtuse +recordTypeNames_literal_mv:" + qesc("sf_supertype2"), 1);
verifyResultCount("+sf_field1_string:obtuse +recordTypeNames_literal_mv:" + qesc("sf_rt"), 1);
// recordTypeNamespaces
verifyResultCount("+sf_field1_string:obtuse +recordTypeNamespaces_literal_mv:" +
qesc("org.lilyproject.indexer.test"), 1);
// record type via deref
verifyResultCount("+recordType_deref_literal:" + qesc("{org.lilyproject.indexer.test}sf_rt"), 1);
// Update record 2, can't verify anything immediately, this is just to check denormalized
// update of expressions pointing to the fake system fields does not give problems
log.debug("Begin test V408");
record2.setField(field1.getName(), "obtuse2");
expectEvent(UPDATE, Table.RECORD.name, record2.getId(), 2L, null, field1.getId());
record2 = defaultTable.createOrUpdate(record2);
// Change record type of record 2. The denormalized reference of it stored in the index entry
// of record 3 will not be updated as this is currently not supported.
log.debug("Begin test V409");
record2 = defaultTable.newRecord(record2.getId());
record2.setRecordType(rt2.getName());
record2.setField(field1.getName(),
"obtuse3"); // currently can't only change record type, so touch field as well
expectEvent(UPDATE, Table.RECORD.name, record2.getId(), 3L, null, true, field1.getId());
record2 = defaultTable.update(record2);