/* * 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.queries.function.valuesource; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.queries.function.FunctionValues; import org.apache.lucene.queries.function.ValueSource; import org.apache.lucene.util.BytesRefBuilder; import java.io.IOException; import java.util.List; import java.util.Map; /** * {@link ValueSource} implementation which only returns the values from the provided * ValueSources which are available for a particular docId. Consequently, when combined * with a {@link ConstValueSource}, this function serves as a way to return a default * value when the values for a field are unavailable. */ public class DefFunction extends MultiFunction { public DefFunction(List<ValueSource> sources) { super(sources); } @Override protected String name() { return "def"; } @Override public FunctionValues getValues(Map fcontext, LeafReaderContext readerContext) throws IOException { return new Values(valsArr(sources, fcontext, readerContext)) { final int upto = valsArr.length - 1; private FunctionValues get(int doc) throws IOException { for (int i=0; i<upto; i++) { FunctionValues vals = valsArr[i]; if (vals.exists(doc)) { return vals; } } return valsArr[upto]; } @Override public byte byteVal(int doc) throws IOException { return get(doc).byteVal(doc); } @Override public short shortVal(int doc) throws IOException { return get(doc).shortVal(doc); } @Override public float floatVal(int doc) throws IOException { return get(doc).floatVal(doc); } @Override public int intVal(int doc) throws IOException { return get(doc).intVal(doc); } @Override public long longVal(int doc) throws IOException { return get(doc).longVal(doc); } @Override public double doubleVal(int doc) throws IOException { return get(doc).doubleVal(doc); } @Override public String strVal(int doc) throws IOException { return get(doc).strVal(doc); } @Override public boolean boolVal(int doc) throws IOException { return get(doc).boolVal(doc); } @Override public boolean bytesVal(int doc, BytesRefBuilder target) throws IOException { return get(doc).bytesVal(doc, target); } @Override public Object objectVal(int doc) throws IOException { return get(doc).objectVal(doc); } @Override public boolean exists(int doc) throws IOException { // return true if any source is exists? for (FunctionValues vals : valsArr) { if (vals.exists(doc)) { return true; } } return false; } @Override public ValueFiller getValueFiller() { // TODO: need ValueSource.type() to determine correct type return super.getValueFiller(); } }; } }