32
32
import com .google .common .base .Preconditions ;
33
33
import com .google .common .base .Verify ;
34
34
import com .google .common .collect .ImmutableList ;
35
+ import com .google .common .collect .Iterables ;
35
36
import com .google .common .collect .Sets ;
36
37
37
38
import javax .annotation .Nonnull ;
38
39
import java .util .Arrays ;
39
40
import java .util .Collection ;
40
41
import java .util .Collections ;
41
42
import java .util .Deque ;
43
+ import java .util .Objects ;
42
44
import java .util .Optional ;
43
45
import java .util .Set ;
44
46
import java .util .function .Function ;
@@ -241,8 +243,7 @@ public Reference memoizeExpression(@Nonnull final RelationalExpression expressio
241
243
if (expression .getQuantifiers ().isEmpty ()) {
242
244
return memoizeLeafExpression (expression );
243
245
}
244
-
245
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent (Debugger .Location .BEGIN )));
246
+ Debugger .withDebugger (debugger -> debugger .onEvent (Debugger .InsertIntoMemoEvent .begin ()));
246
247
try {
247
248
Preconditions .checkArgument (!(expression instanceof RecordQueryPlan ));
248
249
@@ -278,28 +279,33 @@ public Reference memoizeExpression(@Nonnull final RelationalExpression expressio
278
279
commonReferencingExpressions .retainAll (referencingExpressionsIterator .next ());
279
280
}
280
281
281
- for (final var commonReferencingExpression : commonReferencingExpressions ) {
282
- if (Reference .isMemoizedExpression (commonReferencingExpression , expression )) {
283
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent (Debugger .Location .REUSED )));
284
- final var reference = expressionToReferenceMap .get (commonReferencingExpression );
285
- Verify .verifyNotNull (reference );
286
- Verify .verify (reference != this .root );
287
- return reference ;
288
- }
282
+ commonReferencingExpressions .removeIf (commonReferencingExpression -> !Reference .isMemoizedExpression (expression , commonReferencingExpression ));
283
+
284
+ if (!commonReferencingExpressions .isEmpty ()) {
285
+ Debugger .withDebugger (debugger ->
286
+ debugger .onEvent (Debugger .InsertIntoMemoEvent .reusedExpWithReferences (expression ,
287
+ commonReferencingExpressions .stream ()
288
+ .map (expressionToReferenceMap ::get )
289
+ .collect (ImmutableList .toImmutableList ()))));
290
+ final var reference = expressionToReferenceMap .get (Objects .requireNonNull (Iterables .getFirst (commonReferencingExpressions , null )));
291
+ Verify .verifyNotNull (reference );
292
+ Verify .verify (reference != this .root );
293
+ return reference ;
289
294
}
290
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent (Debugger .Location .NEW )));
295
+
296
+ Debugger .withDebugger (debugger -> debugger .onEvent (Debugger .InsertIntoMemoEvent .newExp (expression )));
291
297
final var newRef = Reference .of (expression );
292
298
traversal .addExpression (newRef , expression );
293
299
return newRef ;
294
300
} finally {
295
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent ( Debugger . Location . END )));
301
+ Debugger .withDebugger (debugger -> debugger .onEvent (Debugger .InsertIntoMemoEvent . end ( )));
296
302
}
297
303
}
298
304
299
305
@ Nonnull
300
306
@ Override
301
307
public Reference memoizeLeafExpression (@ Nonnull final RelationalExpression expression ) {
302
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent ( Debugger . Location . BEGIN )));
308
+ Debugger .withDebugger (debugger -> debugger .onEvent (Debugger .InsertIntoMemoEvent . begin ( )));
303
309
try {
304
310
Preconditions .checkArgument (!(expression instanceof RecordQueryPlan ));
305
311
Preconditions .checkArgument (expression .getQuantifiers ().isEmpty ());
@@ -309,17 +315,17 @@ public Reference memoizeLeafExpression(@Nonnull final RelationalExpression expre
309
315
for (final var leafRef : leafRefs ) {
310
316
for (final var member : leafRef .getMembers ()) {
311
317
if (Reference .isMemoizedExpression (expression , member )) {
312
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent ( Debugger . Location . REUSED )));
318
+ Debugger .withDebugger (debugger -> debugger .onEvent (Debugger .InsertIntoMemoEvent . reusedExp ( expression )));
313
319
return leafRef ;
314
320
}
315
321
}
316
322
}
317
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent ( Debugger . Location . NEW )));
323
+ Debugger .withDebugger (debugger -> debugger .onEvent (Debugger .InsertIntoMemoEvent . newExp ( expression )));
318
324
final var newRef = Reference .of (expression );
319
325
traversal .addExpression (newRef , expression );
320
326
return newRef ;
321
327
} finally {
322
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent ( Debugger . Location . END )));
328
+ Debugger .withDebugger (debugger -> debugger .onEvent (Debugger .InsertIntoMemoEvent . end ( )));
323
329
}
324
330
}
325
331
@@ -351,7 +357,8 @@ public Reference memoizeReference(@Nonnull final Reference reference) {
351
357
@ Nonnull
352
358
private Reference memoizeExpressionsExactly (@ Nonnull final Collection <? extends RelationalExpression > expressions ,
353
359
@ Nonnull Function <Set <? extends RelationalExpression >, Reference > referenceCreator ) {
354
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent (Debugger .Location .BEGIN )));
360
+ Debugger .withDebugger (debugger -> expressions .forEach (
361
+ expression -> debugger .onEvent (Debugger .InsertIntoMemoEvent .begin ())));
355
362
try {
356
363
final var expressionSet = new LinkedIdentitySet <>(expressions );
357
364
@@ -367,19 +374,21 @@ private Reference memoizeExpressionsExactly(@Nonnull final Collection<? extends
367
374
final Optional <Reference > memoizedRefMaybe = findExpressionsInMemo (expressionSet );
368
375
if (memoizedRefMaybe .isPresent ()) {
369
376
Debugger .withDebugger (debugger ->
370
- expressionSet .forEach (plan -> debugger .onEvent (new Debugger .InsertIntoMemoEvent (Debugger .Location .REUSED ))));
377
+ expressionSet .forEach (
378
+ plan -> debugger .onEvent (Debugger .InsertIntoMemoEvent .reusedExpWithReferences (plan , ImmutableList .of (memoizedRefMaybe .get ())))));
371
379
return memoizedRefMaybe .get ();
372
380
}
373
381
}
374
382
375
383
final var newRef = referenceCreator .apply (expressionSet );
376
384
for (final var plan : expressionSet ) {
377
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent (Debugger .Location .NEW )));
385
+ Debugger .withDebugger (debugger -> expressions .forEach (
386
+ expression -> debugger .onEvent (Debugger .InsertIntoMemoEvent .newExp (expression ))));
378
387
traversal .addExpression (newRef , plan );
379
388
}
380
389
return newRef ;
381
390
} finally {
382
- Debugger .withDebugger (debugger -> debugger .onEvent (new Debugger .InsertIntoMemoEvent ( Debugger . Location . END )));
391
+ Debugger .withDebugger (debugger -> debugger .onEvent (Debugger .InsertIntoMemoEvent . end ( )));
383
392
}
384
393
}
385
394
0 commit comments