use of com.rbmhtechnology.vind.model.DocumentFactory in project vind by RBMHTechnology.
the class RESTMetadataProvider method getObject.
@Override
public <T> T getObject(T o) throws IOException {
DocumentFactory factory = AnnotationUtil.createDocumentFactory(o.getClass());
Document doc = AnnotationUtil.createDocument(o);
return AnnotationUtil.createPojo(getDocumentById(doc.getId(), factory), (Class<T>) o.getClass());
}
use of com.rbmhtechnology.vind.model.DocumentFactory in project vind by RBMHTechnology.
the class RESTMetadataProviderTest method testGetDocument2.
@Test
// ignored because of the username, password
@Ignore
public void testGetDocument2() throws IOException {
MetadataProvider metadataProvider = new RESTMetadataProvider("https://mediamanager-staging.redbullmediahouse.com", "rbmh", "admin", "global", "1315204862832-1123067022", "asset", "user", "passw");
SingleValueFieldDescriptor.TextFieldDescriptor<String> title = new FieldDescriptorBuilder().setFullText(true).setFacet(// notwendig für suggestion, da wirds noch ein setSuggestion(bool) geben
true).putMetadata(RESTMetadataProvider.ID, "1319102420792-686346531").buildTextField("title");
SingleValueFieldDescriptor.TextFieldDescriptor<String> description = new FieldDescriptorBuilder().setFullText(true).setFacet(// notwendig für suggestion, da wirds noch ein setSuggestion(bool) geben
true).putMetadata(RESTMetadataProvider.ID, "1315204278582-8008411").buildTextField("description");
DocumentFactory factory = new DocumentFactoryBuilder("asset").addField(title, description).build();
Document document = factory.createDoc("1359078847993-766700833");
document = metadataProvider.getDocument(document, factory);
Assert.assertEquals("Sean Pettit - Portrait", document.getValue(title));
}
use of com.rbmhtechnology.vind.model.DocumentFactory 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.model.DocumentFactory in project vind by RBMHTechnology.
the class SolrSearchServer method execute.
@Override
public <T> BeanGetResult<T> execute(RealTimeGet search, Class<T> c) {
DocumentFactory documentFactory = AnnotationUtil.createDocumentFactory(c);
final GetResult result = this.execute(search, documentFactory);
return result.toPojoResult(result, c);
}
use of com.rbmhtechnology.vind.model.DocumentFactory in project vind by RBMHTechnology.
the class SolrSearchServer method execute.
@Override
public void execute(Delete delete, DocumentFactory factory) {
String query = SolrUtils.Query.buildFilterString(delete.getQuery(), factory, delete.getUpdateContext(), true);
try {
solrClientLogger.debug(">>> delete query({})", query);
// Finding the ID of the documents to delete
final SolrQuery solrQuery = new SolrQuery();
solrQuery.setParam(CommonParams.Q, "*:*");
solrQuery.setParam(CommonParams.FQ, query.trim().replaceAll("^\\+", "").split("\\+"));
final QueryResponse response = solrClient.query(solrQuery, SolrRequest.METHOD.POST);
if (Objects.nonNull(response) && CollectionUtils.isNotEmpty(response.getResults())) {
final List<String> idList = response.getResults().stream().map(doc -> (String) doc.get(ID)).collect(Collectors.toList());
solrClient.deleteById(idList);
// Deleting nested documents
solrClient.deleteByQuery("_root_:(" + StringUtils.join(idList, " OR ") + ")");
}
} catch (SolrServerException | IOException e) {
log.error("Cannot delete with query {}", query, e);
throw new SearchServerException("Cannot delete with query", e);
}
}
Aggregations