Skip to content

Commit a304089

Browse files
FlattenedTypeRelation fixes
1 parent 767eef1 commit a304089

File tree

8 files changed

+79
-44
lines changed

8 files changed

+79
-44
lines changed

fields/src/main/java/network/aika/fields/defs/FieldDefinition.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
*/
1717
package network.aika.fields.defs;
1818

19-
import network.aika.fields.direction.Direction;
2019
import network.aika.fields.field.Field;
21-
import network.aika.type.FlattenedTypeRelation;
2220
import network.aika.type.relations.Relation;
2321
import network.aika.type.relations.RelationOne;
2422
import network.aika.type.Obj;
@@ -181,7 +179,7 @@ public T getObjectType() {
181179
return objectType;
182180
}
183181

184-
public Integer getFieldId() {
182+
public Integer getId() {
185183
return fieldId;
186184
}
187185

@@ -228,7 +226,7 @@ public FieldDefinition<T, O> setQueued(ProcessingPhase phase) {
228226
}
229227

230228
public String toString() {
231-
return getFieldId() + ":" + name;
229+
return getId() + ":" + name;
232230
}
233231

234232
@Override

fields/src/main/java/network/aika/fields/direction/Direction.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import network.aika.fields.field.Field;
55
import network.aika.fields.defs.FieldLinkDefinition;
66
import network.aika.type.FlattenedType;
7-
import network.aika.type.FlattenedTypeRelation;
87
import network.aika.type.Obj;
98
import network.aika.type.Type;
9+
import network.aika.type.relations.Relation;
1010

1111
import java.util.stream.Stream;
1212

@@ -34,6 +34,8 @@ public interface Direction {
3434
>
3535
FlattenedType<T, O, RT, RO> getFlattenedType(Type<T, O> type);
3636

37+
Relation<?, ?, ?, ?> getRelation(Relation<?, ?, ?, ?> rel);
38+
3739
<
3840
T extends Type<T, O>,
3941
O extends Obj<T, O>,

fields/src/main/java/network/aika/fields/direction/Input.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import network.aika.type.FlattenedType;
88
import network.aika.type.Obj;
99
import network.aika.type.Type;
10+
import network.aika.type.relations.Relation;
1011

1112
import java.util.stream.Stream;
1213

@@ -41,6 +42,11 @@ FlattenedType<T, O, RT, RO> getFlattenedType(Type<T, O> type) {
4142
return (FlattenedType<T, O, RT, RO>) type.getFlattenedTypeInputSide();
4243
}
4344

45+
@Override
46+
public Relation<?, ?, ?, ?> getRelation(Relation<?, ?, ?, ?> rel) {
47+
return rel;
48+
}
49+
4450
@Override
4551
public <
4652
T extends Type<T, O>,

fields/src/main/java/network/aika/fields/direction/Output.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import network.aika.type.FlattenedType;
99
import network.aika.type.Obj;
1010
import network.aika.type.Type;
11+
import network.aika.type.relations.Relation;
1112

1213
import java.util.stream.Stream;
1314

@@ -43,6 +44,11 @@ FlattenedType<T, O, RT, RO> getFlattenedType(Type<T, O> type) {
4344
return (FlattenedType<T, O, RT, RO>) type.getFlattenedTypeOutputSide();
4445
}
4546

47+
@Override
48+
public Relation<?, ?, ?, ?> getRelation(Relation<?, ?, ?, ?> rel) {
49+
return rel.getReverse();
50+
}
51+
4652
@Override
4753
public <
4854
T extends Type<T, O>,

fields/src/main/java/network/aika/fields/field/Field.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class Field<T extends Type<T, O>, O extends Obj<T, O>> implements FieldIn
3636

3737
private final FieldDefinition<T, O> fieldDefinition;
3838

39+
private final short id;
3940
private final O object;
4041

4142
protected double value;
@@ -68,11 +69,16 @@ private static boolean isTrue(double v) {
6869
return v > 0.0;
6970
}
7071

71-
public Field(O obj, FieldDefinition<T, O> fd) {
72+
73+
public Field(O obj, FieldDefinition<T, O> fd, short id) {
7274
this.object = obj;
7375
this.fieldDefinition = fd;
76+
this.id = id;
7477
}
7578

79+
public short getId() {
80+
return id;
81+
}
7682

7783
@Override
7884
public boolean isWithinUpdate() {

fields/src/main/java/network/aika/type/FlattenedType.java

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,17 @@ private FlattenedType(Direction dir, T type, Map<FieldDefinition<T, O>, Short> f
5555
fields = new short[type.getTypeRegistry().getNumberOfFieldDefinitions()];
5656
Arrays.fill(fields, (short) -1);
5757

58+
Map<Short, List<FieldDefinition<T, O>>> groupedMap = new HashMap<>();
59+
for (Map.Entry<FieldDefinition<T, O>, Short> e : fieldMappings.entrySet()) {
60+
fields[e.getKey().getId()] = e.getValue();
61+
62+
groupedMap.computeIfAbsent(e.getValue(), k -> new ArrayList<>())
63+
.add(e.getKey());
64+
}
65+
5866
fieldsReverse = new FieldDefinition[numberOfFields][];
59-
for(Map.Entry<FieldDefinition<T, O>, Short> e: fieldMappings.entrySet()) {
60-
fields[e.getKey().getFieldId()] = e.getValue();
61-
fieldsReverse[e.getValue()] = new FieldDefinition[] {e.getKey()};
67+
for(Map.Entry<Short, List<FieldDefinition<T, O>>> e: groupedMap.entrySet()) {
68+
fieldsReverse[e.getKey()] = e.getValue().toArray(new FieldDefinition[0]);
6269
}
6370
}
6471

@@ -94,7 +101,7 @@ FlattenedType<T, O, RT, RO> createOutputFlattenedType(T type, Set<FieldDefinitio
94101
Map<FieldDefinition<T, O>, Short> fieldMappings = new TreeMap<>();
95102
for(FieldDefinition<T, O> fd: fieldDefs) {
96103
FieldDefinition<T, O> resolvedFD = fd.resolveInheritedFieldDefinition(fieldDefs);
97-
short fieldIndex = inputSide.fields[resolvedFD.getFieldId()];
104+
short fieldIndex = inputSide.fields[resolvedFD.getId()];
98105

99106
fieldMappings.put(fd, fieldIndex);
100107
}
@@ -109,57 +116,60 @@ public void flatten() {
109116
for(Relation rel: type.getRelations()) {
110117
FlattenedTypeRelation<T, O, RT, RO>[] resultsPerRelation = new FlattenedTypeRelation[type.getTypeRegistry().getTypes().size()];
111118
for (Type relatedType : type.getTypeRegistry().getTypes()) {
112-
resultsPerRelation[relatedType.getId()] = flattenPerType(direction, rel, relatedType);
119+
resultsPerRelation[relatedType.getId()] = flattenPerType(rel, relatedType);
113120
}
114121

115122
if(!ArrayUtils.isAllNull(resultsPerRelation))
116123
mapping[rel.getRelationId()] = resultsPerRelation;
117124
}
118125
}
119126

120-
@SuppressWarnings("unchecked")
121-
public void followLinks(Field<T, O> field) {
122-
for(int relationId = 0; relationId < mapping.length; relationId++) {
123-
FlattenedTypeRelation<T, O, RT, RO>[] ftr = mapping[relationId];
124-
125-
if(ftr != null) {
126-
Relation<T, O, RT, RO> relation = (Relation<T, O, RT, RO>) type.getRelations()[relationId];
127-
128-
relation.followAll(field.getObject())
129-
.forEach(relatedObj ->
130-
ftr[relatedObj.getType().getId()]
131-
.followLinks(direction, relatedObj, field)
132-
);
133-
}
134-
}
135-
}
136-
137127
private FlattenedTypeRelation<T, O, RT, RO> flattenPerType(
138-
Direction dir,
139128
Relation<T, O, RT, RO> relation,
140129
Type<RT, RO> relatedType
141130
) {
142131
List<FieldLinkDefinition<T, O, ?, ?>> fieldLinks = Stream.of(fieldsReverse)
143132
.flatMap(Stream::of)
144-
.<FieldLinkDefinition<T, O, ?, ?>>flatMap(dir::getFieldLinkDefinitions)
133+
.<FieldLinkDefinition<T, O, ?, ?>>flatMap(direction::getFieldLinkDefinitions)
145134
.filter(fl ->
146-
fl.getRelation().getRelationId() == relation.getRelationId()
135+
direction.getRelation(fl.getRelation()).getRelationId() == relation.getRelationId()
147136
)
148137
.filter(fl ->
149138
relatedType.isInstanceOf(fl.getRelatedFD().getObjectType())
150139
)
151140
.filter(fl ->
152-
dir.invert().getFlattenedType(relatedType).fields[fl.getRelatedFD().getFieldId()] >= 0
141+
direction.invert().getFlattenedType(relatedType).fields[fl.getRelatedFD().getId()] >= 0
153142
)
154143
.toList();
155144

156145
return fieldLinks.isEmpty() ?
157146
null :
158-
new FlattenedTypeRelation<>(type.getTypeRegistry(), fieldLinks);
147+
new FlattenedTypeRelation<>(this, fieldLinks);
148+
}
149+
150+
@SuppressWarnings("unchecked")
151+
public void followLinks(Field<T, O> field) {
152+
for(int relationId = 0; relationId < mapping.length; relationId++) {
153+
FlattenedTypeRelation<T, O, RT, RO>[] ftr = mapping[relationId];
154+
155+
if(ftr != null) {
156+
Relation<T, O, RT, RO> relation = (Relation<T, O, RT, RO>) type.getRelations()[relationId];
157+
158+
relation.followAll(field.getObject())
159+
.forEach(relatedObj ->
160+
ftr[relatedObj.getType().getId()]
161+
.followLinks(direction, relatedObj, field)
162+
);
163+
}
164+
}
165+
}
166+
167+
public FieldDefinition<T, O>[][] getFieldsReverse() {
168+
return fieldsReverse;
159169
}
160170

161171
public short getFieldIndex(FieldDefinition<T, O> fd) {
162-
return fields[fd.getFieldId()];
172+
return fields[fd.getId()];
163173
}
164174

165175
public short getNumberOfFields() {

fields/src/main/java/network/aika/type/FlattenedTypeRelation.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package network.aika.type;
22

3+
import network.aika.fields.defs.FieldDefinition;
34
import network.aika.fields.direction.Direction;
45
import network.aika.fields.field.Field;
56
import network.aika.fields.defs.FieldLinkDefinition;
@@ -17,21 +18,27 @@ public class FlattenedTypeRelation<
1718

1819
FieldLinkDefinition<T, O, RT, RO>[][] fieldLinks;
1920

20-
public FlattenedTypeRelation(TypeRegistry registry, List<FieldLinkDefinition<T, O, ?, ?>> fieldLinks) {
21-
Map<Integer, List<FieldLinkDefinition<T, O, ?, ?>>> groupedByRelatedFD =
22-
fieldLinks.stream()
21+
public FlattenedTypeRelation(FlattenedType<T, O, RT, RO> flattenedType, List<FieldLinkDefinition<T, O, ?, ?>> fls) {
22+
Map<Integer, List<FieldLinkDefinition<T, O, ?, ?>>> groupedByOriginFD =
23+
fls.stream()
2324
.collect(Collectors.groupingBy(fl ->
24-
fl.getOriginFD().getFieldId())
25+
fl.getOriginFD().getId())
2526
);
2627

27-
this.fieldLinks = new FieldLinkDefinition[registry.getNumberOfFieldDefinitions()][];
28-
groupedByRelatedFD.forEach((id, list) ->
29-
this.fieldLinks[id] = list.toArray(new FieldLinkDefinition[0])
30-
);
28+
fieldLinks = new FieldLinkDefinition[flattenedType.getFieldsReverse().length][];
29+
for(short i = 0; i < fieldLinks.length; i++) {
30+
for(FieldDefinition<T, O> fd : flattenedType.getFieldsReverse()[i]) {
31+
List<FieldLinkDefinition<T, O, ?, ?>> list = groupedByOriginFD.get(fd.getId());
32+
if (list != null) {
33+
fieldLinks[i] = list.toArray(new FieldLinkDefinition[0]);
34+
}
35+
}
36+
}
3137
}
3238

39+
3340
public void followLinks(Direction direction, RO relatedObj, Field<T, O> field) {
34-
FieldLinkDefinition<T, O, RT, RO>[] fls = fieldLinks[field.getFieldDefinition().getFieldId()];
41+
FieldLinkDefinition<T, O, RT, RO>[] fls = fieldLinks[field.getId()];
3542
if(fls != null) {
3643
for (FieldLinkDefinition<T, O, RT, RO> fl : fls) {
3744
direction.transmit(

fields/src/main/java/network/aika/type/ObjImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public Field<T, O> getOrCreateFieldInput(FieldDefinition<T, O> fd) {
7979

8080
Field<T, O> f = fields[fieldIndex];
8181
if(f == null) {
82-
f = fields[fieldIndex] = new Field<>((O) this, fd);
82+
f = fields[fieldIndex] = new Field<>((O) this, fd, fieldIndex);
8383
}
8484

8585
return f;

0 commit comments

Comments
 (0)