All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.solr.analytics.function.mapping.IfFunction Maven / Gradle / Ivy

There is a newer version: 9.7.0
Show newest version
/*
 * 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.function.mapping;

import java.util.function.Consumer;
import java.util.function.DoubleConsumer;
import java.util.function.IntConsumer;
import java.util.function.LongConsumer;

import org.apache.solr.analytics.ExpressionFactory.CreatorFunction;
import org.apache.solr.analytics.util.function.BooleanConsumer;
import org.apache.solr.analytics.util.function.FloatConsumer;
import org.apache.solr.analytics.value.AnalyticsValue;
import org.apache.solr.analytics.value.AnalyticsValueStream;
import org.apache.solr.analytics.value.BooleanValue;
import org.apache.solr.analytics.value.BooleanValueStream;
import org.apache.solr.analytics.value.DateValue;
import org.apache.solr.analytics.value.DateValueStream;
import org.apache.solr.analytics.value.DoubleValue;
import org.apache.solr.analytics.value.DoubleValueStream;
import org.apache.solr.analytics.value.FloatValue;
import org.apache.solr.analytics.value.FloatValueStream;
import org.apache.solr.analytics.value.IntValue;
import org.apache.solr.analytics.value.IntValueStream;
import org.apache.solr.analytics.value.LongValue;
import org.apache.solr.analytics.value.LongValueStream;
import org.apache.solr.analytics.value.StringValue;
import org.apache.solr.analytics.value.StringValueStream;
import org.apache.solr.analytics.value.AnalyticsValue.AbstractAnalyticsValue;
import org.apache.solr.analytics.value.AnalyticsValueStream.AbstractAnalyticsValueStream;
import org.apache.solr.analytics.value.BooleanValue.AbstractBooleanValue;
import org.apache.solr.analytics.value.BooleanValueStream.AbstractBooleanValueStream;
import org.apache.solr.analytics.value.DateValue.AbstractDateValue;
import org.apache.solr.analytics.value.DateValueStream.AbstractDateValueStream;
import org.apache.solr.analytics.value.DoubleValue.AbstractDoubleValue;
import org.apache.solr.analytics.value.DoubleValueStream.AbstractDoubleValueStream;
import org.apache.solr.analytics.value.FloatValue.AbstractFloatValue;
import org.apache.solr.analytics.value.FloatValueStream.AbstractFloatValueStream;
import org.apache.solr.analytics.value.IntValue.AbstractIntValue;
import org.apache.solr.analytics.value.IntValueStream.AbstractIntValueStream;
import org.apache.solr.analytics.value.LongValue.AbstractLongValue;
import org.apache.solr.analytics.value.LongValueStream.AbstractLongValueStream;
import org.apache.solr.analytics.value.StringValue.AbstractStringValue;
import org.apache.solr.analytics.value.StringValueStream.AbstractStringValueStream;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;

/**
 * An if-else mapping function. 
 * 

* Three arguments are required. The first, the conditional parameter, must be a {@link BooleanValue} and * the later two, the if and else parameters, can be any type of {@link AnalyticsValueStream}. * For each document, if the conditional value is true then the if-value is used otherwise the else-value is used. *

* The resulting Value or ValueStream will be typed with the closest super-type of the two non-conditional parameters. * (e.g. {@value #name}(boolean,double,int) will return a double) * If two {@link AnalyticsValue}s are passed as the if-else parameters, an {@link AnalyticsValue} will be returned. * If either parameter isn't single-valued, a {@link AnalyticsValueStream} will be returned. */ public class IfFunction extends AbstractAnalyticsValueStream { private final BooleanValue ifExpr; private final AnalyticsValueStream thenExpr; private final AnalyticsValueStream elseExpr; public static final String name = "if"; private final String exprStr; private final ExpressionType funcType; public static final CreatorFunction creatorFunction = (params -> { if (params.length != 3) { throw new SolrException(ErrorCode.BAD_REQUEST,"The "+name+" function requires 3 paramaters, " + params.length + " found."); } if (!(params[0] instanceof BooleanValue)) { throw new SolrException(ErrorCode.BAD_REQUEST,"The "+name+" function requires single-valued numeric parameters. " + "Incorrect parameter: "+params[0].getExpressionStr()); } BooleanValue castedIf = (BooleanValue) params[0]; AnalyticsValueStream thenExpr = params[1]; AnalyticsValueStream elseExpr = params[2]; if (thenExpr instanceof DateValue && elseExpr instanceof DateValue) { return new DateIfFunction(castedIf,(DateValue)thenExpr,(DateValue)elseExpr); } if (thenExpr instanceof DateValueStream && elseExpr instanceof DateValueStream) { return new DateStreamIfFunction(castedIf,(DateValueStream)thenExpr,(DateValueStream)elseExpr); } if (thenExpr instanceof BooleanValue && elseExpr instanceof BooleanValue) { return new BooleanIfFunction(castedIf,(BooleanValue)thenExpr,(BooleanValue)elseExpr); } if (thenExpr instanceof BooleanValueStream && elseExpr instanceof BooleanValueStream) { return new BooleanStreamIfFunction(castedIf,(BooleanValueStream)thenExpr,(BooleanValueStream)elseExpr); } if (thenExpr instanceof IntValue && elseExpr instanceof IntValue) { return new IntIfFunction(castedIf,(IntValue)thenExpr,(IntValue)elseExpr); } if (thenExpr instanceof IntValueStream && elseExpr instanceof IntValueStream) { return new IntStreamIfFunction(castedIf,(IntValueStream)thenExpr,(IntValueStream)elseExpr); } if (thenExpr instanceof LongValue && elseExpr instanceof LongValue) { return new LongIfFunction(castedIf,(LongValue)thenExpr,(LongValue)elseExpr); } if (thenExpr instanceof LongValueStream && elseExpr instanceof LongValueStream) { return new LongStreamIfFunction(castedIf,(LongValueStream)thenExpr,(LongValueStream)elseExpr); } if (thenExpr instanceof FloatValue && elseExpr instanceof FloatValue) { return new FloatIfFunction(castedIf,(FloatValue)thenExpr,(FloatValue)elseExpr); } if (thenExpr instanceof FloatValueStream && elseExpr instanceof FloatValueStream) { return new FloatStreamIfFunction(castedIf,(FloatValueStream)thenExpr,(FloatValueStream)elseExpr); } if (thenExpr instanceof DoubleValue && elseExpr instanceof DoubleValue) { return new DoubleIfFunction(castedIf,(DoubleValue)thenExpr,(DoubleValue)elseExpr); } if (thenExpr instanceof DoubleValueStream && elseExpr instanceof DoubleValueStream) { return new DoubleStreamIfFunction(castedIf,(DoubleValueStream)thenExpr,(DoubleValueStream)elseExpr); } if (thenExpr instanceof StringValue && elseExpr instanceof StringValue) { return new StringIfFunction(castedIf,(StringValue)thenExpr,(StringValue)elseExpr); } if (thenExpr instanceof StringValueStream && elseExpr instanceof StringValueStream) { return new StringStreamIfFunction(castedIf,(StringValueStream)thenExpr,(StringValueStream)elseExpr); } if (thenExpr instanceof AnalyticsValue && elseExpr instanceof AnalyticsValue) { return new ValueIfFunction(castedIf,(AnalyticsValue)thenExpr,(AnalyticsValue)elseExpr); } return new IfFunction(castedIf,thenExpr,elseExpr); }); public IfFunction(BooleanValue ifExpr, AnalyticsValueStream thenExpr, AnalyticsValueStream elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } @Override public void streamObjects(Consumer cons) { boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { thenExpr.streamObjects(cons); } else { elseExpr.streamObjects(cons); } } } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class ValueIfFunction extends AbstractAnalyticsValue { private final BooleanValue ifExpr; private final AnalyticsValue thenExpr; private final AnalyticsValue elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public ValueIfFunction(BooleanValue ifExpr, AnalyticsValue thenExpr, AnalyticsValue elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } private boolean exists = false; @Override public Object getObject() { exists = false; Object value = null; boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { value = thenExpr.getObject(); exists = thenExpr.exists(); } else { value = elseExpr.getObject(); exists = elseExpr.exists(); } } return value; } @Override public boolean exists() { return exists; } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class BooleanStreamIfFunction extends AbstractBooleanValueStream { private final BooleanValue ifExpr; private final BooleanValueStream thenExpr; private final BooleanValueStream elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public BooleanStreamIfFunction(BooleanValue ifExpr, BooleanValueStream thenExpr, BooleanValueStream elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } @Override public void streamBooleans(BooleanConsumer cons) { boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { thenExpr.streamBooleans(cons); } else { elseExpr.streamBooleans(cons); } } } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class BooleanIfFunction extends AbstractBooleanValue { private final BooleanValue ifExpr; private final BooleanValue thenExpr; private final BooleanValue elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public BooleanIfFunction(BooleanValue ifExpr, BooleanValue thenExpr, BooleanValue elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } private boolean exists = false; @Override public boolean getBoolean() { exists = false; boolean value = false; boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { value = thenExpr.getBoolean(); exists = thenExpr.exists(); } else { value = elseExpr.getBoolean(); exists = elseExpr.exists(); } } return value; } @Override public boolean exists() { return exists; } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class IntStreamIfFunction extends AbstractIntValueStream { private final BooleanValue ifExpr; private final IntValueStream thenExpr; private final IntValueStream elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public IntStreamIfFunction(BooleanValue ifExpr, IntValueStream thenExpr, IntValueStream elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } @Override public void streamInts(IntConsumer cons) { boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { thenExpr.streamInts(cons); } else { elseExpr.streamInts(cons); } } } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class IntIfFunction extends AbstractIntValue { private final BooleanValue ifExpr; private final IntValue thenExpr; private final IntValue elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public IntIfFunction(BooleanValue ifExpr, IntValue thenExpr, IntValue elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } private boolean exists = false; @Override public int getInt() { exists = false; int value = 0; boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { value = thenExpr.getInt(); exists = thenExpr.exists(); } else { value = elseExpr.getInt(); exists = elseExpr.exists(); } } return value; } @Override public boolean exists() { return exists; } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class LongStreamIfFunction extends AbstractLongValueStream { private final BooleanValue ifExpr; private final LongValueStream thenExpr; private final LongValueStream elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public LongStreamIfFunction(BooleanValue ifExpr, LongValueStream thenExpr, LongValueStream elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } @Override public void streamLongs(LongConsumer cons) { boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { thenExpr.streamLongs(cons); } else { elseExpr.streamLongs(cons); } } } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class LongIfFunction extends AbstractLongValue { private final BooleanValue ifExpr; private final LongValue thenExpr; private final LongValue elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public LongIfFunction(BooleanValue ifExpr, LongValue thenExpr, LongValue elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } private boolean exists = false; @Override public long getLong() { exists = false; long value = 0; boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { value = thenExpr.getLong(); exists = thenExpr.exists(); } else { value = elseExpr.getLong(); exists = elseExpr.exists(); } } return value; } @Override public boolean exists() { return exists; } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class FloatStreamIfFunction extends AbstractFloatValueStream { private final BooleanValue ifExpr; private final FloatValueStream thenExpr; private final FloatValueStream elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public FloatStreamIfFunction(BooleanValue ifExpr, FloatValueStream thenExpr, FloatValueStream elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } @Override public void streamFloats(FloatConsumer cons) { boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { thenExpr.streamFloats(cons); } else { elseExpr.streamFloats(cons); } } } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class FloatIfFunction extends AbstractFloatValue { private final BooleanValue ifExpr; private final FloatValue thenExpr; private final FloatValue elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public FloatIfFunction(BooleanValue ifExpr, FloatValue thenExpr, FloatValue elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } private boolean exists = false; @Override public float getFloat() { exists = false; float value = 0; boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { value = thenExpr.getFloat(); exists = thenExpr.exists(); } else { value = elseExpr.getFloat(); exists = elseExpr.exists(); } } return value; } @Override public boolean exists() { return exists; } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class DoubleStreamIfFunction extends AbstractDoubleValueStream { private final BooleanValue ifExpr; private final DoubleValueStream thenExpr; private final DoubleValueStream elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public DoubleStreamIfFunction(BooleanValue ifExpr, DoubleValueStream thenExpr, DoubleValueStream elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } @Override public void streamDoubles(DoubleConsumer cons) { boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { thenExpr.streamDoubles(cons); } else { elseExpr.streamDoubles(cons); } } } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class DoubleIfFunction extends AbstractDoubleValue { private final BooleanValue ifExpr; private final DoubleValue thenExpr; private final DoubleValue elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public DoubleIfFunction(BooleanValue ifExpr, DoubleValue thenExpr, DoubleValue elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } private boolean exists = false; @Override public double getDouble() { exists = false; double value = 0; boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { value = thenExpr.getDouble(); exists = thenExpr.exists(); } else { value = elseExpr.getDouble(); exists = elseExpr.exists(); } } return value; } @Override public boolean exists() { return exists; } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class DateStreamIfFunction extends AbstractDateValueStream { private final BooleanValue ifExpr; private final DateValueStream thenExpr; private final DateValueStream elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public DateStreamIfFunction(BooleanValue ifExpr, DateValueStream thenExpr, DateValueStream elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } @Override public void streamLongs(LongConsumer cons) { boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { thenExpr.streamLongs(cons); } else { elseExpr.streamLongs(cons); } } } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class DateIfFunction extends AbstractDateValue { private final BooleanValue ifExpr; private final DateValue thenExpr; private final DateValue elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public DateIfFunction(BooleanValue ifExpr, DateValue thenExpr, DateValue elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } private boolean exists = false; @Override public long getLong() { exists = false; long value = 0; boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { value = thenExpr.getLong(); exists = thenExpr.exists(); } else { value = elseExpr.getLong(); exists = elseExpr.exists(); } } return value; } @Override public boolean exists() { return exists; } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class StringStreamIfFunction extends AbstractStringValueStream { private final BooleanValue ifExpr; private final StringValueStream thenExpr; private final StringValueStream elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public StringStreamIfFunction(BooleanValue ifExpr, StringValueStream thenExpr, StringValueStream elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } @Override public void streamStrings(Consumer cons) { boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { thenExpr.streamStrings(cons); } else { elseExpr.streamStrings(cons); } } } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } } class StringIfFunction extends AbstractStringValue { private final BooleanValue ifExpr; private final StringValue thenExpr; private final StringValue elseExpr; public static final String name = IfFunction.name; private final String exprStr; private final ExpressionType funcType; public StringIfFunction(BooleanValue ifExpr, StringValue thenExpr, StringValue elseExpr) throws SolrException { this.ifExpr = ifExpr; this.thenExpr = thenExpr; this.elseExpr = elseExpr; this.exprStr = AnalyticsValueStream.createExpressionString(name,ifExpr,thenExpr,elseExpr); this.funcType = AnalyticsValueStream.determineMappingPhase(exprStr,ifExpr,thenExpr,elseExpr); } private boolean exists = false; @Override public String getString() { exists = false; String value = null; boolean ifValue = ifExpr.getBoolean(); if (ifExpr.exists()) { if (ifValue) { value = thenExpr.getString(); exists = thenExpr.exists(); } else { value = elseExpr.getString(); exists = elseExpr.exists(); } } return value; } @Override public boolean exists() { return exists; } @Override public String getName() { return name; } @Override public String getExpressionStr() { return exprStr; } @Override public ExpressionType getExpressionType() { return funcType; } }