blob: 7a688d73f84e3239ea5c30881243f6aacad02128 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.analytics.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import org.apache.solr.analytics.AnalyticsRequestParser.AnalyticsExpressionSortRequest;
import org.apache.solr.analytics.AnalyticsRequestParser.AnalyticsRangeFacetRequest;
import org.apache.solr.analytics.AnalyticsRequestParser.AnalyticsSortRequest;
import org.apache.solr.analytics.AnalyticsRequestParser.AnalyticsValueFacetRequest;
import org.apache.solr.analytics.function.mapping.FillMissingFunction;
/**
* Specifies the format of the old olap-style analytics requests.
*/
public interface OldAnalyticsParams {
// Old request language
public static final String OLD_ANALYTICS = "olap";
public static final String OLD_PREFIX = "o|olap";
public static final String OLD_EXPRESSION = "s|stat|statistic";
public static class OldRequest {
public String name;
public Map<String,String> expressions = new HashMap<>();
public Map<String,OldFieldFacet> fieldFacets = new HashMap<>();
public Map<String,OldRangeFacet> rangeFacets = new HashMap<>();
public Map<String,OldQueryFacet> queryFacets = new HashMap<>();
}
public static final String FIELD_FACET = "(?:ff|fieldfacet)";
public static final String VALUE_FACET = "(?:vf|valuefacet)";
public static final String LIMIT = "(?:l|limit)";
public static final String OFFSET = "(?:off|offset)";
public static final String SHOW_MISSING = "(?:sm|showmissing)";
public static final String SORT_EXPRESSION ="(?:se|sortexpr|sortexpression)";
public static final String OLAP_SORT_EXPRESSION ="(?:ss|sortstat|sortstatistic)";
public static final String SORT_DIRECTION ="(?:sd|sortdirection)";
public static class OldFieldFacet {
public String field;
public String showMissing;
public String limit;
public String offset;
public String sortExpr;
public String sortDir;
}
public static class FieldFacetParamParser {
public static String regexParamList = LIMIT + "|" + OFFSET + "|" + SHOW_MISSING + "|" + OLAP_SORT_EXPRESSION + "|" + SORT_DIRECTION;
private static Predicate<String> isLimit = Pattern.compile("^" + LIMIT + "$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isOffset = Pattern.compile("^" + OFFSET + "$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isShowMissing = Pattern.compile("^" + SHOW_MISSING + "$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isSortExpr = Pattern.compile("^" + OLAP_SORT_EXPRESSION + "$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isSortDir = Pattern.compile("^" + SORT_DIRECTION + "$", Pattern.CASE_INSENSITIVE).asPredicate();
public static void applyParam(AnalyticsValueFacetRequest facet, String param, String value) {
if (isLimit.test(param)) {
getSort(facet).limit = Integer.parseInt(value);
} else if (isOffset.test(param)) {
getSort(facet).offset = Integer.parseInt(value);
} else if (isShowMissing.test(param)) {
facet.expression = FillMissingFunction.name + "(" + facet.expression + ",\"(MISSING)\")";
} else if (isSortExpr.test(param)) {
AnalyticsSortRequest sort = getSort(facet);
AnalyticsExpressionSortRequest criterion;
if (sort.criteria.size() == 0) {
criterion = new AnalyticsExpressionSortRequest();
sort.criteria.add(criterion);
} else {
criterion = (AnalyticsExpressionSortRequest) sort.criteria.get(0);
}
criterion.expression = value;
} else if (isSortDir.test(param)) {
AnalyticsSortRequest sort = getSort(facet);
AnalyticsExpressionSortRequest criterion;
if (sort.criteria.size() == 0) {
criterion = new AnalyticsExpressionSortRequest();
sort.criteria.add(criterion);
} else {
criterion = (AnalyticsExpressionSortRequest) sort.criteria.get(0);
}
criterion.direction = value;
}
}
public static AnalyticsSortRequest getSort(AnalyticsValueFacetRequest facet) {
if (facet.sort == null) {
facet.sort = new AnalyticsSortRequest();
facet.sort.criteria = new ArrayList<>();
}
return facet.sort;
}
}
public static final String RANGE_FACET = "(?:rf|rangefacet)";
public static final String START = "(?:st|start)";
public static final String END = "(?:e|end)";
public static final String GAP = "(?:g|gap)";
public static final String HARDEND = "(?:he|hardend)";
public static final String INCLUDE_BOUNDARY = "(?:ib|includebound)";
public static final String OTHER_RANGE = "(?:or|otherrange)";
public static class OldRangeFacet {
public String field;
public String start;
public String end;
public String gaps;
public String hardend;
public String[] include;
public String[] others;
}
public static class RangeFacetParamParser {
public static String regexParamList = START + "|" + END + "|" + GAP + "|" + HARDEND + "|" + INCLUDE_BOUNDARY + "|" + OTHER_RANGE;
private static Predicate<String> isStart = Pattern.compile("^" + START + "$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isEnd = Pattern.compile("^" + END + "$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isGap = Pattern.compile("^" + GAP + "$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isHardEnd = Pattern.compile("^" + HARDEND + "$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isTrue = Pattern.compile("^t|true$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isFalse = Pattern.compile("^f|false$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isInclude = Pattern.compile("^" + INCLUDE_BOUNDARY + "$", Pattern.CASE_INSENSITIVE).asPredicate();
private static Predicate<String> isOther = Pattern.compile("^" + OTHER_RANGE + "$", Pattern.CASE_INSENSITIVE).asPredicate();
public static void applyParam(AnalyticsRangeFacetRequest facet, String param, String[] values) {
if (isStart.test(param)) {
facet.start = values[0];
} else if (isEnd.test(param)) {
facet.end = values[0];
} else if (isGap.test(param)) {
facet.gaps = Arrays.asList(values[0].split(","));
} else if (isHardEnd.test(param)) {
if (isTrue.test(values[0])) {
facet.hardend = true;
} else if (isFalse.test(values[0])) {
facet.hardend = false;
}
} else if (isInclude.test(param)) {
facet.include = Arrays.asList(values);
} else if (isOther.test(param)) {
facet.others = Arrays.asList(values);
}
}
}
public static class OldQueryFacet {
public String name;
public String[] queries;
}
public static final String QUERY_FACET = "(?:qf|queryfacet)";
public static final String QUERY = "(?:q|query)";
//Defaults
public static final boolean DEFAULT_ABBREVIATE_PREFIX = true;
}