Skip to content

Commit

Permalink
First version of AbstractManager is ready
Browse files Browse the repository at this point in the history
  • Loading branch information
Pyknic committed Mar 10, 2015
1 parent e3d450a commit a89132b
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 33 deletions.
Expand Up @@ -16,6 +16,7 @@
*/ */
package com.speedment.orm.code.model.java.entity; package com.speedment.orm.code.model.java.entity;


import static com.speedment.codegen.Formatting.*;
import com.speedment.codegen.base.CodeGenerator; import com.speedment.codegen.base.CodeGenerator;
import com.speedment.codegen.lang.models.Field; import com.speedment.codegen.lang.models.Field;
import com.speedment.codegen.lang.models.File; import com.speedment.codegen.lang.models.File;
Expand All @@ -25,7 +26,9 @@
import com.speedment.codegen.lang.models.Type; import com.speedment.codegen.lang.models.Type;
import static com.speedment.codegen.lang.models.constants.DefaultAnnotationUsage.OVERRIDE; import static com.speedment.codegen.lang.models.constants.DefaultAnnotationUsage.OVERRIDE;
import static com.speedment.codegen.lang.models.constants.DefaultAnnotationUsage.SUPPRESS_WARNINGS_UNCHECKED; import static com.speedment.codegen.lang.models.constants.DefaultAnnotationUsage.SUPPRESS_WARNINGS_UNCHECKED;
import static com.speedment.codegen.lang.models.constants.DefaultType.OBJECT;
import static com.speedment.codegen.lang.models.constants.DefaultType.STRING; import static com.speedment.codegen.lang.models.constants.DefaultType.STRING;
import com.speedment.orm.config.model.Column;
import com.speedment.orm.config.model.Table; import com.speedment.orm.config.model.Table;
import com.speedment.orm.core.manager.Manager; import com.speedment.orm.core.manager.Manager;
import com.speedment.orm.platform.Platform; import com.speedment.orm.platform.Platform;
Expand All @@ -49,7 +52,7 @@ protected Interface make(File file) {
.public_() .public_()
.add(Type.of(Manager.class).add(GENERIC_OF_PK).add(GENERIC_OF_ENTITY).add(GENERIC_OF_BUILDER)) .add(Type.of(Manager.class).add(GENERIC_OF_PK).add(GENERIC_OF_ENTITY).add(GENERIC_OF_BUILDER))


.add(primaryKeyFor(file)) .add(generatePrimaryKeyFor(file))


.add(Method.of("getTableName", STRING).default_().add(OVERRIDE) .add(Method.of("getTableName", STRING).default_().add(OVERRIDE)
.add("return \"" + table().getRelativeName(project()) + "\";")) .add("return \"" + table().getRelativeName(project()) + "\";"))
Expand All @@ -63,6 +66,8 @@ protected Interface make(File file) {
.add(Method.of("getBuilderClass", Type.of(Class.class).add(GENERIC_OF_BUILDER)).default_().add(OVERRIDE) .add(Method.of("getBuilderClass", Type.of(Class.class).add(GENERIC_OF_BUILDER)).default_().add(OVERRIDE)
.add("return " + BUILDER.getName() + ".class;")) .add("return " + BUILDER.getName() + ".class;"))


.add(generateGet(file))

.call(i -> file.add(Import.of(Type.of(Platform.class)))) .call(i -> file.add(Import.of(Type.of(Platform.class))))
.call(i -> file.add(Import.of(Type.of(ManagerComponent.class)))) .call(i -> file.add(Import.of(Type.of(ManagerComponent.class))))
.add(Method.of("get", MANAGER.getType()).static_().add(SUPPRESS_WARNINGS_UNCHECKED) .add(Method.of("get", MANAGER.getType()).static_().add(SUPPRESS_WARNINGS_UNCHECKED)
Expand All @@ -72,7 +77,7 @@ protected Interface make(File file) {
; ;
} }


protected Method primaryKeyFor(File file) { protected Method generatePrimaryKeyFor(File file) {
final Method method = Method.of("primaryKeyFor", typeOfPK()).default_().add(OVERRIDE) final Method method = Method.of("primaryKeyFor", typeOfPK()).default_().add(OVERRIDE)
.add(Field.of("entity", ENTITY.getType())); .add(Field.of("entity", ENTITY.getType()));


Expand All @@ -88,6 +93,17 @@ protected Method primaryKeyFor(File file) {


return method; return method;
} }

protected Method generateGet(File file) {
file.add(Import.of(Type.of(IllegalArgumentException.class)));
return Method.of("get", OBJECT).default_().add(OVERRIDE)
.add(Field.of("entity", ENTITY.getType()))
.add(Field.of("column", Type.of(Column.class)))
.add("switch (column.getName()) " + block(
columns().map(c -> "case \"" + variableName(c) + "\" : return entity.get" + typeName(c) + "();").collect(Collectors.joining(nl()))
+ nl() + "default : throw new IllegalArgumentException(\"Unknown column '\" + column.getName() + \"'.\");"
));
}


@Override @Override
protected String getJavadocRepresentText() { protected String getJavadocRepresentText() {
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/com/speedment/orm/core/manager/AbstractManager.java
Expand Up @@ -5,6 +5,7 @@
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;


/** /**
* *
Expand All @@ -17,4 +18,35 @@ public abstract class AbstractManager<PK, ENTITY, BUILDER extends Buildable<ENTI
public AbstractManager() { public AbstractManager() {
indexes = new ConcurrentHashMap<>(); indexes = new ConcurrentHashMap<>();
} }

@Override
public void insert(ENTITY entity) {
indexes.entrySet().stream().forEach(e -> {
e.getValue().put(makeKey(e.getKey(), entity), entity);
});
}

@Override
public void update(ENTITY entity) {
//TODO Make atomic.
delete(entity);
insert(entity);
}

@Override
public void delete(ENTITY entity) {
indexes.entrySet().stream().forEach(e -> {
e.getValue().remove(makeKey(e.getKey(), entity));
});
}

private Object makeKey(List<Column> columns, ENTITY entity) {
if (columns.size() == 1) {
return get(entity, columns.get(0));
} else {
return columns.stream()
.map(c -> get(entity, c))
.collect(Collectors.toList());
}
}
} }
Expand Up @@ -6,7 +6,7 @@
* *
* @author Emil Forslund * @author Emil Forslund
*/ */
public interface IndexHolder<KEY, ENTITY> { public interface IndexHolder<KEY, PK, ENTITY> {


Stream<ENTITY> stream(); Stream<ENTITY> stream();


Expand Down
18 changes: 11 additions & 7 deletions src/main/java/com/speedment/orm/core/manager/KeyIndexHolder.java
@@ -1,5 +1,6 @@
package com.speedment.orm.core.manager; package com.speedment.orm.core.manager;


import com.speedment.orm.core.Buildable;
import static com.speedment.util.stream.StreamUtil.streamOfNullable; import static com.speedment.util.stream.StreamUtil.streamOfNullable;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
Expand All @@ -9,27 +10,30 @@
* *
* @author Emil Forslund * @author Emil Forslund
*/ */
public class KeyIndexHolder<KEY, ENTITY> implements IndexHolder<KEY, ENTITY> { public class KeyIndexHolder<KEY, PK, ENTITY> implements IndexHolder<KEY, PK, ENTITY> {


private final Map<KEY, ENTITY> entities; private final Manager<PK, ENTITY, Buildable<ENTITY>> manager;
private final Map<KEY, Map<PK, ENTITY>> entities;


public KeyIndexHolder() { public KeyIndexHolder(Manager<PK, ENTITY, Buildable<ENTITY>> manager) {
entities = new ConcurrentHashMap<>(); this.manager = manager;
this.entities = new ConcurrentHashMap<>();
} }


@Override @Override
public Stream<ENTITY> stream() { public Stream<ENTITY> stream() {
return entities.values().stream(); return entities.values().stream().flatMap(e -> e.values().stream());
} }


@Override @Override
public Stream<ENTITY> stream(KEY key) { public Stream<ENTITY> stream(KEY key) {
return streamOfNullable(entities.get(key)); return streamOfNullable(entities.get(key)).flatMap(e -> e.values().stream());
} }


@Override @Override
public void put(KEY key, ENTITY entity) { public void put(KEY key, ENTITY entity) {
entities.put(key, entity); entities.computeIfAbsent(key, k -> new ConcurrentHashMap<>())
.put(manager.primaryKeyFor(entity), entity);
} }


@Override @Override
Expand Down
34 changes: 12 additions & 22 deletions src/main/java/com/speedment/orm/core/manager/Manager.java
Expand Up @@ -22,6 +22,7 @@
package com.speedment.orm.core.manager; package com.speedment.orm.core.manager;


import com.speedment.orm.annotations.Api; import com.speedment.orm.annotations.Api;
import com.speedment.orm.config.model.Column;
import com.speedment.orm.config.model.Table; import com.speedment.orm.config.model.Table;
import com.speedment.orm.core.Buildable; import com.speedment.orm.core.Buildable;
import java.util.stream.Stream; import java.util.stream.Stream;
Expand All @@ -33,19 +34,15 @@
@Api(version = 0) @Api(version = 0)
public interface Manager<PK, ENTITY, BUILDER extends Buildable<ENTITY>> { public interface Manager<PK, ENTITY, BUILDER extends Buildable<ENTITY>> {


// Inspection
PK primaryKeyFor(ENTITY entity); PK primaryKeyFor(ENTITY entity);


String getTableName(); Object get(ENTITY entity, Column column);


// Metadata // Metadata
Table getTable(); Table getTable();


// Entity Mapping String getTableName(); // TODO Remove.
// PK primaryKey(ENTITY entity);
//
// BEAN bean(ENTITY entity);
//
// BUILDER builder(ENTITY entity);


<M extends Manager<PK, ENTITY, BUILDER>> Class<M> getManagerClass(); <M extends Manager<PK, ENTITY, BUILDER>> Class<M> getManagerClass();


Expand All @@ -56,29 +53,22 @@ public interface Manager<PK, ENTITY, BUILDER extends Buildable<ENTITY>> {
<B extends BUILDER> B builder(); <B extends BUILDER> B builder();


<B extends BUILDER> B toBuilder(ENTITY model); <B extends BUILDER> B toBuilder(ENTITY model);
//
// <P extends Persistable<ENTITY>> P persister(Class<P> persistableClass);
//
// <P extends Persistable<ENTITY>> P persisterOf(Class<P> persistableClass, ENTITY model);

// ENTITY entity(ENTITY prototype);
//
// ENTITY newEntity();


// Retrieval // Retrieval
Stream<ENTITY> stream(); Stream<ENTITY> stream();


default long size() { default long size() {
return stream().count(); return stream().count();
} }

// Add and remove
void insert(ENTITY entity);

void update(ENTITY entity);

void delete(ENTITY primaryKey);


// Persistence // Persistence
// T insert(T entity);
//
// T update(T entity);
//
// void delete(Object pk);
//
// void load(); // void load();


ENTITY persist(ENTITY entity); ENTITY persist(ENTITY entity);
Expand Down
Expand Up @@ -9,7 +9,7 @@
* *
* @author Emil Forslund * @author Emil Forslund
*/ */
public class UniqueKeyIndexHolder<KEY, ENTITY> implements IndexHolder<KEY, ENTITY> { public class UniqueKeyIndexHolder<KEY, PK, ENTITY> implements IndexHolder<KEY, PK, ENTITY> {


private final Map<KEY, ENTITY> entities; private final Map<KEY, ENTITY> entities;


Expand Down

0 comments on commit a89132b

Please sign in to comment.