Skip to content

Commit 73686d8

Browse files
author
Zhen Li
committed
Adding missing profile statistics
1 parent ead87f1 commit 73686d8

File tree

5 files changed

+105
-22
lines changed

5 files changed

+105
-22
lines changed

driver/src/main/java/org/neo4j/driver/internal/summary/InternalProfiledPlan.java

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,30 @@
2020

2121
import java.util.List;
2222
import java.util.Map;
23+
import java.util.function.Function;
2324

2425
import org.neo4j.driver.Value;
2526
import org.neo4j.driver.summary.ProfiledPlan;
26-
import java.util.function.Function;
2727

2828
public class InternalProfiledPlan extends InternalPlan<ProfiledPlan> implements ProfiledPlan
2929
{
3030
private final long dbHits;
3131
private final long records;
32+
private final long pageCacheHits;
33+
private final long pageCacheMisses;
34+
private final double pageCacheHitRatio;
35+
private final long time;
3236

33-
protected InternalProfiledPlan( String operatorType, Map<String, Value> arguments,
34-
List<String> identifiers, List<ProfiledPlan> children, long dbHits, long records )
37+
protected InternalProfiledPlan( String operatorType, Map<String,Value> arguments, List<String> identifiers, List<ProfiledPlan> children, long dbHits,
38+
long records, long pageCacheHits, long pageCacheMisses, double pageCacheHitRatio, long time )
3539
{
3640
super( operatorType, arguments, identifiers, children );
3741
this.dbHits = dbHits;
3842
this.records = records;
43+
this.pageCacheHits = pageCacheHits;
44+
this.pageCacheMisses = pageCacheMisses;
45+
this.pageCacheHitRatio = pageCacheHitRatio;
46+
this.time = time;
3947
}
4048

4149
@Override
@@ -50,17 +58,51 @@ public long records()
5058
return records;
5159
}
5260

61+
@Override
62+
public boolean hasPageCacheStats()
63+
{
64+
return pageCacheHits > 0 || pageCacheMisses > 0 || !Double.isNaN( pageCacheHitRatio );
65+
}
66+
67+
@Override
68+
public long pageCacheHits()
69+
{
70+
return pageCacheHits;
71+
}
72+
73+
@Override
74+
public long pageCacheMisses()
75+
{
76+
return pageCacheMisses;
77+
}
78+
79+
@Override
80+
public double pageCacheHitRatio()
81+
{
82+
return pageCacheHitRatio;
83+
}
84+
85+
@Override
86+
public long time()
87+
{
88+
return time;
89+
}
90+
5391
public static final PlanCreator<ProfiledPlan> PROFILED_PLAN = new PlanCreator<ProfiledPlan>()
5492
{
5593
@Override
56-
public ProfiledPlan create( String operatorType, Map<String,Value> arguments, List<String> identifiers, List<ProfiledPlan> children, Value originalPlanValue )
94+
public ProfiledPlan create( String operatorType, Map<String,Value> arguments, List<String> identifiers, List<ProfiledPlan> children,
95+
Value originalPlanValue )
5796
{
58-
return new InternalProfiledPlan( operatorType, arguments, identifiers, children,
59-
originalPlanValue.get( "dbHits" ).asLong(),
60-
originalPlanValue.get( "rows" ).asLong() );
97+
return new InternalProfiledPlan( operatorType, arguments, identifiers, children, originalPlanValue.get( "dbHits" ).asLong( 0 ),
98+
originalPlanValue.get( "rows" ).asLong( 0 ), originalPlanValue.get( "pageCacheHits" ).asLong( 0 ),
99+
originalPlanValue.get( "pageCacheMisses" ).asLong( 0 ), originalPlanValue.get( "pageCacheHitRatio" ).asDouble( Double.NaN ),
100+
originalPlanValue.get( "time" ).asLong( 0 ) );
61101
}
62102
};
63103

64-
/** Builds a regular plan without profiling information - eg. a plan that came as a result of an `EXPLAIN` statement */
65-
public static final Function<Value, ProfiledPlan> PROFILED_PLAN_FROM_VALUE = new Converter<>(PROFILED_PLAN);
104+
/**
105+
* Builds a regular plan without profiling information - eg. a plan that came as a result of an `EXPLAIN` statement
106+
*/
107+
public static final Function<Value,ProfiledPlan> PROFILED_PLAN_FROM_VALUE = new Converter<>( PROFILED_PLAN );
66108
}

driver/src/main/java/org/neo4j/driver/summary/ProfiledPlan.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,31 @@ public interface ProfiledPlan extends Plan
3737
*/
3838
long records();
3939

40+
/**
41+
* @return if the number page cache hits and misses and the ratio was recorded.
42+
*/
43+
boolean hasPageCacheStats();
44+
45+
/**
46+
* @return number of page cache hits caused by executing the associated execution step
47+
*/
48+
long pageCacheHits();
49+
50+
/**
51+
* @return number of page cache misses caused by executing the associated execution step
52+
*/
53+
long pageCacheMisses();
54+
55+
/**
56+
* @return the ratio of page cache hits to total number of lookups or {@link Double#NaN} if no data is available
57+
*/
58+
double pageCacheHitRatio();
59+
60+
/**
61+
* @return amount of time spent in the associated execution step.
62+
*/
63+
long time();
64+
4065
@Override
4166
List<ProfiledPlan> children();
4267
}

driver/src/test/java/org/neo4j/driver/integration/SummaryIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ void shouldContainProfile()
185185

186186
ProfiledPlan profile = summary.profile();
187187

