Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tasks parametrized with name of target ObjEntity #228

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,37 +14,76 @@ public interface ITaskService {
* population of the target DB).
*
* @since 2.6
* @see #create(String)
*/
CreateBuilder create(Class<?> type);

/**
* Returns a builder of "create" ETL synchronization task.
*
* @since 3.0
* @see #create(Class)
*/
CreateBuilder create(String objEntityName);

/**
* Returns a builder of "create-or-update" ETL synchronization task.
*
* @since 1.3
* @see #createOrUpdate(String)
*/
CreateOrUpdateBuilder createOrUpdate(Class<?> type);

/**
* Returns a builder of "create-or-update" ETL synchronization task.
*
* @since 3.0
* @see #createOrUpdate(Class)
*/
CreateOrUpdateBuilder createOrUpdate(String objEntityName);

/**
* Returns a builder of target delete ETL synchronization task.
*
* @since 1.3
* @see #delete(String)
*/
DeleteBuilder delete(Class<?> type);


/**
* Returns a builder of target delete ETL synchronization task.
*
* @since 3.0
* @see #delete(Class)
*/
DeleteBuilder delete(String objEntityName);

/**
* Returns a builder of target deleteAll ETL synchronization task.
*
* @since 3.0
* @see #deleteAll(String)
*/
DeleteAllBuilder deleteAll(Class<?> type);

/**
* Returns a builder of target deleteAll ETL synchronization task.
*
* @since 3.0
* @see #deleteAll(Class)
*/
DeleteAllBuilder deleteAll(String objEntityName);

/**
* @since 1.3
* @see #extractSourceKeys(String)
*/
SourceKeysBuilder extractSourceKeys(Class<?> type);

