This commit is contained in:
Lukas Eder 2020-08-18 10:06:27 +02:00
parent 985bda87df
commit a3779fae88
2 changed files with 44 additions and 32 deletions

View File

@ -540,32 +540,35 @@ final class FieldMapsForInsert extends AbstractQueryPart {
Map<Field<?>, List<Field<?>>> result = new LinkedHashMap<>();
// [#2530] [#6124] [#10481] TODO: Shortcut for performance, when there are no embeddables
// [#2530] [#6124] [#10481] TODO: Refactor and optimise these flattening algorithms
Set<Field<?>> overlapping = null;
for (Entry<Field<?>, List<Field<?>>> entry : values.entrySet()) {
if (isEmbeddable(entry.getKey())) {
List<Iterator<? extends Field<?>>> value = new ArrayList<>(entry.getValue().size());
for (Field<?> f : entry.getValue())
value.add(flatten(f).iterator());
for (Field<?> key : flatten(entry.getKey())) {
if ((overlapping = lazy(overlapping)).add(key)) {
List<Field<?>> list = new ArrayList<>(entry.getValue().size());
for (Iterator<? extends Field<?>> v : value)
if (v.hasNext())
list.add(v.next());
result.put(key, list);
}
else
for (Iterator<? extends Field<?>> v : value)
if (v.hasNext())
v.next();
}
}
else
result.put(entry.getKey(), entry.getValue());
}

View File

@ -5417,23 +5417,28 @@ final class Tools {
@Override
public Iterator<E> iterator() {
return new FlatteningIterator<E>(iterable.iterator()) {
Set<Field<?>> overlapping = null;
@SuppressWarnings("unchecked")
@Override
List<E> flatten(E e) {
if (e instanceof EmbeddableTableField) {
if (removeDuplicates) {
List<E> result = new ArrayList<>();
for (Field<?> field : ((EmbeddableTableField<?, ?>) e).fields)
if ((overlapping = lazy(overlapping)).add(field))
result.add((E) field);
return result;
}
else
return (List<E>) Arrays.asList(((EmbeddableTableField<?, ?>) e).fields);
return (List<E>) Arrays.asList(((EmbeddableTableField<?, ?>) e).fields);
}
return null;
@ -5457,7 +5462,9 @@ final class Tools {
@Override
public Iterator<E> iterator() {
return new FlatteningIterator<E>(iterable.iterator()) {
Set<Field<?>> overlapping = null;
@SuppressWarnings("unchecked")
@Override
@ -5468,7 +5475,9 @@ final class Tools {
Field<?>[] values = embeddedFields(e.getValue());
for (int i = 0; i < keys.length; i++)
if (!removeDuplicates || (overlapping = lazy(overlapping)).add(keys[i]))
result.add((E) new SimpleImmutableEntry<Field<?>, Field<?>>(
keys[i], values[i]
));