/**
* Copyright 2010 Molindo GmbH
*
* 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 at.molindo.esi4j.chain.impl;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import org.elasticsearch.action.update.UpdateRequest;
import org.junit.Test;
import at.molindo.esi4j.chain.Esi4JEntityResolver;
import at.molindo.esi4j.chain.Esi4JEntityTask;
import at.molindo.esi4j.chain.impl.QueuedTaskExecutor.ObjectKeyListMap;
import at.molindo.esi4j.ex.EntityNotResolveableException;
import at.molindo.esi4j.mapping.ObjectKey;
import at.molindo.utils.collections.CollectionUtils;
public class QueuedTaskExecutorTest {
@Test
public void resolveDuplicates() {
final Esi4JEntityTask[] tasks = new TasksBuilder().index("foo").update("foo").delete("foo").tasks();
assertEquals(3, tasks.length);
assertNotNull(tasks[0]);
assertNotNull(tasks[1]);
assertNotNull(tasks[2]);
final QueuedTaskExecutor.ObjectKeyListMap map = toMap(tasks);
assertEquals(1, map.size());
assertEquals(3, CollectionUtils.firstValue(map).size());
QueuedTaskExecutor.resolveDuplicates(tasks, map);
assertEquals(1, CollectionUtils.firstValue(map).size());
assertNull(tasks[0]);
assertNull(tasks[1]);
assertNotNull(tasks[2]);
}
private ObjectKeyListMap toMap(final Esi4JEntityTask[] tasks) {
final ObjectKeyListMap map = new QueuedTaskExecutor.ObjectKeyListMap(tasks.length);
final StringEntityResolver resolver = new StringEntityResolver();
for (int i = 0; i < tasks.length; i++) {
final Esi4JEntityTask task = tasks[i];
map.add(task.toObjectKey(resolver), i);
}
return map;
}
private static class StringEntityResolver implements Esi4JEntityResolver {
@Override
public ObjectKey toObjectKey(final Object entity) {
return new ObjectKey(String.class, (String) entity);
}
@Override
public Object replaceEntity(final Object entity) {
return toObjectKey(entity);
}
@Override
public Object resolveEntity(final Object replacedEntity) throws EntityNotResolveableException {
if (replacedEntity instanceof String) {
return replacedEntity;
} else {
return ((ObjectKey) replacedEntity).getId();
}
}
}
private static class TasksBuilder {
private final List<Esi4JEntityTask> _tasks = new ArrayList<>();
public TasksBuilder index(final String entity) {
_tasks.add(new IndexEntityTask(entity));
return this;
}
public TasksBuilder delete(final String entity) {
_tasks.add(new DeleteEntityTask(entity));
return this;
}
public TasksBuilder update(final String entity) {
_tasks.add(new UpdateEntityTask(entity) {
private static final long serialVersionUID = 1L;
@Override
protected UpdateRequest updateRequest(final Object entity) {
return null;
}
});
return this;
}
public Esi4JEntityTask[] tasks() {
return _tasks.toArray(new Esi4JEntityTask[_tasks.size()]);
}
}
}