com.kenshoo.pl.entity.internal.fetch.OldEntityFetcher Maven / Gradle / Ivy
package com.kenshoo.pl.entity.internal.fetch;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.kenshoo.jooq.*;
import com.kenshoo.pl.data.ImpersonatorTable;
import com.kenshoo.pl.entity.UniqueKey;
import com.kenshoo.pl.entity.*;
import com.kenshoo.pl.entity.CurrentEntityState;
import com.kenshoo.pl.entity.internal.EntityTypeReflectionUtil;
import com.kenshoo.pl.entity.internal.PartialEntityInvocationHandler;
import org.jooq.*;
import org.jooq.lambda.Seq;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Stream;
import static java.util.Collections.emptyList;
import static java.util.Objects.requireNonNull;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.*;
import static org.apache.commons.lang3.Validate.notEmpty;
import static org.jooq.lambda.Seq.seq;
import static org.jooq.lambda.function.Functions.not;
public class OldEntityFetcher {
private final DSLContext dslContext;
public OldEntityFetcher(DSLContext dslContext) {
this.dslContext = dslContext;
}
public > Map, CurrentEntityState> fetchEntitiesByIds(final Collection extends Identifier> ids,
final EntityField, ?>... fieldsToFetchArgs) {
return fetchEntitiesByIds(ids, ImmutableList.copyOf(fieldsToFetchArgs));
}
public > Map, CurrentEntityState> fetchEntitiesByIds(final Collection extends Identifier> ids,
final Collection extends EntityField, ?>> fieldsToFetch) {
if (ids.isEmpty()) {
return Collections.emptyMap();
}
final UniqueKey uniqueKey = ids.iterator().next().getUniqueKey();
final EntityType entityType = uniqueKey.getEntityType();
final AliasedKey aliasedKey = new AliasedKey<>(uniqueKey);
final SelectJoinStep query = buildFetchQuery(entityType.getPrimaryTable(), aliasedKey.aliasedFields(), fieldsToFetch);
try (QueryExtension> queryExtender = queryExtender(query, entityType.getPrimaryTable(), ids)) {
return fetchEntitiesMap(queryExtender.getQuery(), aliasedKey, fieldsToFetch);
}
}
public List fetch(final EntityType> entityType,
final PLCondition plCondition,
final EntityField, ?>... fieldsToFetch) {
final Set> requestedFieldsToFetch = ImmutableSet.copyOf(fieldsToFetch);
final Set extends EntityField, ?>> allFieldsToFetch = Sets.union(requestedFieldsToFetch, plCondition.getFields());
final SelectJoinStep query = buildFetchQuery(entityType.getPrimaryTable(), emptyList(), allFieldsToFetch);
final Condition completeJooqCondition = addVirtualPartitionConditions(entityType, plCondition.getJooqCondition());
return query.where(completeJooqCondition)
.fetch(record -> mapRecordToEntity(record, requestedFieldsToFetch));
}
public List fetch(final EntityType> entityType,
final Collection extends Identifier>> ids,
final PLCondition plCondition,
final EntityField, ?>... fieldsToFetch) {
if (ids.isEmpty()) {
return Collections.emptyList();
}
final UniqueKey> uniqueKey = ids.iterator().next().getUniqueKey();
final AliasedKey> aliasedKey = new AliasedKey<>(uniqueKey);
final Set> requestedFieldsToFetch = ImmutableSet.copyOf(fieldsToFetch);
final Set> conditions = Stream.concat(plCondition.getFields().stream(), Arrays.stream(uniqueKey.getFields())).collect(toSet());
final Set extends EntityField, ?>> allFieldsToFetch = Sets.union(requestedFieldsToFetch, conditions);
final SelectJoinStep query = buildFetchQuery(entityType.getPrimaryTable(), aliasedKey.aliasedFields(), allFieldsToFetch);
final Condition completeJooqCondition = addVirtualPartitionConditions(entityType, plCondition.getJooqCondition());
try (QueryExtension> queryExtender = queryExtender(query, entityType.getPrimaryTable(), (Collection)ids)) {
return queryExtender.getQuery().where(completeJooqCondition)
.fetch(record -> mapRecordToEntity(record, requestedFieldsToFetch));
}
}
public > Map, CurrentEntityState> fetchEntitiesByForeignKeys(E entityType, UniqueKey foreignUniqueKey, Collection extends Identifier> keys, Collection> fieldsToFetch) {
try (final TempTableResource foreignKeysTable = createForeignKeysTable(entityType.getPrimaryTable(), foreignUniqueKey, keys)) {
final AliasedKey aliasedKey = new AliasedKey<>(foreignUniqueKey, foreignKeysTable);
final SelectJoinStep query = buildFetchQuery(foreignKeysTable.getTable(), aliasedKey.aliasedFields(), fieldsToFetch);
return fetchEntitiesMap(query, aliasedKey, fieldsToFetch);
}
}
public , PE extends PartialEntity, ID extends Identifier> Map fetchPartialEntities(E entityType, Collection keys, final Class entityIface) {
if (keys.isEmpty()) {
return Collections.emptyMap();
}
UniqueKey uniqueKey = keys.iterator().next().getUniqueKey();
final Map> entityMethodsMap = EntityTypeReflectionUtil.getMethodsMap(entityType, entityIface);
Map, CurrentEntityState> entityMap = fetchEntitiesByIds(keys, entityMethodsMap.values());
ClassLoader classLoader = entityIface.getClassLoader();
Class>[] interfaces = {entityIface};
//noinspection unchecked
return keys.stream().filter(entityMap::containsKey)
.collect(toMap(identity(), key -> (PE) Proxy.newProxyInstance(classLoader, interfaces, new PartialEntityInvocationHandler<>(entityMethodsMap, entityMap.get(key)))));
}
public , PE extends PartialEntity> List fetchByCondition(E entityType, Condition condition, final Class entityIface) {
final Map> entityMethodsMap = EntityTypeReflectionUtil.getMethodsMap(entityType, entityIface);
final Collection> fieldsToFetch = entityMethodsMap.values();
SelectJoinStep query = buildFetchQuery(entityType.getPrimaryTable(), Collections.>emptyList(), fieldsToFetch);
for (FieldAndValue fieldAndValue : entityType.getPrimaryTable().getVirtualPartition()) {
//noinspection unchecked
condition = condition.and(fieldAndValue.getField().eq(fieldAndValue.getValue()));
}
List entities = query.where(condition).fetch(record -> {
CurrentEntityMutableState currentState = new CurrentEntityMutableState();
Iterator © 2015 - 2025 Weber Informatics LLC | Privacy Policy