Skip to content
This repository has been archived by the owner on Aug 30, 2022. It is now read-only.

Commit

Permalink
Global Conversation-Search working (#62)
Browse files Browse the repository at this point in the history
  • Loading branch information
ja-fra committed Sep 26, 2017
1 parent b3c4a0b commit 7faa32d
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,14 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Preconditions;
import io.redlink.smarti.model.Client;
import io.redlink.smarti.model.Context;
import io.redlink.smarti.model.Conversation;
import io.redlink.smarti.model.Message;
import io.redlink.smarti.model.User;
import io.redlink.smarti.model.*;
import io.redlink.smarti.query.conversation.ConversationSearchService;
import io.redlink.smarti.services.ClientService;
import io.redlink.smarti.services.ConversationService;
import io.redlink.smarti.utils.ResponseEntities;
import io.redlink.smarti.webservice.pojo.RocketEvent;
import io.redlink.smarti.model.SearchResult;
import io.redlink.smarti.webservice.pojo.SmartiUpdatePing;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
Expand Down Expand Up @@ -62,7 +54,6 @@
@CrossOrigin
@RestController
@RequestMapping(value = "rocket",
consumes = MimeTypeUtils.APPLICATION_JSON_VALUE,
produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
@Api("rocket")
public class RocketChatEndpoint {
Expand Down Expand Up @@ -118,7 +109,8 @@ public boolean shouldBackoff(HttpResponse resp) {
@ApiResponses({
@ApiResponse(code = 200, message = "OK")
})
@RequestMapping(value = "{clientId:.*}", method = RequestMethod.POST)
@RequestMapping(value = "{clientId:.*}", method = RequestMethod.POST,
consumes = MimeTypeUtils.APPLICATION_JSON_VALUE)
public ResponseEntity<?> onRocketEvent(@PathVariable("clientId") String clientName,
@RequestBody RocketEvent payload) {
log.debug("{}: {}", clientName, payload);
Expand Down Expand Up @@ -223,11 +215,13 @@ public ResponseEntity<?> getConversation(
* @param clientName the client id
* @param queryParams the actual query-params
*/
@ApiOperation(value = "search for a conversation", response = SearchResult.class)
@ApiOperation(value = "search for a conversation", response = SearchResult.class,
notes = "besides simple text-queries, you can pass in arbitrary solr query parameter.")
@RequestMapping(value = "{clientId}/search", method = RequestMethod.GET)
public ResponseEntity<?> search(
@PathVariable(value = "clientId") String clientName,
@RequestParam MultiValueMap<String, String> queryParams) {
@ApiParam("fulltext search") @RequestParam(value = "text", required = false) String text,
@ApiParam(hidden = true) @RequestParam MultiValueMap<String, String> queryParams) {

final Client client = clientService.getByName(clientName);
if (client == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ public void setId(ObjectId id) {
* @deprecated use #getOwner() instead
*/
@Deprecated
@JsonIgnore
public ObjectId getClientId() {
return getOwner();
}
Expand Down
10 changes: 7 additions & 3 deletions core/src/main/java/io/redlink/smarti/model/SearchResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,17 @@
*/
package io.redlink.smarti.model;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.util.List;
import java.util.function.Function;

public class SearchResult<T> {

private long numFound, start;
private float maxScore;

@JsonInclude(JsonInclude.Include.NON_NULL)
private Float maxScore;

private List<T> docs;

public SearchResult() {
Expand Down Expand Up @@ -52,7 +56,7 @@ public SearchResult setStart(long start) {
return this;
}

public float getMaxScore() {
public Float getMaxScore() {
return maxScore;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,12 @@
import org.springframework.util.MultiValueMap;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

import static io.redlink.smarti.query.conversation.ConversationIndexConfiguration.FIELD_OWNER;
import static io.redlink.smarti.query.conversation.ConversationIndexConfiguration.FIELD_TYPE;

@Service
public class ConversationSearchService {
Expand All @@ -63,11 +62,17 @@ public ConversationSearchService(SolrCoreContainer solrServer, @Qualifier(Conver

public SearchResult<Conversation> search(Client client, MultiValueMap<String, String> queryParams) throws IOException {

final ModifiableSolrParams solrParams = new ModifiableSolrParams(toListOfStringArrays(queryParams));
final ModifiableSolrParams solrParams = new ModifiableSolrParams(toListOfStringArrays(queryParams, "text"));

solrParams.add(CommonParams.FL, "id");
solrParams.add(CommonParams.FQ, String.format("%s:\"%s\"", FIELD_OWNER,
ClientUtils.escapeQueryChars(client.getId().toHexString())));

solrParams.add(CommonParams.FQ, String.format("%s:\"%s\"", FIELD_TYPE, "conversation"));
if (queryParams.containsKey("text")) {
solrParams.set(CommonParams.Q, String.format("{!parent which=\"%s:%s\"}text:%s",
FIELD_TYPE, "conversation",
ClientUtils.escapeQueryChars(queryParams.getFirst("text"))));
}

try (SolrClient solrClient = solrServer.getSolrClient(conversationCore)) {

Expand All @@ -85,17 +90,28 @@ private Conversation readConversation(SolrDocument doc) {
return storeService.get(new ObjectId(String.valueOf(doc.getFirstValue("id"))));
}

private static Map<String, String[]> toListOfStringArrays(Map<String, List<String>> in) {
private static Map<String, String[]> toListOfStringArrays(Map<String, List<String>> in, String... excludes) {
final Set<String> excludeKeys = new HashSet<>(Arrays.asList(excludes));
final Map<String, String[]> map = new HashMap<>();
in.forEach((k, v) -> map.put(k, v.toArray(new String[v.size()])));
in.forEach((k, v) -> {
if (!excludeKeys.contains(k)) {
map.put(k, v.toArray(new String[v.size()]));
}
});
return map;
}

private static <T> SearchResult<T> fromQueryResponse(QueryResponse solrQueryResponse, Function<SolrDocument, T> resultMapper) {
final SolrDocumentList results = solrQueryResponse.getResults();

return new SearchResult<>(results.getNumFound(), results.getStart(),
final SearchResult<T> searchResult = new SearchResult<>(results.getNumFound(), results.getStart(),
results.stream().map(resultMapper).collect(Collectors.toList()));

if (results.getMaxScore() != null) {
searchResult.setMaxScore(results.getMaxScore());
}

return searchResult;
}


Expand Down

0 comments on commit 7faa32d

Please sign in to comment.