/**
* @since 1.4
* @see #extractSourceKeys(Class)
*/
SourceKeysBuilder extractSourceKeys(String targetEntityName);
SourceKeysBuilder extractSourceKeys(String objEntityName);
}
132 changes: 100 additions & 32 deletions link-move/src/main/java/com/nhl/link/move/runtime/task/TaskService.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ public TaskService(

@Override
public CreateBuilder create(Class<?> type) {

ObjEntity entity = lookupEntity(type);
TargetEntity targetEntity = targetEntityMap.get(entity);
CreateTargetMerger merger = new CreateTargetMerger(writerService.getWriterFactory(type));
Expand All @@ -82,8 +81,26 @@ public CreateBuilder create(Class<?> type) {
}

@Override
public CreateOrUpdateBuilder createOrUpdate(Class<?> type) {
public CreateBuilder create(String objEntityName) {
ObjEntity entity = lookupEntity(objEntityName);
TargetEntity targetEntity = targetEntityMap.get(entity);
CreateTargetMerger merger = new CreateTargetMerger(writerService.getWriterFactory(objEntityName));
FkResolver fkResolver = new FkResolver(targetEntity);
RowConverter rowConverter = new RowConverter(targetEntity, valueConverterFactory);

return new DefaultCreateBuilder(
new CreateTargetMapper(objEntityName),
merger,
fkResolver,
rowConverter,
targetCayenneService,
extractorService,
tokenManager,
logger);
}

@Override
public CreateOrUpdateBuilder createOrUpdate(Class<?> type) {
ObjEntity entity = lookupEntity(type);
TargetEntity targetEntity = targetEntityMap.get(entity);
MapperBuilder mapperBuilder = new MapperBuilder(entity, targetEntity, keyAdapterFactory);
Expand All @@ -103,51 +120,50 @@ public CreateOrUpdateBuilder createOrUpdate(Class<?> type) {
logger);
}

protected ObjEntity lookupEntity(Class<?> type) {
ObjEntity entity = targetCayenneService.entityResolver().getObjEntity(type);
if (entity == null) {
throw new LmRuntimeException("Java class " + type.getName() + " is not mapped in Cayenne");
}
return entity;
}

@Override
public SourceKeysBuilder extractSourceKeys(Class<?> type) {
ObjEntity targetEntity = targetCayenneService.entityResolver().getObjEntity(type);
return new DefaultSourceKeysBuilder(
targetEntityMap.get(targetEntity),
public CreateOrUpdateBuilder createOrUpdate(String objEntityName) {
ObjEntity entity = lookupEntity(objEntityName);
TargetEntity targetEntity = targetEntityMap.get(entity);
MapperBuilder mapperBuilder = new MapperBuilder(entity, targetEntity, keyAdapterFactory);
RowConverter rowConverter = new RowConverter(targetEntity, valueConverterFactory);
CreateOrUpdateTargetMerger merger = new CreateOrUpdateTargetMerger(writerService.getWriterFactory(objEntityName));
FkResolver fkResolver = new FkResolver(targetEntity);

return new DefaultCreateOrUpdateBuilder(
objEntityName,
merger,
fkResolver,
rowConverter,
targetCayenneService,
extractorService,
tokenManager,
keyAdapterFactory,
valueConverterFactory,
mapperBuilder,
logger);
}

@Override
public SourceKeysBuilder extractSourceKeys(String targetEntityName) {
ObjEntity targetEntity = targetCayenneService.entityResolver().getObjEntity(targetEntityName);
return new DefaultSourceKeysBuilder(
targetEntityMap.get(targetEntity),
extractorService,
public DeleteBuilder delete(Class<?> type) {
ObjEntity entity = lookupEntity(type);
TargetEntity targetEntity = targetEntityMap.get(entity);
MapperBuilder mapperBuilder = new MapperBuilder(entity, targetEntity, keyAdapterFactory);

return new DefaultDeleteBuilder(
type,
targetCayenneService,
tokenManager,
keyAdapterFactory,
valueConverterFactory,
this,
mapperBuilder,
logger);
}

@Override
public DeleteBuilder delete(Class<?> type) {

ObjEntity entity = targetCayenneService.entityResolver().getObjEntity(type);
if (entity == null) {
throw new LmRuntimeException("Java class " + type.getName() + " is not mapped in Cayenne");
}

public DeleteBuilder delete(String objEntityName) {
ObjEntity entity = lookupEntity(objEntityName);
TargetEntity targetEntity = targetEntityMap.get(entity);
MapperBuilder mapperBuilder = new MapperBuilder(entity, targetEntity, keyAdapterFactory);

return new DefaultDeleteBuilder(
type,
entity.getDbEntityName(),
targetCayenneService,
tokenManager,
this,
Expand All @@ -160,10 +176,62 @@ public DeleteAllBuilder deleteAll(Class<?> type) {
ObjEntity entity = lookupEntity(type);

return new DefaultDeleteAllBuilder(
type,
targetCayenneService,
tokenManager,
entity.getDbEntity(),
logger);
}

@Override
public DeleteAllBuilder deleteAll(String objEntityName) {
ObjEntity entity = lookupEntity(objEntityName);

return new DefaultDeleteAllBuilder(
targetCayenneService,
tokenManager,
entity.getDbEntity(),
logger);
}

@Override
public SourceKeysBuilder extractSourceKeys(Class<?> type) {
ObjEntity targetEntity = lookupEntity(type);

return new DefaultSourceKeysBuilder(
targetEntityMap.get(targetEntity),
extractorService,
tokenManager,
keyAdapterFactory,
valueConverterFactory,
logger);
}

@Override
public SourceKeysBuilder extractSourceKeys(String objEntityName) {
ObjEntity targetEntity = lookupEntity(objEntityName);

return new DefaultSourceKeysBuilder(
targetEntityMap.get(targetEntity),
extractorService,
tokenManager,
keyAdapterFactory,
valueConverterFactory,
logger);
}

protected ObjEntity lookupEntity(Class<?> type) {
ObjEntity entity = targetCayenneService.entityResolver().getObjEntity(type);
if (entity == null) {
throw new LmRuntimeException("Java class " + type.getName() + " is not mapped in Cayenne");
}
return entity;
}

protected ObjEntity lookupEntity(String objEntityName) {
ObjEntity entity = targetCayenneService.entityResolver().getObjEntity(objEntityName);
if (entity == null) {
throw new LmRuntimeException("ObjEntity " + objEntityName + " was not found in Cayenne");
}
return entity;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,24 @@
import com.nhl.dflib.row.RowBuilder;
import com.nhl.dflib.row.RowProxy;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.access.DataContext;

/**
* @since 2.6
*/
public class CreateTargetMapper {

private final Class<?> type;
private final String objEntityName;

public CreateTargetMapper(Class<?> type) {
this.type = type;
this.objEntityName = null;
}

public CreateTargetMapper(String objEntityName) {
this.type = null;
this.objEntityName = objEntityName;
}

public DataFrame map(ObjectContext cayenneContext, DataFrame sources) {
Expand All @@ -34,6 +42,6 @@ protected Object create(ObjectContext context) {
// Note that "context.newObject" is an impure function. Though we don't see its undesired side effects on
// multiple iterations due to DataFrame "materialized" feature that transparently caches the results..

return context.newObject(type);
return type != null ? context.newObject(type) : ((DataContext) context).newObject(objEntityName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,29 @@
import com.nhl.dflib.builder.BoolAccum;
import com.nhl.link.move.mapper.Mapper;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.access.DataContext;

/**
* @since 2.6
*/
public class CreateOrUpdateTargetMapper {

private Class<?> type;
private Mapper mapper;
private final Class<?> type;
private final String objEntityName;
private final Mapper mapper;

public CreateOrUpdateTargetMapper(Class<?> type, Mapper mapper) {
this(type, null ,mapper);
}

public CreateOrUpdateTargetMapper(String objEntityName, Mapper mapper) {
this(null, objEntityName, mapper);
}

protected CreateOrUpdateTargetMapper(Class<?> type, String objEntityName, Mapper mapper) {
this.mapper = mapper;
this.type = type;
this.objEntityName = objEntityName;
}

public DataFrame map(
Expand Down Expand Up @@ -45,6 +56,9 @@ private Object createIfMissing(Object v, ObjectContext context) {
// Note that "context.newObject" is an impure function. Though we don't see its undesired side effects on
// multiple iterations due to DataFrame "materialized" feature that transparently caches the results..

return v != null ? v : context.newObject(type);
if (v != null) {
return v;
}
return type != null ? context.newObject(type) : ((DataContext) context).newObject(objEntityName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,21 @@
public class CreateOrUpdateTargetMatcher {

private final Class<?> type;
private final String objEntityName;
private final Mapper mapper;
private final Index index;

public CreateOrUpdateTargetMatcher(Class<?> type, Mapper mapper) {
this(type, null, mapper);
}

public CreateOrUpdateTargetMatcher(String objEntityName, Mapper mapper) {
this(null, objEntityName, mapper);
}

protected CreateOrUpdateTargetMatcher(Class<?> type, String objEntityName, Mapper mapper) {
this.type = type;
this.objEntityName = objEntityName;
this.mapper = mapper;
this.index = Index.forLabels(CreateOrUpdateSegment.TARGET_COLUMN);
}
Expand All @@ -38,7 +48,10 @@ public DataFrame match(ObjectContext context, DataFrame df) {
if (expressions.isEmpty()) {
return DataFrame.empty(index);
} else {
List<?> objects = ObjectSelect.query(type).where(ExpressionFactory.or(expressions.values())).select(context);
List<?> objects =
(type != null ? ObjectSelect.query(type) : ObjectSelect.query(Object.class, objEntityName))
.where(ExpressionFactory.or(expressions.values()))
.select(context);
return DataFrame.byColumn(index).of(Series.ofIterable(objects));
}
}
Expand Down
Loading