/* * 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.lucene.queryparser.flexible.standard.nodes; import org.apache.lucene.queryparser.flexible.core.QueryNodeException; import org.apache.lucene.queryparser.flexible.standard.config.PointsConfig; /** * This query node represents a range query composed by {@link PointQueryNode} * bounds, which means the bound values are {@link Number}s. * * @see PointQueryNode * @see AbstractRangeQueryNode */ public class PointRangeQueryNode extends AbstractRangeQueryNode<PointQueryNode> { public PointsConfig numericConfig; /** * Constructs a {@link PointRangeQueryNode} object using the given * {@link PointQueryNode} as its bounds and {@link PointsConfig}. * * @param lower the lower bound * @param upper the upper bound * @param lowerInclusive <code>true</code> if the lower bound is inclusive, otherwise, <code>false</code> * @param upperInclusive <code>true</code> if the upper bound is inclusive, otherwise, <code>false</code> * @param numericConfig the {@link PointsConfig} that represents associated with the upper and lower bounds * * @see #setBounds(PointQueryNode, PointQueryNode, boolean, boolean, PointsConfig) */ public PointRangeQueryNode(PointQueryNode lower, PointQueryNode upper, boolean lowerInclusive, boolean upperInclusive, PointsConfig numericConfig) throws QueryNodeException { setBounds(lower, upper, lowerInclusive, upperInclusive, numericConfig); } /** * Sets the upper and lower bounds of this range query node and the * {@link PointsConfig} associated with these bounds. * * @param lower the lower bound * @param upper the upper bound * @param lowerInclusive <code>true</code> if the lower bound is inclusive, otherwise, <code>false</code> * @param upperInclusive <code>true</code> if the upper bound is inclusive, otherwise, <code>false</code> * @param pointsConfig the {@link PointsConfig} that represents associated with the upper and lower bounds * */ public void setBounds(PointQueryNode lower, PointQueryNode upper, boolean lowerInclusive, boolean upperInclusive, PointsConfig pointsConfig) throws QueryNodeException { if (pointsConfig == null) { throw new IllegalArgumentException("pointsConfig must not be null!"); } Class<? extends Number> lowerNumberType, upperNumberType; if (lower != null && lower.getValue() != null) { lowerNumberType = lower.getValue().getClass(); } else { lowerNumberType = null; } if (upper != null && upper.getValue() != null) { upperNumberType = upper.getValue().getClass(); } else { upperNumberType = null; } if (lowerNumberType != null && !lowerNumberType.equals(pointsConfig.getType())) { throw new IllegalArgumentException( "lower value's type should be the same as numericConfig type: " + lowerNumberType + " != " + pointsConfig.getType()); } if (upperNumberType != null && !upperNumberType.equals(pointsConfig.getType())) { throw new IllegalArgumentException( "upper value's type should be the same as numericConfig type: " + upperNumberType + " != " + pointsConfig.getType()); } super.setBounds(lower, upper, lowerInclusive, upperInclusive); this.numericConfig = pointsConfig; } /** * Returns the {@link PointsConfig} associated with the lower and upper bounds. * * @return the {@link PointsConfig} associated with the lower and upper bounds */ public PointsConfig getPointsConfig() { return this.numericConfig; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("<pointRange lowerInclusive='"); sb.append(isLowerInclusive()); sb.append("' upperInclusive='"); sb.append(isUpperInclusive()); sb.append("' type='"); sb.append(numericConfig.getType().getSimpleName()); sb.append("'>\n"); sb.append(getLowerBound()).append('\n'); sb.append(getUpperBound()).append('\n'); sb.append("</pointRange>"); return sb.toString(); } }