From 4158181df9ea5fa5dfcd839e0a528c6cc9102da7 Mon Sep 17 00:00:00 2001 From: Gethin James Date: Thu, 1 Jun 2017 11:12:05 +0000 Subject: [PATCH] Merged searchrep (5.2.1) to 5.2.N (5.2.1) 136891 msuzuki: Search-340, refactore class that was getting too big git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@137069 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../api/search/impl/RangeResultMapper.java | 172 ++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 source/java/org/alfresco/rest/api/search/impl/RangeResultMapper.java diff --git a/source/java/org/alfresco/rest/api/search/impl/RangeResultMapper.java b/source/java/org/alfresco/rest/api/search/impl/RangeResultMapper.java new file mode 100644 index 0000000000..dadd013f06 --- /dev/null +++ b/source/java/org/alfresco/rest/api/search/impl/RangeResultMapper.java @@ -0,0 +1,172 @@ +/*- + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2016 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ + +package org.alfresco.rest.api.search.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericBucket; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.GenericFacetResponse.FACET_TYPE; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.Metric; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.Metric.METRIC_TYPE; +import org.alfresco.repo.search.impl.solr.facet.facetsresponse.SimpleMetric; +import org.alfresco.rest.api.search.model.SearchQuery; +import org.alfresco.service.cmr.search.RangeParameters; + +/**Helper to map range results. + * + * @author Michael Suzuki + */ +public class RangeResultMapper +{ + /** + * Transforms the facet range response into generic facet response. + * @param facetFields + * @param searchQuery + * @return GenericFacetResponse + */ + public static List getGenericFacetsForRanges( Map>> facetFields, SearchQuery searchQuery) + { + List ffcs = new ArrayList<>(facetFields.size()); + if (facetFields != null && !facetFields.isEmpty() && searchQuery.getQuery() != null) + { + for (Entry>> facet : facetFields.entrySet()) + { + List buckets = new ArrayList<>(); + facet.getValue().forEach(action -> buckets.add(buildGenericBucketFromRange(facet.getKey(), + (Map) action, + searchQuery.getFacetRanges()))); + ffcs.add(new GenericFacetResponse(FACET_TYPE.range, facet.getKey(), buckets)); + } + } + return ffcs; + } + private static boolean isRangeStartInclusive(List values) + { + if(values != null && !values.isEmpty()) + { + for(String startInc : values) + switch (startInc) + { + case "upper": + return false; + case "outer": + return false; + default: + break; + } + } + return true; + } + private static boolean isRangeEndInclusive(List endIncs) + { + if(endIncs != null && !endIncs.isEmpty()) + { + for(String endInc : endIncs) + { + switch (endInc) + { + case "upper": + return true; + case "edge": + return true; + case "outer": + return true; + case "all": + return true; + default: + break; + } + } + } + return false; + } + /** + * Builds the generic facet response out of range results. + * @param facetField + * @param facet + * @return + */ + private static GenericBucket buildGenericBucketFromRange(String facetField, Map facet, List ranges) + { + String start = facet.get(GenericFacetResponse.START); + String end = facet.get(GenericFacetResponse.END); + boolean startInclusive = true; + boolean endInclusive = false; + + for(RangeParameters range : ranges) + { + if(range.getField().equalsIgnoreCase(facetField)) + { + List includes = range.getInclude(); + if(includes != null && !includes.isEmpty()) + { + startInclusive = isRangeStartInclusive(includes); + endInclusive = isRangeEndInclusive(includes); + } + } + } + + facet.put(GenericFacetResponse.START_INC.toString(), Boolean.toString(startInclusive)); + facet.put(GenericFacetResponse.END_INC.toString(), Boolean.toString(endInclusive)); + + facet.remove(GenericFacetResponse.LABEL); + StringBuilder filterQ = new StringBuilder(); + filterQ.append(facetField).append(":") + .append(startInclusive ? "[" :"<") + .append(start).append(" TO ") + .append(end) + .append(endInclusive ? "]" :">"); + + Set metrics = new HashSet( + Arrays.asList(new SimpleMetric( + METRIC_TYPE.count,facet.get( + GenericFacetResponse.COUNT)))); + facet.remove("count"); + + StringBuilder label = new StringBuilder(); + label.append(startInclusive ? "[" :"(") + .append(start) + .append(" - ") + .append(end) + .append(endInclusive ? "]" :")"); + + return new GenericBucket(label.toString(), + filterQ.toString(), + null, + metrics, + null, + facet); + + } +}