
net.oneandone.troilus.DeleteQuery Maven / Gradle / Ivy
/*
* Copyright 1&1 Internet AG, https://github.com/1and1/
*
* Licensed 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 net.oneandone.troilus;
import java.util.Set;
import net.oneandone.troilus.interceptor.DeleteQueryData;
import net.oneandone.troilus.java7.Deletion;
import net.oneandone.troilus.java7.Batchable;
import net.oneandone.troilus.java7.interceptor.CascadeOnDeleteInterceptor;
import net.oneandone.troilus.java7.interceptor.DeleteQueryRequestInterceptor;
import com.datastax.driver.core.querybuilder.Clause;
import com.datastax.driver.core.Statement;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
/**
* delete query implementation
*/
class DeleteQuery extends MutationQuery implements Deletion {
private final DeleteQueryData data;
/**
* @param ctx the context
* @param data the data
*/
DeleteQuery(Context ctx, DeleteQueryData data) {
super(ctx);
this.data = data;
}
////////////////////
// factory methods
@Override
protected DeleteQuery newQuery(Context newContext) {
return new DeleteQuery(newContext, data);
}
private DeleteQuery newQuery(DeleteQueryData data) {
return new DeleteQuery(getContext(), data);
}
//
////////////////////
@Override
public BatchMutationQuery combinedWith(Batchable> other) {
return new BatchMutationQuery(getContext(), this, other);
}
@Override
public DeleteQuery onlyIf(Clause... onlyIfConditions) {
return newQuery(data.onlyIfConditions(ImmutableList.copyOf(onlyIfConditions)));
}
@Override
public DeleteQuery ifExists() {
return newQuery(data.ifExists(true));
}
@Override
public ListenableFuture executeAsync() {
ListenableFuture future = super.executeAsync();
Function validateOnlyIfFunction = new Function() {
@Override
public Result apply(Result result) {
if (!data.getOnlyIfConditions().isEmpty() && !result.wasApplied()) {
throw new IfConditionException(result, "if condition does not match");
}
return result;
}
};
return Futures.transform(future, validateOnlyIfFunction);
}
@Override
public ListenableFuture getStatementAsync() {
// perform request executors
ListenableFuture queryDataFuture = executeRequestInterceptorsAsync(Futures.immediateFuture(data));
// query data to statement
Function> queryDataToStatement = new Function>() {
@Override
public ListenableFuture apply(DeleteQueryData queryData) {
if (queryData == null) {
throw new NullPointerException();
}
return DeleteQueryDataImpl.toStatementAsync(queryData, getContext());
}
};
ListenableFuture statementFuture = ListenableFutures.transform(queryDataFuture, queryDataToStatement, getContext().getTaskExecutor());
if (getContext().getInterceptorRegistry().getInterceptors(CascadeOnDeleteInterceptor.class).isEmpty()) {
return statementFuture;
// cascading statements
} else {
ListenableFuture> cascadingStatmentsFuture = executeCascadeInterceptorsAsync(queryDataFuture);
return mergeStatements(statementFuture, cascadingStatmentsFuture);
}
}
private ListenableFuture executeRequestInterceptorsAsync(ListenableFuture queryDataFuture) {
for (DeleteQueryRequestInterceptor interceptor : getContext().getInterceptorRegistry().getInterceptors(DeleteQueryRequestInterceptor.class).reverse()) {
final DeleteQueryRequestInterceptor icptor = interceptor;
Function> mapperFunction = new Function>() {
@Override
public ListenableFuture apply(DeleteQueryData queryData) {
return icptor.onDeleteRequestAsync(queryData);
}
};
// running interceptors within dedicated threads!
queryDataFuture = ListenableFutures.transform(queryDataFuture, mapperFunction, getContext().getTaskExecutor());
}
return queryDataFuture;
}
private ListenableFuture> executeCascadeInterceptorsAsync(ListenableFuture queryDataFuture) {
Set>> statmentFutures = Sets.newHashSet();
for (CascadeOnDeleteInterceptor interceptor : getContext().getInterceptorRegistry().getInterceptors(CascadeOnDeleteInterceptor.class).reverse()) {
final CascadeOnDeleteInterceptor icptor = interceptor;
Function>>> querydataToBatchables = new Function>>>() {
@Override
public ListenableFuture>> apply(DeleteQueryData queryData) {
return icptor.onDeleteAsync(queryData);
}
};
ListenableFuture>> batchablesFutureSet = ListenableFutures.transform(queryDataFuture, querydataToBatchables);
ListenableFuture> flattenStatementFutureSet = transformBatchablesToStatement(batchablesFutureSet);
statmentFutures.add(flattenStatementFutureSet);
}
// running interceptors within dedicated threads!
return ListenableFutures.flat(ImmutableSet.copyOf(statmentFutures), getContext().getTaskExecutor());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy