JdbcSearchResponseResolver.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package org.elasticsearch.jdbc.search;
  2. import com.google.common.base.Function;
  3. import com.google.common.collect.Lists;
  4. import com.google.common.reflect.TypeToken;
  5. import com.google.gson.Gson;
  6. import com.google.gson.GsonBuilder;
  7. import org.apache.commons.collections.CollectionUtils;
  8. import org.apache.commons.lang.StringUtils;
  9. import org.elasticsearch.jdbc.exception.ResolveSearchResponseException;
  10. import org.elasticsearch.utils.Constants;
  11. import java.util.Collections;
  12. import java.util.List;
  13. public class JdbcSearchResponseResolver {
  14. private String oriSearchResponseGson;
  15. public JdbcSearchResponseResolver(String oriSearchResponseGson) {
  16. if (StringUtils.isBlank(oriSearchResponseGson)) {
  17. throw new IllegalArgumentException("param[oriSearchResponseGson] can not be blank");
  18. }
  19. this.oriSearchResponseGson = oriSearchResponseGson;
  20. }
  21. public String getOriSearchResponseGson() {
  22. return oriSearchResponseGson;
  23. }
  24. public <T> JdbcSearchResponse<T> resolveSearchResponse(Class<T> clazz) throws ResolveSearchResponseException {
  25. Gson defaultEsDateFormatGson = new GsonBuilder().setDateFormat(Constants.DEFAULT_ES_DATE_FORMAT).create();
  26. return resolveSearchResponse(clazz, defaultEsDateFormatGson);
  27. }
  28. public <T> JdbcSearchResponse<T> resolveSearchResponse(TypeToken<T> typeToken) throws ResolveSearchResponseException {
  29. Gson defaultEsDateFormatGson = new GsonBuilder().setDateFormat(Constants.DEFAULT_ES_DATE_FORMAT).create();
  30. return resolveSearchResponse(typeToken, defaultEsDateFormatGson);
  31. }
  32. public <T> JdbcSearchResponse<T> resolveSearchResponse(Class<T> clazz, String dataPattern) throws ResolveSearchResponseException {
  33. Gson dateFormatGson = new GsonBuilder().setDateFormat(dataPattern).create();
  34. return resolveSearchResponse(clazz, dateFormatGson);
  35. }
  36. public <T> JdbcSearchResponse<T> resolveSearchResponse(TypeToken<T> typeToken, String dataPattern) throws ResolveSearchResponseException {
  37. Gson dateFormatGson = new GsonBuilder().setDateFormat(dataPattern).create();
  38. return resolveSearchResponse(typeToken, dateFormatGson);
  39. }
  40. public <T> JdbcSearchResponse<T> resolveSearchResponse(Class<T> clazz, Gson gson) throws ResolveSearchResponseException {
  41. return resolveSearchResponse(new ResolveStrategy<T>() {
  42. @Override
  43. public T resolve(String document) {
  44. return gson.fromJson(document, clazz);
  45. }
  46. });
  47. }
  48. public <T> JdbcSearchResponse<T> resolveSearchResponse(TypeToken<T> typeToken, Gson gson) throws ResolveSearchResponseException {
  49. return resolveSearchResponse(new ResolveStrategy<T>() {
  50. @Override
  51. public T resolve(String document) {
  52. return gson.fromJson(document, typeToken.getType());
  53. }
  54. });
  55. }
  56. public <T> JdbcSearchResponse<T> resolveSearchResponse(ResolveStrategy<T> resolveStrategy) throws ResolveSearchResponseException {
  57. JdbcSearchResponse<String> searchRespStrGson = parseSearchResponseGson(oriSearchResponseGson);
  58. JdbcSearchResponse<T> retJdbcSearchResponse = new JdbcSearchResponse<T>();
  59. setBasicPropertyForResponse(retJdbcSearchResponse, searchRespStrGson);
  60. // resolve query result set
  61. List<T> docList = resolveDocumentList(searchRespStrGson.getDocList(), resolveStrategy);
  62. retJdbcSearchResponse.setDocList(docList);
  63. // todo resolve aggregation result set
  64. return retJdbcSearchResponse;
  65. }
  66. protected <T> List<T> resolveDocumentList(List<String> documentList, ResolveStrategy<T> resolveStrategy) {
  67. if (CollectionUtils.isEmpty(documentList)) {
  68. return Collections.emptyList();
  69. }
  70. List<T> resolvedDocList = null;
  71. try {
  72. resolvedDocList = Lists.transform(documentList, new Function<String, T>() {
  73. @Override
  74. public T apply(String doc) {
  75. return resolveStrategy.resolve(doc);
  76. }
  77. });
  78. }
  79. catch (Exception ex) {
  80. throw new ResolveSearchResponseException("Failed to resolve doc gson");
  81. }
  82. return resolvedDocList;
  83. }
  84. protected JdbcSearchResponse<String> parseSearchResponseGson(String searchRespGson) {
  85. JdbcSearchResponse<String> searchRespStrGson;
  86. try {
  87. searchRespStrGson = new Gson().fromJson(oriSearchResponseGson, new TypeToken<JdbcSearchResponse<String>>() {}.getType());
  88. }
  89. catch (Exception exp) {
  90. throw new ResolveSearchResponseException(String.format("Failed to parse responseGson[%s] to JdbcSearchResponse", oriSearchResponseGson));
  91. }
  92. return searchRespStrGson;
  93. }
  94. protected <T> void setBasicPropertyForResponse(JdbcSearchResponse<T> targetResponse, JdbcSearchResponse<String> sourceResponse) {
  95. targetResponse.setTotalShards(sourceResponse.getTotalShards());
  96. targetResponse.setTotalHits(sourceResponse.getTotalHits());
  97. targetResponse.setTookInMillis(sourceResponse.getTookInMillis());
  98. targetResponse.setFailedShards(sourceResponse.getFailedShards());
  99. targetResponse.setSuccessfulShards(sourceResponse.getSuccessfulShards());
  100. }
  101. public interface ResolveStrategy<T> {
  102. T resolve(String document);
  103. }
  104. }