JdbcSearchResponseResolver.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package org.elasticsearch.jdbc.es;
  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 datePattern) throws ResolveSearchResponseException {
  33. Gson dateFormatGson = new GsonBuilder().setDateFormat(datePattern).create();
  34. return resolveSearchResponse(clazz, dateFormatGson);
  35. }
  36. public <T> JdbcSearchResponse<T> resolveSearchResponse(TypeToken<T> typeToken, String datePattern) throws ResolveSearchResponseException {
  37. Gson dateFormatGson = new GsonBuilder().setDateFormat(datePattern).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 resultItem) {
  44. return gson.fromJson(resultItem, 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 resultItem) {
  52. return gson.fromJson(resultItem, 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. List<T> resultList = resolveResultList(searchRespStrGson.getResultList(), resolveStrategy);
  61. retJdbcSearchResponse.setResultList(resultList);
  62. return retJdbcSearchResponse;
  63. }
  64. protected <T> List<T> resolveResultList(List<String> resultList, ResolveStrategy<T> resolveStrategy) {
  65. if (CollectionUtils.isEmpty(resultList)) {
  66. return Collections.emptyList();
  67. }
  68. List<T> resolvedList = null;
  69. try {
  70. resolvedList = Lists.transform(resultList, new Function<String, T>() {
  71. @Override
  72. public T apply(String resultItem) {
  73. return resolveStrategy.resolve(resultItem);
  74. }
  75. });
  76. }
  77. catch (Exception ex) {
  78. throw new ResolveSearchResponseException("Failed to resolve gson from response", ex);
  79. }
  80. return resolvedList;
  81. }
  82. protected JdbcSearchResponse<String> parseSearchResponseGson(String searchRespGson) {
  83. JdbcSearchResponse<String> searchRespStrGson;
  84. try {
  85. searchRespStrGson = new Gson().fromJson(oriSearchResponseGson, new TypeToken<JdbcSearchResponse<String>>() {}.getType());
  86. }
  87. catch (Exception exp) {
  88. throw new ResolveSearchResponseException(String.format("Failed to parse responseGson[%s] to JdbcSearchResponse", oriSearchResponseGson), exp);
  89. }
  90. return searchRespStrGson;
  91. }
  92. protected <T> void setBasicPropertyForResponse(JdbcSearchResponse<T> targetResponse, JdbcSearchResponse<String> sourceResponse) {
  93. targetResponse.setTotalShards(sourceResponse.getTotalShards());
  94. targetResponse.setTotalCount(sourceResponse.getTotalCount());
  95. targetResponse.setTookInMillis(sourceResponse.getTookInMillis());
  96. targetResponse.setFailedShards(sourceResponse.getFailedShards());
  97. targetResponse.setSuccessfulShards(sourceResponse.getSuccessfulShards());
  98. }
  99. public interface ResolveStrategy<T> {
  100. T resolve(String resultItem);
  101. }
  102. }