-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
IndexCapability.java
81 lines (74 loc) · 3.84 KB
/
IndexCapability.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
/*
* 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.values.storable.ValueGroup;
/**
* Capabilities of an index.
* Capabilities of an index can not change during the indexes lifetimes.
* Caching of IndexCapability is allowed.
* It does NOT describe the capabilities of the index at some given moment. For example it does not describe
* index state. Rather it describe the functionality that index provide given that it is available.
*/
public interface IndexCapability
{
IndexOrder[] ORDER_ASC = {IndexOrder.ASCENDING};
IndexOrder[] ORDER_NONE = new IndexOrder[0];
/**
* What possible orderings is this index capable to provide for a query on given combination of {@link ValueGroup}.
* Ordering of ValueGroup correspond to ordering of related {@link IndexReference#properties()}.
*
* @param valueGroups Ordered array of {@link ValueGroup ValueGroups} for which index should be queried. Note that valueGroup
* must correspond to related {@link IndexReference#properties()}. A {@code null} value in the array
* ({@code new ValueGroup[]{null}}) is interpreted as a wildcard for any {@link ValueGroup}. Note that this is not the same as
* {@code order(null)} which is undefined.
* @return {@link IndexOrder} array containing all possible orderings for provided value groups or empty array if no explicit
* ordering is possible or if length of {@code valueGroups} and {@link IndexReference#properties()} differ.
*/
IndexOrder[] orderCapability( ValueGroup... valueGroups );
/**
* Is the index capable of providing values for a query on given combination of {@link ValueGroup}.
* Ordering of ValueGroup correspond to ordering of {@code properties} in related {@link IndexReference}.
*
* @param valueGroups Ordered array of {@link ValueGroup ValueGroups} for which index should be queried. Note that valueGroup
* must correspond to related {@link IndexReference#properties()}. {@link ValueGroup#UNKNOWN} can be used as a wildcard for
* any {@link ValueGroup}. Behaviour is undefined for empty {@code null} array and {@code null} values in array.
* @return {@link IndexValueCapability#YES} if index is capable of providing values for query on provided array of value groups,
* {@link IndexValueCapability#NO} if not or {@link IndexValueCapability#PARTIAL} for some results. If length of
* {@code valueGroups} and {@link IndexReference#properties()} differ {@link IndexValueCapability#NO} is returned.
*/
IndexValueCapability valueCapability( ValueGroup... valueGroups );
default boolean singleWildcard( ValueGroup[] valueGroups )
{
return valueGroups.length == 1 && valueGroups[0] == ValueGroup.UNKNOWN;
}
IndexCapability NO_CAPABILITY = new IndexCapability()
{
@Override
public IndexOrder[] orderCapability( ValueGroup... valueGroups )
{
return ORDER_NONE;
}
@Override
public IndexValueCapability valueCapability( ValueGroup... valueGroups )
{
return IndexValueCapability.NO;
}
};
}