188+
assertEquals( 0, profile.time() );
188189
assertEquals( 0, profile.dbHits() );
189190
assertEquals( 1, profile.records() );
190191
}

driver/src/test/java/org/neo4j/driver/internal/summary/InternalProfiledPlanTest.java

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.HashMap;
2424
import java.util.Map;
2525

26+
import org.neo4j.driver.internal.value.FloatValue;
2627
import org.neo4j.driver.internal.value.IntegerValue;
2728
import org.neo4j.driver.internal.value.ListValue;
2829
import org.neo4j.driver.internal.value.MapValue;
@@ -35,6 +36,7 @@
3536
import static org.hamcrest.CoreMatchers.hasItem;
3637
import static org.hamcrest.MatcherAssert.assertThat;
3738
import static org.hamcrest.Matchers.empty;
39+
import static org.junit.jupiter.api.Assertions.assertTrue;
3840

3941
class InternalProfiledPlanTest
4042
{
@@ -49,12 +51,7 @@ void shouldHandlePlanWithNoChildren()
4951
ProfiledPlan plan = InternalProfiledPlan.PROFILED_PLAN_FROM_VALUE.apply( value );
5052

5153
// THEN
52-
assertThat( plan.dbHits(), equalTo( 42L ) );
53-
assertThat( plan.records(), equalTo( 1337L ) );
54-
assertThat( plan.operatorType(), equalTo( "AwesomeOperator" ) );
55-
assertThat( plan.identifiers(), equalTo( asList( "n1", "n2" ) ) );
56-
assertThat( plan.arguments().values(), hasItem( new StringValue( "CYPHER 1337" ) ) );
57-
assertThat( plan.children(), empty() );
54+
verifyPlan( plan );
5855
}
5956

6057
@Test
@@ -71,12 +68,7 @@ void shouldHandlePlanWithChildren()
7168
// THEN
7269
for ( ProfiledPlan child : plan.children() )
7370
{
74-
assertThat( child.dbHits(), equalTo( 42L ) );
75-
assertThat( child.records(), equalTo( 1337L ) );
76-
assertThat( child.operatorType(), equalTo( "AwesomeOperator" ) );
77-
assertThat( child.identifiers(), equalTo( asList( "n1", "n2" ) ) );
78-
assertThat( child.arguments().values(), hasItem( new StringValue( "CYPHER 1337" ) ) );
79-
assertThat( child.children(), empty() );
71+
verifyPlan( child );
8072
}
8173
}
8274

@@ -86,12 +78,29 @@ private Map<String,Value> createPlanMap()
8678
map.put( "operatorType", new StringValue( "AwesomeOperator" ) );
8779
map.put( "rows", new IntegerValue( 1337L ) );
8880
map.put( "dbHits", new IntegerValue( 42 ) );
81+
map.put( "pageCacheHits", new IntegerValue( 1234 ) );
82+
map.put( "pageCacheMisses", new IntegerValue( 3456 ) );
83+
map.put( "pageCacheHitRatio", new FloatValue( 0.123 ) );
84+
map.put( "time", new IntegerValue( 999 ) );
8985
map.put( "identifiers", new ListValue( new StringValue( "n1" ), new StringValue( "n2" ) ) );
9086
Map<String,Value> args = new HashMap<>();
9187
args.put( "version", new StringValue( "CYPHER 1337" ) );
9288
map.put( "args", new MapValue( args ) );
9389
return map;
9490
}
9591

96-
92+
private void verifyPlan( ProfiledPlan plan )
93+
{
94+
assertThat( plan.dbHits(), equalTo( 42L ) );
95+
assertThat( plan.records(), equalTo( 1337L ) );
96+
assertTrue( plan.hasPageCacheStats() );
97+
assertThat( plan.pageCacheHits(), equalTo( 1234L ) );
98+
assertThat( plan.pageCacheMisses(), equalTo( 3456L ) );
99+
assertThat( plan.pageCacheHitRatio(), equalTo( 0.123 ) );
100+
assertThat( plan.time(), equalTo( 999L ) );
101+
assertThat( plan.operatorType(), equalTo( "AwesomeOperator" ) );
102+
assertThat( plan.identifiers(), equalTo( asList( "n1", "n2" ) ) );
103+
assertThat( plan.arguments().values(), hasItem( new StringValue( "CYPHER 1337" ) ) );
104+
assertThat( plan.children(), empty() );
105+
}
97106
}

driver/src/test/java/org/neo4j/driver/internal/util/MetadataExtractorTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ void shouldBuildResultSummaryWithProfiledPlan()
228228
"identifiers", values( "a", "b" ),
229229
"rows", value( 424242 ),
230230
"dbHits", value( 242424 ),
231+
"time", value( 999 ),
231232
"children", values(
232233
parameters(
233234
"operatorType", "LabelScan",
@@ -249,6 +250,11 @@ void shouldBuildResultSummaryWithProfiledPlan()
249250
assertEquals( asList( "a", "b" ), summary.profile().identifiers() );
250251
assertEquals( 424242, summary.profile().records() );
251252
assertEquals( 242424, summary.profile().dbHits() );
253+
assertEquals( 999, summary.profile().time() );
254+
assertFalse( summary.profile().hasPageCacheStats() );
255+
assertEquals( Double.NaN, summary.profile().pageCacheHitRatio() );
256+
assertEquals( 0, summary.profile().pageCacheMisses() );
257+
assertEquals( 0, summary.profile().pageCacheHits() );
252258

253259
List<ProfiledPlan> children = summary.profile().children();
254260
assertEquals( 1, children.size() );

0 commit comments

Comments
 (0)