blob: ac2f50a297185c815b64b3264829343081c671fe [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.usergrid.persistence.index.impl;
import java.util.Set;
import java.util.UUID;
import org.apache.usergrid.persistence.model.entity.SimpleId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.usergrid.persistence.core.scope.ApplicationScope;
import org.apache.usergrid.persistence.core.util.ValidationUtils;
import org.apache.usergrid.persistence.index.CandidateResult;
import org.apache.usergrid.persistence.index.EntityIndex;
import org.apache.usergrid.persistence.index.EntityIndexBatch;
import org.apache.usergrid.persistence.index.IndexAlias;
import org.apache.usergrid.persistence.index.IndexEdge;
import org.apache.usergrid.persistence.index.IndexLocationStrategy;
import org.apache.usergrid.persistence.index.SearchEdge;
import org.apache.usergrid.persistence.index.utils.IndexValidationUtils;
import org.apache.usergrid.persistence.model.entity.Entity;
import org.apache.usergrid.persistence.model.entity.Id;
import com.google.common.base.Optional;
public class EsEntityIndexBatchImpl implements EntityIndexBatch {
private static final Logger logger = LoggerFactory.getLogger( EsEntityIndexBatchImpl.class );
private final IndexAlias alias;
private final IndexLocationStrategy indexLocationStrategy;
private final EntityIndex entityIndex;
private final ApplicationScope applicationScope;
private IndexOperationMessage container;
public EsEntityIndexBatchImpl( final IndexLocationStrategy locationStrategy,
final EntityIndex entityIndex
) {
this.indexLocationStrategy = locationStrategy;
this.entityIndex = entityIndex;
this.applicationScope = indexLocationStrategy.getApplicationScope();
this.alias = indexLocationStrategy.getAlias();
//constrained
this.container = new IndexOperationMessage();
}
@Override
public EntityIndexBatch index( final IndexEdge indexEdge, final Entity entity ) {
return index( indexEdge,entity, Optional.absent() );
}
@Override
public EntityIndexBatch index( final IndexEdge indexEdge, final Entity entity, final Optional<Set<String>> fieldsToIndex ) {
IndexValidationUtils.validateIndexEdge(indexEdge);
ValidationUtils.verifyEntityWrite(entity);
ValidationUtils.verifyVersion( entity.getVersion() );
final String writeAlias = alias.getWriteAlias();
if ( logger.isDebugEnabled() ) {
logger.debug( "Indexing to alias {} with scope {} on edge {} with entity data {}",
writeAlias, applicationScope, indexEdge, entity.getFieldMap().keySet() );
}
//add app id for indexing
container.addIndexRequest(new IndexOperation(writeAlias, applicationScope,
new IndexEdgeImpl(indexEdge, false),
new Entity(entity, false),fieldsToIndex));
return this;
}
@Override
public EntityIndexBatch deindex( final SearchEdge searchEdge, final Id id, final UUID version ) {
IndexValidationUtils.validateSearchEdge(searchEdge);
ValidationUtils.verifyIdentity(id);
ValidationUtils.verifyVersion( version );
String[] indexes = entityIndex.getIndexes();
//get the default index if no alias exists yet
if ( indexes == null || indexes.length == 0 ) {
throw new IllegalStateException("No indexes exist for " + indexLocationStrategy.getAlias().getWriteAlias());
}
if ( logger.isDebugEnabled() ) {
logger.debug( "Deindexing to indexes {} with scope {} on edge {} with id {} and version {} ",
indexes, applicationScope, searchEdge, id, version );
}
container.addDeIndexRequest(new DeIndexOperation(indexes, applicationScope,
new SearchEdgeImpl(searchEdge, false),
new SimpleId(id, false), version));
return this;
}
public EntityIndexBatch deindexWithDocId( final String docId ) {
String[] indexes = entityIndex.getIndexes();
//get the default index if no alias exists yet
if ( indexes == null || indexes.length == 0 ) {
throw new IllegalStateException("No indexes exist for " + indexLocationStrategy.getAlias().getWriteAlias());
}
if ( logger.isDebugEnabled() ) {
logger.debug( "Deindexing to indexes {} with with documentId {} ",
indexes, docId );
}
container.addDeIndexRequest( new DeIndexOperation( indexes, docId ) );
return this;
}
@Override
public EntityIndexBatch deindex( final SearchEdge searchEdge, final Entity entity ) {
return deindex( searchEdge, entity.getId(), entity.getVersion() );
}
@Override
public EntityIndexBatch deindex(final SearchEdge searchEdge, final CandidateResult entity) {
return deindex( searchEdge, entity.getId(), entity.getVersion() );
}
@Override
public EntityIndexBatch deindex( final CandidateResult entity ) {
return deindexWithDocId(entity.getDocId());
}
@Override
public IndexOperationMessage build() {
return container;
}
@Override
public int size() {
return container.getDeIndexRequests().size() + container.getIndexRequests().size();
}
}