-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
Read.java
286 lines (254 loc) · 12.6 KB
/
Read.java
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
/*
* Copyright (c) 2002-2018 "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.internal.kernel.api;
import org.neo4j.internal.kernel.api.exceptions.KernelException;
import org.neo4j.internal.kernel.api.procs.QualifiedName;
import org.neo4j.internal.kernel.api.procs.UserFunctionHandle;
/**
* Defines the graph read operations of the Kernel.
*/
public interface Read
{
int ANY_LABEL = -1;
int ANY_RELATIONSHIP_TYPE = -1;
/**
* @param index {@link IndexReference} referencing index to query.
* @param cursor the cursor to use for consuming the results.
* @param indexOrder requested {@link IndexOrder} of result. Must be among the capabilities of
* {@link IndexReference referenced index}, or {@link IndexOrder#NONE}.
* @param query Combination of {@link IndexQuery index queries} to run against referenced index.
*/
void nodeIndexSeek( IndexReference index, NodeValueIndexCursor cursor, IndexOrder indexOrder, IndexQuery... query )
throws KernelException;
/**
* @param index {@link IndexReference} referencing index to query.
* @param cursor the cursor to use for consuming the results.
* @param indexOrder requested {@link IndexOrder} of result. Must be among the capabilities of
* {@link IndexReference referenced index}, or {@link IndexOrder#NONE}.
*/
void nodeIndexScan( IndexReference index, NodeValueIndexCursor cursor, IndexOrder indexOrder ) throws KernelException;
void nodeLabelScan( int label, NodeLabelIndexCursor cursor );
/**
* Scan for nodes that have a <i>disjunction</i> of the specified labels.
* i.e. MATCH (n) WHERE n:Label1 OR n:Label2 OR ...
*/
void nodeLabelUnionScan( NodeLabelIndexCursor cursor, int... labels );
/**
* Scan for nodes that have a <i>conjunction</i> of the specified labels.
* i.e. MATCH (n) WHERE n:Label1 AND n:Label2 AND ...
*/
void nodeLabelIntersectionScan( NodeLabelIndexCursor cursor, int... labels );
Scan<NodeLabelIndexCursor> nodeLabelScan( int label );
void allNodesScan( NodeCursor cursor );
Scan<NodeCursor> allNodesScan();
/**
* @param reference a reference from {@link NodeCursor#nodeReference()}, {@link
* RelationshipDataAccessor#sourceNodeReference()},
* {@link RelationshipDataAccessor#targetNodeReference()}, {@link NodeIndexCursor#nodeReference()},
* {@link RelationshipIndexCursor#sourceNodeReference()}, or {@link RelationshipIndexCursor#targetNodeReference()}.
* @param cursor the cursor to use for consuming the results.
*/
void singleNode( long reference, NodeCursor cursor );
/**
* Checks if a node exists in the database
*
* @param reference The reference of the node to check
* @return {@code true} if the node exists, otherwise {@code false}
*/
boolean nodeExists( long reference );
/**
* The number of nodes in the graph, including anything changed in the transaction state.
*
* If the label parameter is {@link #ANY_LABEL}, this method returns the total number of nodes in the graph, i.e.
* {@code MATCH (n) RETURN count(n)}.
*
* If the label parameter is set to any other value, this method returns the number of nodes that has that label,
* i.e. {@code MATCH (n:LBL) RETURN count(n)}.
*
* @param labelId the label to get the count for, or {@link #ANY_LABEL} to get the total number of nodes.
* @return the number of matching nodes in the graph.
*/
long countsForNode( int labelId );
/**
* The number of nodes in the graph, without taking into account anything in the transaction state.
*
* If the label parameter is {@link #ANY_LABEL}, this method returns the total number of nodes in the graph, i.e.
* {@code MATCH (n) RETURN count(n)}.
*
* If the label parameter is set to any other value, this method returns the number of nodes that has that label,
* i.e. {@code MATCH (n:LBL) RETURN count(n)}.
*
* @param labelId the label to get the count for, or {@link #ANY_LABEL} to get the total number of nodes.
* @return the number of matching nodes in the graph.
*/
long countsForNodeWithoutTxState( int labelId );
/**
* The number of relationships in the graph, including anything changed in the transaction state.
*
* Returns the number of relationships in the graph that matches the specified pattern,
* {@code (:startLabelId)-[:typeId]->(:endLabelId)}, like so:
*
* <table>
* <thead>
* <tr><th>{@code startLabelId}</th><th>{@code typeId}</th> <th>{@code endLabelId}</th>
* <td></td> <th>Pattern</th> <td></td></tr>
* </thead>
* <tdata>
* <tr>
* <td>{@link #ANY_LABEL}</td> <td>{@link #ANY_RELATIONSHIP_TYPE}</td> <td>{@link #ANY_LABEL}</td>
* <td>{@code MATCH}</td> <td>{@code ()-[r]->()}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@link #ANY_LABEL}</td> <td>{@code REL}</td> <td>{@link #ANY_LABEL}</td>
* <td>{@code MATCH}</td> <td>{@code ()-[r:REL]->()}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@code LHS}</td> <td>{@link #ANY_RELATIONSHIP_TYPE}</td> <td>{@link #ANY_LABEL}</td>
* <td>{@code MATCH}</td> <td>{@code (:LHS)-[r]->()}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@link #ANY_LABEL}</td> <td>{@link #ANY_RELATIONSHIP_TYPE}</td> <td>{@code RHS}</td>
* <td>{@code MATCH}</td> <td>{@code ()-[r]->(:RHS)}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@code LHS}</td> <td>{@code REL}</td> <td>{@link #ANY_LABEL}</td>
* <td>{@code MATCH}</td> <td>{@code (:LHS)-[r:REL]->()}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@link #ANY_LABEL}</td> <td>{@code REL}</td> <td>{@code RHS}</td>
* <td>{@code MATCH}</td> <td>{@code ()-[r:REL]->(:RHS)}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* </tdata>
* </table>
*
* @param startLabelId the label of the start node of relationships to get the count for, or {@link #ANY_LABEL}.
* @param typeId the type of relationships to get a count for, or {@link #ANY_RELATIONSHIP_TYPE}.
* @param endLabelId the label of the end node of relationships to get the count for, or {@link #ANY_LABEL}.
* @return the number of matching relationships in the graph.
*/
long countsForRelationship( int startLabelId, int typeId, int endLabelId );
/**
* The number of relationships in the graph, without taking into account anything in the transaction state.
*
* Returns the number of relationships in the graph that matches the specified pattern,
* {@code (:startLabelId)-[:typeId]->(:endLabelId)}, like so:
*
* <table>
* <thead>
* <tr><th>{@code startLabelId}</th><th>{@code typeId}</th> <th>{@code endLabelId}</th>
* <td></td> <th>Pattern</th> <td></td></tr>
* </thead>
* <tdata>
* <tr>
* <td>{@link #ANY_LABEL}</td> <td>{@link #ANY_RELATIONSHIP_TYPE}</td> <td>{@link #ANY_LABEL}</td>
* <td>{@code MATCH}</td> <td>{@code ()-[r]->()}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@link #ANY_LABEL}</td> <td>{@code REL}</td> <td>{@link #ANY_LABEL}</td>
* <td>{@code MATCH}</td> <td>{@code ()-[r:REL]->()}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@code LHS}</td> <td>{@link #ANY_RELATIONSHIP_TYPE}</td> <td>{@link #ANY_LABEL}</td>
* <td>{@code MATCH}</td> <td>{@code (:LHS)-[r]->()}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@link #ANY_LABEL}</td> <td>{@link #ANY_RELATIONSHIP_TYPE}</td> <td>{@code RHS}</td>
* <td>{@code MATCH}</td> <td>{@code ()-[r]->(:RHS)}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@code LHS}</td> <td>{@code REL}</td> <td>{@link #ANY_LABEL}</td>
* <td>{@code MATCH}</td> <td>{@code (:LHS)-[r:REL]->()}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* <tr>
* <td>{@link #ANY_LABEL}</td> <td>{@code REL}</td> <td>{@code RHS}</td>
* <td>{@code MATCH}</td> <td>{@code ()-[r:REL]->(:RHS)}</td> <td>{@code RETURN count(r)}</td>
* </tr>
* </tdata>
* </table>
*
* @param startLabelId the label of the start node of relationships to get the count for, or {@link #ANY_LABEL}.
* @param typeId the type of relationships to get a count for, or {@link #ANY_RELATIONSHIP_TYPE}.
* @param endLabelId the label of the end node of relationships to get the count for, or {@link #ANY_LABEL}.
* @return the number of matching relationships in the graph.
*/
long countsForRelationshipWithoutTxState( int startLabelId, int typeId, int endLabelId );
/**
* @param reference
* a reference from {@link RelationshipDataAccessor#relationshipReference()}.
* @param cursor
* the cursor to use for consuming the results.
*/
void singleRelationship( long reference, RelationshipScanCursor cursor );
/**
* Checks if a relationship exists in the database
*
* @param reference The reference of the relationship to check
* @return <tt>true</tt> if the relationship exists, otherwise <tt>false</tt>
*/
boolean relationshipExists( long reference );
void allRelationshipsScan( RelationshipScanCursor cursor );
Scan<RelationshipScanCursor> allRelationshipsScan();
void relationshipLabelScan( int label, RelationshipScanCursor cursor );
Scan<RelationshipScanCursor> relationshipLabelScan( int label );
/**
* @param nodeReference
* a reference from {@link NodeCursor#nodeReference()}.
* @param reference
* a reference from {@link NodeCursor#relationshipGroupReference()}.
* @param cursor
* the cursor to use for consuming the results.
*/
void relationshipGroups( long nodeReference, long reference, RelationshipGroupCursor cursor );
/**
* @param nodeReference
* a reference from {@link NodeCursor#nodeReference()}.
* @param reference
* a reference from {@link RelationshipGroupCursor#outgoingReference()},
* {@link RelationshipGroupCursor#incomingReference()},
* or {@link RelationshipGroupCursor#loopsReference()}.
* @param cursor
* the cursor to use for consuming the results.
*/
void relationships( long nodeReference, long reference, RelationshipTraversalCursor cursor );
/**
* @param nodeReference
* the owner of the properties.
* @param reference
* a reference from {@link NodeCursor#propertiesReference()}.
* @param cursor
* the cursor to use for consuming the results.
*/
void nodeProperties( long nodeReference, long reference, PropertyCursor cursor );
/**
* @param relationshipReference
* the owner of the properties.
* @param reference
* a reference from {@link RelationshipDataAccessor#propertiesReference()}.
* @param cursor
* the cursor to use for consuming the results.
*/
void relationshipProperties( long relationshipReference, long reference, PropertyCursor cursor );
void graphProperties( PropertyCursor cursor );
// hints to the page cache about data we will be accessing in the future:
void futureNodeReferenceRead( long reference );
void futureRelationshipsReferenceRead( long reference );
void futureNodePropertyReferenceRead( long reference );
void futureRelationshipPropertyReferenceRead( long reference );
}