package org.javers.repository.jql;
import org.javers.common.exception.JaversException;
import org.javers.common.exception.JaversExceptionCode;
import org.javers.common.validation.Validate;
import org.javers.core.diff.Change;
import org.javers.core.metamodel.object.CdoSnapshot;
import org.javers.core.metamodel.object.GlobalId;
import org.javers.core.metamodel.object.GlobalIdFactory;
import org.javers.core.metamodel.type.TypeMapper;
import org.javers.repository.api.JaversExtendedRepository;
import org.javers.shadow.Shadow;
import java.util.List;
import java.util.Optional;
/**
* Adapter from a JqlQuery to JaversRepository API
*
* @author bartosz.walacik
*/
public class QueryRunner {
private final JaversExtendedRepository repository;
private final GlobalIdFactory globalIdFactory;
private final TypeMapper typeMapper;
private final ShadowQueryRunner shadowQueryRunner;
public QueryRunner(JaversExtendedRepository repository, GlobalIdFactory globalIdFactory, TypeMapper typeMapper, ShadowQueryRunner shadowQueryRunner) {
this.repository = repository;
this.globalIdFactory = globalIdFactory;
this.typeMapper = typeMapper;
this.shadowQueryRunner = shadowQueryRunner;
}
public List<Shadow> queryForShadows(JqlQuery query) {
compile(query);
List<CdoSnapshot> snapshots = queryForSnapshots(query);
return shadowQueryRunner.queryForShadows(query, snapshots);
}
public Optional<CdoSnapshot> runQueryForLatestSnapshot(GlobalIdDTO globalId) {
Validate.argumentIsNotNull(globalId);
return repository.getLatest(globalIdFactory.createFromDto(globalId));
}
public List<CdoSnapshot> queryForSnapshots(JqlQuery query){
compile(query);
if (query.isAnyDomainObjectQuery()) {
return repository.getSnapshots(query.getQueryParams());
}
if (query.isIdQuery()){
return repository.getStateHistory(query.getIdFilter(), query.getQueryParams());
}
if (query.isClassQuery()){
return repository.getStateHistory(query.getClassFilter(), query.getQueryParams());
}
if (query.isVoOwnerQuery()) {
VoOwnerFilter filter = query.getVoOwnerFilter();
globalIdFactory.touchValueObjectFromPath(filter.getOwnerEntity(), filter.getPath());
return repository.getValueObjectStateHistory(filter.getOwnerEntity(), filter.getPath(), query.getQueryParams());
}
throw new JaversException(JaversExceptionCode.MALFORMED_JQL, "queryForSnapshots: " + query + " is not supported");
}
public List<Change> queryForChanges(JqlQuery query) {
compile(query);
if (query.isAnyDomainObjectQuery()) {
return repository.getChanges(query.isNewObjectChanges(), query.getQueryParams());
}
if (query.isIdQuery()){
return repository.getChangeHistory(query.getIdFilter(), query.getQueryParams());
}
if (query.isClassQuery()){
return repository.getChangeHistory(query.getClassFilter(), query.getQueryParams());
}
if (query.isVoOwnerQuery()) {
VoOwnerFilter filter = query.getVoOwnerFilter();
globalIdFactory.touchValueObjectFromPath(filter.getOwnerEntity(), filter.getPath());
return repository.getValueObjectChangeHistory(
filter.getOwnerEntity(), filter.getPath(), query.getQueryParams());
}
throw new JaversException(JaversExceptionCode.MALFORMED_JQL, "queryForChanges: " + query + " is not supported");
}
private GlobalId fromInstance(Object instance) {
return globalIdFactory.createInstanceId(instance);
}
private void compile(JqlQuery query) {
Validate.argumentIsNotNull(query);
query.compile(globalIdFactory, typeMapper);
}
}