blob: f823ade770bc88f5dc5ef2c1f6e7c9d1eb762feb [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.common;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
*
* @since solr 1.3
*/
public class SolrInputField implements Iterable<Object>, Serializable
{
String name;
Object value = null;
public SolrInputField( String n )
{
this.name = n;
}
//---------------------------------------------------------------
//---------------------------------------------------------------
/**
* Set the value for a field. Arrays will be converted to a collection. If
* a collection is given, then that collection will be used as the backing
* collection for the values.
*/
public void setValue(Object v) {
if( v instanceof Object[] ) {
Object[] arr = (Object[])v;
Collection<Object> c = new ArrayList<>( 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) {
if( value == null ) {
if ( v instanceof Collection ) {
Collection<Object> c = new ArrayList<>( 3 );
for ( Object o : (Collection<Object>)v ) {
c.add( o );
}
setValue(c);
} else {
setValue(v);
}
return;
}
Collection<Object> vals = null;
if( value instanceof Collection ) {
vals = (Collection<Object>)value;
}
else {
vals = new ArrayList<>( 3 );
vals.add( value );
value = vals;
}
// Add the new values to a collection, if childDoc add as is without iteration
if( v instanceof Iterable && !(v instanceof SolrDocumentBase)) {
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 );
}
}
//---------------------------------------------------------------
//---------------------------------------------------------------
public Object getFirstValue() {
if (value instanceof Collection) {
@SuppressWarnings({"unchecked"})
Collection<Object> 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<>(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 String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
@SuppressWarnings("unchecked")
public Iterator<Object> iterator(){
if( value instanceof Collection ) {
return ((Collection)value).iterator();
}
return new Iterator<Object>() {
boolean nxt = (value!=null);
@Override
public boolean hasNext() {
return nxt;
}
@Override
public Object next() {
nxt = false;
return value;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@Override
public String toString()
{
return name + "=" + value;
}
public SolrInputField deepCopy() {
SolrInputField clone = new SolrInputField(name);
// We can't clone here, so we rely on simple primitives
if (value instanceof Collection) {
@SuppressWarnings({"unchecked"})
Collection<Object> values = (Collection<Object>) value;
Collection<Object> cloneValues = new ArrayList<>(values.size());
cloneValues.addAll(values);
clone.value = cloneValues;
} else {
clone.value = value;
}
return clone;
}
}