-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
TransactionBoundPlanContextTest.scala
95 lines (82 loc) · 4.73 KB
/
TransactionBoundPlanContextTest.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
* Copyright (c) 2002-2017 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.cypher.internal.spi.v3_2
import java.util.Collections
import org.neo4j.cypher.internal.compiler.v3_2.devNullLogger
import org.neo4j.cypher.internal.frontend.v3_2.{LabelId, RelTypeId}
import org.neo4j.cypher.internal.frontend.v3_2.test_helpers.CypherFunSuite
import org.neo4j.cypher.internal.ir.v3_2.Cardinality
import org.neo4j.cypher.javacompat.internal.GraphDatabaseCypherService
import org.neo4j.kernel.api.KernelTransaction.Type._
import org.neo4j.kernel.api.security.SecurityContext.AUTH_DISABLED
import org.neo4j.kernel.impl.coreapi.{InternalTransaction, PropertyContainerLocker}
import org.neo4j.kernel.impl.query.Neo4jTransactionalContextFactory
import org.neo4j.kernel.impl.query.clientconnection.ClientConnectionInfo
import org.neo4j.test.TestGraphDatabaseFactory
class TransactionBoundPlanContextTest extends CypherFunSuite {
private def createTransactionContext(graphDatabaseCypherService: GraphDatabaseCypherService, transaction: InternalTransaction) = {
val contextFactory = Neo4jTransactionalContextFactory.create(graphDatabaseCypherService, new PropertyContainerLocker)
contextFactory.newContext(ClientConnectionInfo.EMBEDDED_CONNECTION, transaction, "no query", Collections.emptyMap())
}
test("statistics should default to single cardinality on empty db") {
val graph = new GraphDatabaseCypherService(new TestGraphDatabaseFactory().newImpermanentDatabase())
val transaction = graph.beginTransaction(explicit, AUTH_DISABLED)
val transactionalContext = createTransactionContext(graph, transaction)
val planContext = new TransactionBoundPlanContext(TransactionalContextWrapper(transactionalContext), devNullLogger)
val statistics = planContext.statistics
// label stats
statistics.nodesWithLabelCardinality(Some(LabelId(0))) should equal(Cardinality.SINGLE)
statistics.nodesWithLabelCardinality(None) should equal(Cardinality.SINGLE)
// pattern stats
Set(Some(LabelId(0)), None).foreach { label1 =>
Set(Some(LabelId(1)), None).foreach { label2 =>
statistics.cardinalityByLabelsAndRelationshipType(label1, Some(RelTypeId(0)), label2) should equal(Cardinality.SINGLE)
statistics.cardinalityByLabelsAndRelationshipType(label1, None, label2) should equal(Cardinality.SINGLE)
}
}
transaction.close()
}
test("statistics should default to single cardinality for unknown counts on nonempty db") {
val graph = new GraphDatabaseCypherService(new TestGraphDatabaseFactory().newImpermanentDatabase())
graph.getGraphDatabaseService.execute("UNWIND range(1, 100) AS i CREATE (:L1)-[:T]->()")
val transaction = graph.beginTransaction(explicit, AUTH_DISABLED)
val transactionalContext = createTransactionContext(graph, transaction)
val planContext = new TransactionBoundPlanContext(TransactionalContextWrapper(transactionalContext), devNullLogger)
val statistics = planContext.statistics
// label stats
statistics.nodesWithLabelCardinality(Some(LabelId(0))) should equal(Cardinality(100))
statistics.nodesWithLabelCardinality(Some(LabelId(1))) should equal(Cardinality.SINGLE)
statistics.nodesWithLabelCardinality(None) should equal(Cardinality(200))
// pattern stats
statistics.cardinalityByLabelsAndRelationshipType(
Some(LabelId(0)), Some(RelTypeId(0)), Some(LabelId(1))) should equal(Cardinality.SINGLE)
statistics.cardinalityByLabelsAndRelationshipType(
Some(LabelId(0)), Some(RelTypeId(0)), None) should equal(Cardinality(100))
statistics.cardinalityByLabelsAndRelationshipType(
Some(LabelId(0)), None, Some(LabelId(1))) should equal(Cardinality.SINGLE)
statistics.cardinalityByLabelsAndRelationshipType(
Some(LabelId(0)), None, None) should equal(Cardinality(100))
statistics.cardinalityByLabelsAndRelationshipType(
None, None, None) should equal(Cardinality(100))
statistics.cardinalityByLabelsAndRelationshipType(
None, Some(RelTypeId(0)), None) should equal(Cardinality(100))
transaction.close()
}
}