Advertisement
Guest User

Untitled

a guest
Aug 9th, 2016
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.51 KB | None | 0 0
  1. package pl.bpo.archiwumallegro.services;
  2.  
  3. import java.text.DateFormat;
  4. import java.text.SimpleDateFormat;
  5. import org.elasticsearch.common.collect.Lists;
  6. import org.elasticsearch.index.query.BoolQueryBuilder;
  7. import org.elasticsearch.index.query.FilterBuilder;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.data.domain.Page;
  10. import org.springframework.data.domain.Pageable;
  11. import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
  12. import org.springframework.data.elasticsearch.core.FacetedPage;
  13. import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
  14. import org.springframework.stereotype.Service;
  15. import pl.bpo.archiwumallegro.model.Auction;
  16. import pl.bpo.archiwumallegro.model.index.auctions.AuctionIndex;
  17. import pl.bpo.archiwumallegro.model.index.auctions.AuctionIndexSearchParams;
  18. import pl.bpo.archiwumallegro.repositories.AuctionIndexRepository;
  19. import pl.bpo.archiwumallegro.repositories.AuctionRepository;
  20.  
  21. import java.util.ArrayList;
  22. import java.util.HashMap;
  23. import java.util.List;
  24. import java.util.Map;
  25. import java.util.Optional;
  26. import java.util.stream.Collectors;
  27. import java.util.stream.Stream;
  28. import org.elasticsearch.action.search.SearchResponse;
  29. import org.elasticsearch.index.query.FilterBuilders;
  30.  
  31. import static org.elasticsearch.index.query.FilterBuilders.*;
  32. import org.elasticsearch.index.query.FilteredQueryBuilder;
  33. import org.elasticsearch.index.query.MatchQueryBuilder;
  34. import org.elasticsearch.index.query.QueryBuilders;
  35. import static org.elasticsearch.index.query.QueryBuilders.*;
  36. import org.elasticsearch.search.aggregations.Aggregation;
  37. import org.elasticsearch.search.aggregations.AggregationBuilders;
  38. import org.elasticsearch.search.aggregations.Aggregations;
  39. import org.elasticsearch.search.aggregations.metrics.MetricsAggregationBuilder;
  40. import org.elasticsearch.search.sort.SortBuilders;
  41. import org.elasticsearch.search.sort.SortOrder;
  42. import static org.elasticsearch.search.sort.SortOrder.DESC;
  43. import org.elasticsearch.search.suggest.Suggest.Suggestion.Sort;
  44. import org.springframework.data.elasticsearch.core.ResultsExtractor;
  45. import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
  46. import pl.bpo.archiwumallegro.helpers.StoperHelper;
  47.  
  48. @Service
  49. public class AuctionService {
  50.  
  51.     private AuctionRepository auctionRepository;
  52.     private AuctionIndexRepository auctionIndexRepository;
  53.  
  54.     @Autowired
  55.     public AuctionService(AuctionRepository auctionRepository, AuctionIndexRepository auctionIndexRepository) {
  56.         this.auctionRepository = auctionRepository;
  57.         this.auctionIndexRepository = auctionIndexRepository;
  58.     }
  59.     @Autowired
  60.     private ElasticsearchTemplate searchTemplate;
  61.  
  62.     public Auction findAuctionById(Long auctionId) {
  63.         return auctionRepository.findAuctionById(auctionId);
  64.     }
  65.  
  66.     public List<Auction> findByUserId(Long userId) {
  67.         return auctionRepository.findAuctionByUserId(userId);
  68.     }
  69.  
  70.     public NativeSearchQueryBuilder getSearchQuery(AuctionIndexSearchParams searchParams, Pageable pageable) {
  71.         final List<FilterBuilder> filters = Lists.newArrayList();
  72.         final NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();
  73.  
  74.         Optional.ofNullable(searchParams.getCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("cat", v))));
  75.         Optional.ofNullable(searchParams.getCurrency()).ifPresent(v -> filters.add(boolFilter().must(termFilter("curr", v))));
  76.         Optional.ofNullable(searchParams.getTreeCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("tcat", v))));
  77.         Optional.ofNullable(searchParams.getUid()).ifPresent(v -> filters.add(boolFilter().must(termFilter("uid", v))));
  78.         final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
  79.  
  80.         //access for many uids
  81.         if (searchParams.getUids() != null) {
  82.             if (searchParams.getItemId() != null || searchParams.getTitle() != null) {
  83.                 Optional.ofNullable(searchParams.getUids().split(",")).ifPresent(v -> {
  84.                     filters.add(boolFilter().must(termsFilter("uid", v)));
  85.                 });
  86.             } else {
  87.                 for (String user : searchParams.getUids().split(",")) {
  88.                     boolQueryBuilder.should(queryStringQuery(user).field("uid"));
  89.                 }
  90.             }
  91.         }
  92.         //access for many categories
  93.         if (searchParams.getCategories() != null) {
  94.             Optional.ofNullable(searchParams.getCategories().split(",")).ifPresent(v -> {
  95.                 filters.add(boolFilter().must(termsFilter("cat", v)));
  96.             });
  97.         }
  98.  
  99.         if (searchParams.getItemId() != null) {
  100.             boolQueryBuilder.must(queryStringQuery(searchParams.getItemId()).field("_id"));
  101.         }
  102.         if (Optional.ofNullable(searchParams.getTitle()).isPresent()) {
  103.             boolQueryBuilder.must(queryStringQuery(searchParams.getTitle()).analyzeWildcard(true).field("raw.title"));
  104.         }
  105.  
  106.         if (Optional.ofNullable(searchParams.getStartDateFrom()).isPresent()
  107.                 || Optional.ofNullable(searchParams.getStartDateTo()).isPresent()) {
  108.  
  109.             filters.add(rangeFilter("start_date").from(searchParams.getStartDateFrom()).to(searchParams.getStartDateTo()));
  110.         }
  111.  
  112.         if (Optional.ofNullable(searchParams.getEndDateFrom()).isPresent()
  113.                 || Optional.ofNullable(searchParams.getEndDateTo()).isPresent()) {
  114.             filters.add(rangeFilter("end_date").from(searchParams.getEndDateFrom()).to(searchParams.getEndDateTo()));
  115.         }
  116.  
  117.         if (Optional.ofNullable(searchParams.getPriceFrom()).isPresent()
  118.                 || Optional.ofNullable(searchParams.getPriceTo()).isPresent()) {
  119.             filters.add(rangeFilter("price").from(searchParams.getPriceFrom()).to(searchParams.getPriceTo()));
  120.         }
  121.  
  122.         searchQuery.withQuery(boolQueryBuilder);
  123.  
  124.         FilterBuilder[] filterArr = new FilterBuilder[filters.size()];
  125.         filterArr = filters.toArray(filterArr);
  126.         searchQuery.withFilter(andFilter(filterArr));
  127.  
  128.         if (searchParams.getOrderBy() != null && searchParams.getOrderDir() != null) {
  129.             if (searchParams.getOrderDir().toLowerCase().equals("asc")) {
  130.                 searchQuery.withSort(SortBuilders.fieldSort(searchParams.getOrderBy()).order(SortOrder.ASC));
  131.             } else {
  132.                 searchQuery.withSort(SortBuilders.fieldSort(searchParams.getOrderBy()).order(SortOrder.DESC));
  133.             }
  134.         }
  135.         if (pageable != null) {
  136.             searchQuery.withPageable(pageable);
  137.         }
  138.         return searchQuery;
  139.     }
  140.  
  141.     public Map findAllByIndexParams(AuctionIndexSearchParams searchParams, Pageable pageable) {
  142.         List rows = new ArrayList();
  143.         Map response = new HashMap();
  144.  
  145.         final List<FilterBuilder> filters = Lists.newArrayList();
  146.         final NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery());
  147.         Optional.ofNullable(searchParams.getCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("cat", v))));
  148.         Optional.ofNullable(searchParams.getCurrency()).ifPresent(v -> filters.add(boolFilter().must(termFilter("curr", v))));
  149.         Optional.ofNullable(searchParams.getTreeCategoryId()).ifPresent(v -> filters.add(boolFilter().must(termFilter("tcat", v))));
  150.         Optional.ofNullable(searchParams.getUid()).ifPresent(v -> filters.add(boolFilter().must(termFilter("uid", v))));
  151.  
  152. //        //access for many uids
  153. //        if (searchParams.getUids() != null) {
  154. //            Optional.ofNullable(searchParams.getUids().split(",")).ifPresent(v -> {
  155. //                filters.add(boolFilter().must(termsFilter("uid", v)));
  156. //            });
  157. //        }
  158. //
  159. //        //access for many categories
  160. //        if (searchParams.getCategories() != null) {
  161. //            Optional.ofNullable(searchParams.getCategories().split(",")).ifPresent(v -> {
  162. //                filters.add(boolFilter().must(termsFilter("cat", v)));
  163. //            });
  164. //        }
  165.         final BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
  166.         //access for many uids
  167.         if (searchParams.getUids() != null) {
  168.             if (searchParams.getItemId() != null || searchParams.getTitle() != null) {
  169.                 Optional.ofNullable(searchParams.getUids().split(",")).ifPresent(v -> {
  170.                     filters.add(boolFilter().must(termsFilter("uid", v)));
  171.                 });
  172.             } else {
  173.                 for (String user : searchParams.getUids().split(",")) {
  174.                     boolQueryBuilder.should(queryStringQuery(user).field("uid"));
  175.                 }
  176.             }
  177.         }
  178.         //access for many categories
  179.         if (searchParams.getCategories() != null) {
  180.             Optional.ofNullable(searchParams.getCategories().split(",")).ifPresent(v -> {
  181.                 filters.add(boolFilter().must(termsFilter("cat", v)));
  182.             });
  183.         }
  184.         if (searchParams.getItemId() != null) {
  185.             boolQueryBuilder.must(queryStringQuery(searchParams.getItemId()).field("_id"));
  186.         }
  187.         if (Optional.ofNullable(searchParams.getTitle()).isPresent()) {
  188.             boolQueryBuilder.must(queryStringQuery(searchParams.getTitle()).analyzeWildcard(true).field("title"));
  189.         }
  190.  
  191.         if (Optional.ofNullable(searchParams.getStartDateFrom()).isPresent()
  192.                 || Optional.ofNullable(searchParams.getStartDateTo()).isPresent()) {
  193.             filters.add(rangeFilter("start_date").from(searchParams.getStartDateFrom()).to(searchParams.getStartDateTo()));
  194.         }
  195.  
  196.         if (Optional.ofNullable(searchParams.getEndDateFrom()).isPresent()
  197.                 || Optional.ofNullable(searchParams.getEndDateTo()).isPresent()) {
  198.             filters.add(rangeFilter("end_date").from(searchParams.getEndDateFrom()).to(searchParams.getEndDateTo()));
  199.         }
  200.  
  201.         if (Optional.ofNullable(searchParams.getPriceFrom()).isPresent()
  202.                 || Optional.ofNullable(searchParams.getPriceTo()).isPresent()) {
  203.             filters.add(rangeFilter("price").from(searchParams.getPriceFrom()).to(searchParams.getPriceTo()));
  204.         }
  205.  
  206.         searchQuery.withQuery(boolQueryBuilder);
  207.  
  208.         FilterBuilder[] filterArr = new FilterBuilder[filters.size()];
  209.         filterArr = filters.toArray(filterArr);
  210.         searchQuery.withFilter(andFilter(filterArr));
  211.  
  212.         if (searchParams.getOrderBy() != null && searchParams.getOrderDir() != null) {
  213.             if (searchParams.getOrderDir().toLowerCase().equals("asc")) {
  214.                 searchQuery.withSort(SortBuilders.fieldSort(searchParams.getOrderBy()).order(SortOrder.ASC));
  215.             } else {
  216.                 searchQuery.withSort(SortBuilders.fieldSort(searchParams.getOrderBy()).order(SortOrder.DESC));
  217.             }
  218.         }
  219.  
  220.         String scrollId = searchTemplate.scan(searchQuery.build(), 100000, false);
  221.  
  222.         Page<AuctionIndex> page = searchTemplate.scroll(scrollId, 500000, AuctionIndex.class);
  223.  
  224.         if (page.hasContent()) {
  225.             while (true) {
  226.                 for (AuctionIndex hit : page.getContent()) {
  227.                     rows.add(auctionRepository.findAuctionById(Long.valueOf(hit.getId())));
  228.                 }
  229.                 page = searchTemplate.scroll(scrollId, 500000, AuctionIndex.class);
  230.                 if (page.hasContent() == false) {
  231.                     break;
  232.                 }
  233.             }
  234.  
  235.         }
  236.  
  237.         response.put("content", rows);
  238.         return response;
  239.     }
  240.  
  241.     public Map searchByIndexParams(AuctionIndexSearchParams searchParams, Pageable pageable) {
  242.         Map response = new HashMap();
  243.         NativeSearchQuery searchQuery = this.getSearchQuery(searchParams, pageable).build();
  244.  
  245. //        Aggregations aggregations = searchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
  246. //            @Override
  247. //            public Aggregations extract(SearchResponse response) {
  248. //                return response.getAggregations();
  249. //            }
  250. //        });
  251.         final FacetedPage<AuctionIndex> search = auctionIndexRepository.search(searchQuery);
  252.  
  253.         List<AuctionIndex> content = search.getContent();
  254.  
  255.         response.put("content", content.stream().map(row -> {
  256.             return Auction.builder()
  257.                     .cat(row.getCat())
  258.                     .item(Long.parseLong(row.getId()))
  259.                     .endts(row.getEnd_date())
  260.                     .startts(row.getStart_date())
  261.                     .loc(row.getLoc())
  262.                     .pow(row.getPow())
  263.                     .woj(row.getWoj())
  264.                     .price(row.getPrice())
  265.                     .qty(row.getQty())
  266.                     .title(row.getTitle())
  267.                     .user(row.getUid())
  268.                     .catName(row.getCat_name())
  269.                     .build();
  270.         }).collect(Collectors.toList()));
  271.  
  272. //        response.put("content", search.map(index -> auctionRepository
  273. //                .findAuctionById(Long.valueOf(index.getId())))
  274. //                .getContent());
  275.         response.put("first", search.isFirst());
  276.         response.put("last", search.isLast());
  277.         response.put("number", search.getNumber());
  278.         response.put("numberOfElements", search.getNumberOfElements());
  279.         response.put("size", search.getSize());
  280.         response.put("sort", search.getSort());
  281.         response.put("totalElements", search.getTotalElements());
  282.         response.put("totalPages", search.getTotalPages());
  283.  
  284.         return response;
  285.     }
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement