use of com.rbmhtechnology.vind.api.Document in project vind by RBMHTechnology.
the class AnnotationUtilTest method testPojo2RoundTrip.
@Test
public void testPojo2RoundTrip() {
Pojo2 p2 = new Pojo2();
p2.id = UUID.randomUUID().toString();
p2.title = "Title";
p2.someInternalData = UUID.randomUUID().toString();
p2.content = "Content";
p2.categories = new HashSet<>(Arrays.asList("cat1", "cat2", "cat3"));
p2.counter = 17;
p2.tax = new Taxonomy("id-3", "term 3", Arrays.asList("term 3", "third term"));
final Document doc = AnnotationUtil.createDocument(p2);
assertThat("doc.id", doc.getId(), is(p2.id));
assertThat("doc.type", doc.getType(), is(p2.getClass().getSimpleName()));
assertThat("doc.field(title)", doc.getValue("title"), allOf(instanceOf(String.class), is(p2.title)));
assertThat("doc.field(content)", doc.getValue("data"), allOf(instanceOf(String.class), is(p2.content)));
assertThat("doc.field(counter)", doc.getValue("counter"), allOf(instanceOf(int.class), is(p2.counter)));
assertThat("doc.filed(categories)", doc.getValue("cats"), instanceOf(Collection.class));
final Pojo2 pojo = AnnotationUtil.createPojo(doc, Pojo2.class);
assertThat("pojo.id", pojo.id, is(p2.id));
assertThat("pojo.title", pojo.title, is(p2.title));
assertThat("pojo.content", pojo.content, is(p2.content));
assertThat("pojo.counter", pojo.counter, is(p2.counter));
assertThat("pojo.categories", pojo.categories, hasSize(3));
assertThat("pojo.categories", pojo.categories, CoreMatchers.<Collection<String>>allOf(hasSize(3), containsInAnyOrder(p2.categories.toArray())));
assertThat("pojo.someInternalData", pojo.someInternalData, nullValue());
}
use of com.rbmhtechnology.vind.api.Document in project vind by RBMHTechnology.
the class AnnotationUtilTest method testCreateDocument1.
@Test
public void testCreateDocument1() throws Exception {
Pojo1 p = new Pojo1();
p.id = "foo";
p.title = "title";
p.content = "content";
p.someInternalData = UUID.randomUUID().toString();
p.categories = new HashSet<>(Arrays.asList("cat1", "cat2", "cat3"));
p.tax = new Taxonomy("id-1", "term 1", Arrays.asList("first Term", "term 1", "term one"));
final Document doc = AnnotationUtil.createDocument(p);
assertThat("id", doc.getId(), equalTo(p.id));
assertThat("type", doc.getType(), equalTo("Pojo"));
assertThat("title", doc.getValue("title"), allOf(instanceOf(String.class), CoreMatchers.<Object>equalTo(p.title)));
assertThat("content", doc.getValue("data"), allOf(instanceOf(String.class), equalTo(p.content)));
assertFalse("someInternalData", doc.hasValue("someInternalData"));
assertThat("categories", doc.getValue("cats"), instanceOf(Collection.class));
}
use of com.rbmhtechnology.vind.api.Document in project vind by RBMHTechnology.
the class SolrSearchServer method execute.
@Override
public boolean execute(Update update, DocumentFactory factory) {
// Check if document is updatable and all its fields are stored.
final boolean isUpdatable = factory.isUpdatable() && factory.getFields().values().stream().allMatch(descriptor -> descriptor.isUpdate());
if (isUpdatable) {
final SolrInputDocument sdoc = new SolrInputDocument();
sdoc.addField(ID, update.getId());
sdoc.addField(TYPE, factory.getType());
HashMap<FieldDescriptor<?>, HashMap<String, SortedSet<UpdateOperation>>> updateOptions = update.getOptions();
updateOptions.keySet().forEach(fieldDescriptor -> Stream.of(UseCase.values()).forEach(useCase -> updateOptions.get(fieldDescriptor).keySet().stream().forEach(context -> {
// NOTE: Backwards compatibility
final String updateContext = Objects.isNull(context) ? update.getUpdateContext() : context;
final String fieldName = getFieldname(fieldDescriptor, useCase, updateContext);
if (fieldName != null) {
final Map<String, Object> fieldModifiers = new HashMap<>();
updateOptions.get(fieldDescriptor).get(context).stream().forEach(entry -> {
UpdateOperations opType = entry.getType();
if (fieldName.startsWith("dynamic_single_") && useCase.equals(UseCase.Sort) && opType.equals(UpdateOperations.add)) {
opType = set;
}
fieldModifiers.put(opType.name(), toSolrJType(SolrUtils.FieldValue.getFieldCaseValue(entry.getValue(), fieldDescriptor, useCase)));
});
sdoc.addField(fieldName, fieldModifiers);
}
})));
try {
if (solrClientLogger.isTraceEnabled()) {
solrClientLogger.debug(">>> add({}): {}", update.getId(), sdoc);
} else {
solrClientLogger.debug(">>> add({})", update.getId());
}
SolrInputDocument finalDoc = sdoc;
// Get the original document
final SolrDocument updatedDoc = solrClient.getById(update.getId());
// Setting the document version for optimistic concurrency
final Object version = updatedDoc.getFieldValue("_version_");
if (Objects.nonNull(version)) {
finalDoc.setField("_version_", version);
} else {
log.warn("Error updating document '{}': " + "Atomic updates in nested documents are not supported by Solr", updatedDoc.get(ID));
return false;
}
// Get the nested docs of the document if existing
final NamedList<Object> paramList = new NamedList<>();
paramList.add(CommonParams.Q, "!( _id_:" + update.getId() + ")&(_root_:" + update.getId() + ")");
final QueryResponse query = solrClient.query(SolrParams.toSolrParams(paramList), SolrRequest.METHOD.POST);
// if the document has nested docs solr does not support atomic updates
if (CollectionUtils.isNotEmpty(query.getResults())) {
log.info("Update document `{}`: doc has {} nested documents, changing from partial update to full index.", finalDoc.getFieldValue(SolrUtils.Fieldname.ID), query.getResults().size());
// Get the list of nested documents
final List<SolrInputDocument> childDocs = query.getResults().stream().map(nestedDoc -> ClientUtils.toSolrInputDocument(nestedDoc)).collect(Collectors.toList());
finalDoc = this.getUpdatedSolrDocument(sdoc, updatedDoc, childDocs);
}
try {
log.info("Updating document `{}`: current version `{}`", finalDoc.getFieldValue(SolrUtils.Fieldname.ID), version);
solrClient.add(finalDoc);
return true;
} catch (HttpSolrClient.RemoteSolrException e) {
log.warn("Error updating document {}: {}", finalDoc.getFieldValue(ID), e.getMessage(), e);
return false;
}
} catch (SolrServerException | IOException e) {
log.error("Unable to perform solr partial update on document with id [{}]", update.getId(), e);
throw new SearchServerException("Can not execute solr partial update.", e);
}
} else {
Exception e = new SearchServerException("It is not safe to execute solr partial update: Document contains non stored fields");
log.error("Unable to perform solr partial update on document with id [{}]", update.getId(), e);
throw new RuntimeException("Can not execute solr partial update.", e);
}
}
use of com.rbmhtechnology.vind.api.Document in project vind by RBMHTechnology.
the class SolrSearchServer method index.
@Override
public void index(Document... docs) {
Asserts.notNull(docs, "Document to index should not be null.");
Asserts.check(docs.length > 0, "Should be at least one document to index.");
for (Document doc : docs) {
indexSingleDocument(doc);
}
}
use of com.rbmhtechnology.vind.api.Document in project vind by RBMHTechnology.
the class SolrSearchServerTest method testExecute.
@Test
public void testExecute() throws Exception {
Asset asset = new Asset();
// FIXME: Asset has no @Id field
server.indexBean(asset);
// query
BeanSearchResult<Asset> result = server.execute(Search.fulltext("hello world").filter(eq("category", "test")), Asset.class);
// suggestion
SuggestionResult suggestions = server.execute(Search.suggest("he").fields("category"), Asset.class);
FieldDescriptor<String> title = new FieldDescriptorBuilder().setBoost(2).setLanguage(Language.German).buildTextField("title");
// complex
DocumentFactory factory = new DocumentFactoryBuilder("asset").addField(title).build();
Document document = factory.createDoc("1234");
server.index(document);
// suggestion
SuggestionResult suggestionsFromFactory = server.execute(Search.suggest("he").fields("title"), factory);
}
Aggregations