org.apache.solr.update.processor.DocBasedVersionConstraintsProcessorFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of solr-core Show documentation
Show all versions of solr-core Show documentation
Apache Solr (module: core)
/*
* 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.update.processor;
import static org.apache.solr.common.SolrException.ErrorCode.SERVER_ERROR;
import java.lang.invoke.MethodHandles;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.core.SolrCore;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.schema.IndexSchema;
import org.apache.solr.schema.SchemaField;
import org.apache.solr.util.plugin.SolrCoreAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This Factory generates an UpdateProcessor that helps to enforce Version constraints on documents
* based on per-document version numbers using a configured versionField
, a
* comma-delimited list of fields to check for version numbers. It should be configured on the
* "default" update processor somewhere before the DistributedUpdateProcessorFactory. As an example,
* see the solrconfig.xml that the tests use:
* solr/core/src/test-files/solr/collection1/conf/solrconfig-externalversionconstraint.xml
*
* When documents are added through this processor, if a document with the same unique key
* already exists in the collection, then the values within the fields as specified by the
* comma-delimited versionField
property are checked, and if in the existing
* document the values for all fields are not less than the field values in the new document,
* then the new document is rejected with a 409 Version Conflict error.
*
*
In addition to the mandatory versionField
init param, two additional optional
* init params affect the behavior of this factory:
*
*
* deleteVersionParam
- This string parameter controls whether this processor
* will intercept and inspect Delete By Id commands in addition to adding documents. If
* specified, then the value will specify the name(s) of the request parameter(s) which
* becomes mandatory for all Delete By Id commands. Like versionField
,
* deleteVersionParam
is comma-delimited. For each of the params given, it specifies
* the document version associated with the delete, where the index matches versionField
*
. For example, if versionField
was set to 'a,b' and
* deleteVersionParam
was set to 'p1,p2', p1 should give the version for field 'a' and
* p2 should give the version for field 'b'. If the versions specified using these params are
* not greater then the value in the versionField
for any existing document, then
* the delete will fail with a 409 Version Conflict error. When using this param, Any Delete
* By Id command with a high enough document version number to succeed will be internally
* converted into an Add Document command that replaces the existing document with a new one
* which is empty except for the Unique Key and fields corresponding to the fields listed in
* versionField
to keeping a record of the deleted version so future Add Document
* commands will fail if their "new" version is not high enough.
* ignoreOldUpdates
- This boolean parameter defaults to false
, but
* if set to true
causes any update with a document version that is not great
* enough to be silently ignored (and return a status 200 to the client) instead of generating
* a 409 Version Conflict error.
* supportMissingVersionOnOldDocs
- This boolean parameter defaults to
* false
, but if set to true
allows any documents written *before* this
* feature is enabled and which are missing the versionField to be overwritten.
* tombstoneConfig
- a list of field names to values to add to the created
* tombstone document. In general is not a good idea to populate tombsone documents with
* anything other than the minimum required fields so that it doean't match queries
*
*
* @since 4.6.0
*/
public class DocBasedVersionConstraintsProcessorFactory extends UpdateRequestProcessorFactory
implements SolrCoreAware, UpdateRequestProcessorFactory.RunAlways {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private boolean ignoreOldUpdates = false;
private List versionFields = null;
private List deleteVersionParamNames = Collections.emptyList();
private boolean useFieldCache;
private boolean supportMissingVersionOnOldDocs = false;
private NamedList