From e21f3cfd6e2f5f421866e109969d51872bcc8261 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Sat, 16 Jun 2007 20:01:03 +0000 Subject: [PATCH] Changing: DocumentBuilder.toDocument(SolrDocument) function so it does not unnecessarily make an extra Map and List and does not call functions for stuff it can easily do internally. This is not intended as a final implementation; it is better then the existing one, but still needs work. http://www.nabble.com/Re%3A-svn-commit%3A-r547493---in--lucene-solr-trunk%3A-.--src-java-org-apache-solr-common--src-java-org-apache-solr-schema--src-java-org-apache-solr-update--src-test-org-apache-solr-common--tf3931539.html git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@547973 13f79535-47bb-0310-9956-ffa450edef68 --- .../solr/handler/UpdateRequestProcessor.java | 4 +- .../apache/solr/update/DocumentBuilder.java | 78 +++++++++++++------ 2 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/java/org/apache/solr/handler/UpdateRequestProcessor.java b/src/java/org/apache/solr/handler/UpdateRequestProcessor.java index 60b00f1843d..9ccd1556f86 100644 --- a/src/java/org/apache/solr/handler/UpdateRequestProcessor.java +++ b/src/java/org/apache/solr/handler/UpdateRequestProcessor.java @@ -55,7 +55,6 @@ public class UpdateRequestProcessor protected final SolrCore core; protected final IndexSchema schema; protected final UpdateHandler updateHandler; - protected final DocumentBuilder builder; protected final SchemaField uniqueKeyField; protected final long startTime; protected final NamedList response; @@ -67,7 +66,6 @@ public class UpdateRequestProcessor core = req.getCore(); schema = core.getSchema(); updateHandler = core.getUpdateHandler(); - builder = new DocumentBuilder( schema ); uniqueKeyField = schema.getUniqueKeyField(); startTime = System.currentTimeMillis(); @@ -126,7 +124,7 @@ public class UpdateRequestProcessor if (uniqueKeyField != null) { id = doc.getFieldValue( uniqueKeyField.getName() ); } - cmd.doc = builder.build( doc ); + cmd.doc = DocumentBuilder.toDocument( doc, schema ); updateHandler.addDoc(cmd); response.add( "added", id ); diff --git a/src/java/org/apache/solr/update/DocumentBuilder.java b/src/java/org/apache/solr/update/DocumentBuilder.java index 82cab3380d4..3e4e6c3cd8f 100644 --- a/src/java/org/apache/solr/update/DocumentBuilder.java +++ b/src/java/org/apache/solr/update/DocumentBuilder.java @@ -18,6 +18,7 @@ package org.apache.solr.update; import java.util.ArrayList; +import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -152,42 +153,75 @@ public class DocumentBuilder { return ret; } - /** - * Build a lucene document from a SolrInputDocument + + /** + * Convert a SolrInputDocument to a lucene Document. + * + * This function shoould go elsewhere. This builds the Document without an + * extra Map<> checking for multiple values. For more discussion, see: + * http://www.nabble.com/Re%3A-svn-commit%3A-r547493---in--lucene-solr-trunk%3A-.--src-java-org-apache-solr-common--src-java-org-apache-solr-schema--src-java-org-apache-solr-update--src-test-org-apache-solr-common--tf3931539.html + * + * TODO: /!\ NOTE /!\ This semantics of this function are still in flux. + * Something somewhere needs to be able to fill up a SolrDocument from + * a lucene document - this is one place that may happen. It may also be + * moved to an independent function * * @since solr 1.3 */ - public Document build( SolrInputDocument doc ) - { - this.startDoc(); + public static Document toDocument( SolrInputDocument doc, IndexSchema schema ) + { + Document out = new Document(); + // Load fields from SolrDocument to Document for( String name : doc.getFieldNames() ) { - Float boost = doc.getBoost( name ); - if( boost == null ) { - boost = new Float( 1 ); + SchemaField sfield = schema.getField(name); + Float b = doc.getBoost( name ); + float boost = (b==null) ? 1.0f : b.floatValue(); + + // Make sure it has the correct number + Collection vals = doc.getFieldValues( name ); + if( vals.size() > 1 && !sfield.multiValued() ) { + throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, + "ERROR: multiple values encountered for non multiValued field " + + sfield.getName() + ": " +vals.toString() ); } - for( Object v : doc.getFieldValues( name ) ) { - if( v instanceof Date ) { - // Make sure to format dates - SchemaField sfield = schema.getField(name); - if( sfield.getType() instanceof DateField ) { - DateField df = (DateField)sfield.getType(); - this.addField( name, df.toInternal( (Date)v )+'Z', boost ); - continue; - } + // load each field value + for( Object v : vals ) { + String val = null; + if( v instanceof Date && sfield.getType() instanceof DateField ) { + DateField df = (DateField)sfield.getType(); + val = df.toInternal( (Date)v )+'Z'; + } + else if (v != null) { + val = v.toString(); + } + out.add( sfield.createField( val, boost ) ); + } + } + + // Now validate required fields or add default values + // fields with default values are defacto 'required' + for (SchemaField field : schema.getRequiredFields()) { + if (out.getField(field.getName() ) == null) { + if (field.getDefaultValue() != null) { + out.add( field.createField( field.getDefaultValue(), 1.0f ) ); + } + else { + String id = schema.printableUniqueKey( out ); + String msg = "Document ["+id+"] missing required field: " + field.getName(); + throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, msg ); } - this.addField( name, v==null ? null : v.toString(), boost ); } } // set the full document boost - Document luceneDoc = this.getDoc(); if( doc.getBoost( null ) != null ) { - luceneDoc.setBoost( doc.getBoost( null ) ); - } - return luceneDoc; + out.setBoost( doc.getBoost( null ) ); + } + return out; } + /** * Add fields from the solr document