/**
* 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.common;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* @version $Id: SolrInputField.java 600589 2007-12-03 16:35:59Z ryan $
* @since solr 1.3
*/
public class SolrInputField implements Iterable<Object>, Serializable
{
String name;
Object value = null;
float boost = 1.0f;
public SolrInputField( String n )
{
this.name = n;
}
//---------------------------------------------------------------
//---------------------------------------------------------------
/**
* Set the value for a field. Arrays will be converted to a collection.
*/
public void setValue(Object v, float b) {
boost = b;
if( v instanceof Object[] ) {
Object[] arr = (Object[])v;
Collection<Object> c = new ArrayList<Object>( arr.length );
for( Object o : arr ) {
c.add( o );
}
value = c;
}
else {
value = v;
}
}
/**
* Add values to a field. if the added value is a collection, each value
* will be added individually
*/
@SuppressWarnings("unchecked")
public void addValue(Object v, float b) {
if( value == null ) {
setValue(v, b);
return;
}
// The lucene API and solr XML field specification make it possible to set boosts
// on multi-value fields even though lucene indexing does not support this.
// To keep behavior consistent with what happens in the lucene index, we accumulate
// the product of all boosts specified for this field.
boost *= b;
Collection<Object> vals = null;
if( value instanceof Collection ) {
vals = (Collection<Object>)value;
}
else {
vals = new ArrayList<Object>( 3 );
vals.add( value );
value = vals;
}
// Add the new values to a collection
if( v instanceof Iterable ) {
for( Object o : (Iterable<Object>)v ) {
vals.add( o );
}
}
else if( v instanceof Object[] ) {
for( Object o : (Object[])v ) {
vals.add( o );
}
}
else {
vals.add( v );
}
}
//---------------------------------------------------------------
//---------------------------------------------------------------
@SuppressWarnings("unchecked")
public Object getFirstValue() {
if( value instanceof Collection ) {
Collection c = (Collection<Object>)value;
if( c.size() > 0 ) {
return c.iterator().next();
}
return null;
}
return value;
}
/**
* @return the value for this field. If the field has multiple values, this
* will be a collection.
*/
public Object getValue() {
return value;
}
/**
* @return the values for this field. This will return a collection even
* if the field is not multi-valued
*/
@SuppressWarnings("unchecked")
public Collection<Object> getValues() {
if( value instanceof Collection ) {
return (Collection<Object>)value;
}
if( value != null ) {
Collection<Object> vals = new ArrayList<Object>(1);
vals.add( value );
return vals;
}
return null;
}
/**
* @return the number of values for this field
*/
public int getValueCount() {
if( value instanceof Collection ) {
return ((Collection)value).size();
}
return (value == null) ? 0 : 1;
}
//---------------------------------------------------------------
//---------------------------------------------------------------
public float getBoost() {
return boost;
}
public void setBoost(float boost) {
this.boost = boost;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@SuppressWarnings("unchecked")
public Iterator<Object> iterator() {
if( value instanceof Collection ) {
return ((Collection)value).iterator();
}
return new Iterator<Object>() {
boolean nxt = (value!=null);
public boolean hasNext() {
return nxt;
}
public Object next() {
nxt = false;
return value;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@Override
public String toString()
{
return name + "("+boost+")={" + value + "}";
}
}