Skip to content

Commit 7997432

Browse files
committed
性能优化,去掉r
1 parent 6714519 commit 7997432

File tree

4 files changed

+15
-62
lines changed

4 files changed

+15
-62
lines changed

src/main/java/org/wowtools/neo4j/rtree/RtreeIntersectsSearcher.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ public void intersects(RectNd bbox, Transaction tx, BooleanDataNodeVisitor visit
9292
Map<String, Object> properties = node.getAllProperties();
9393
int size = (int) properties.get("size");
9494
for (int i = 0; i < size; i++) {
95-
double[] rMin = (double[]) properties.get("rMin" + i);
96-
double[] rMax = (double[]) properties.get("rMax" + i);
95+
double[] rMin = (double[]) properties.get("entryMin" + i);
96+
double[] rMax = (double[]) properties.get("entryMax" + i);
9797
RectNd dataMbr = new RectNd(rMin, rMax);
9898
if (bbox.intersects(dataMbr)) {
9999
if (visitor.visit((long) properties.get("entryDataId" + i))) {

src/main/java/org/wowtools/neo4j/rtree/internal/edit/CacheNode.java

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ public String toString() {
3131
private final HashSet<String> changedKey = new HashSet<>();//标记哪些属性发生过变化,commit时统一node.setProperty
3232
private RectNd mbr;
3333
private org.wowtools.neo4j.rtree.internal.edit.Node[] children;
34-
private RectNd[] r;
3534
private RectNd[] entry;
3635

3736
public final NodeType nodeType;
@@ -63,7 +62,6 @@ public void clearCache() {
6362
changedKey.clear();
6463
mbr = null;
6564
children = null;
66-
r = null;
6765
entry = null;
6866
}
6967

@@ -198,34 +196,7 @@ public int addChild(final org.wowtools.neo4j.rtree.internal.edit.Node n) {
198196
}
199197
}
200198

201-
public RectNd[] getR() {
202-
if (null == r) {
203-
int mMax = (int) getProperty("mMax");
204-
r = new RectNd[mMax];
205-
for (int i = 0; i < mMax; i++) {
206-
double[] rMinI = (double[]) getProperty("rMin" + i);
207-
if (null == rMinI) {
208-
continue;
209-
}
210-
double[] rMaxI = (double[]) getProperty("rMax" + i);
211-
r[i] = new RectNd(new PointNd(rMinI), new PointNd(rMaxI));
212-
}
213-
}
214-
return r;
215-
}
216199

217-
public void setRAtI(int i, RectNd ri) {
218-
r = getR();
219-
if (null == ri) {
220-
setProperty("rMin" + i, null);
221-
setProperty("rMax" + i, null);
222-
} else {
223-
setProperty("rMin" + i, ri.getMinXs());
224-
setProperty("rMax" + i, ri.getMaxXs());
225-
}
226-
r[i] = ri;
227-
228-
}
229200

230201
public RectNd[] getEntry() {
231202
if (null == entry) {

src/main/java/org/wowtools/neo4j/rtree/internal/edit/NodeOfAxialSplitLeaf.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,12 @@ protected NodeOfAxialSplitLeaf(final RectBuilder builder, final int mMin, final
5353
protected Node split(final RectNd t) {
5454
int size = (int) cacheNode.getProperty("size");
5555
RectNd[] entry = cacheNode.getEntry();
56-
RectNd[] r = cacheNode.getR();
5756
RectNd mbr = cacheNode.getMbr();
5857

5958
final NodeOfBranch pNode = new NodeOfBranch(builder, mMin, mMax, txCell);
6059
final Node l1Node = create(builder, mMin, mMax, txCell);
6160
final Node l2Node = create(builder, mMin, mMax, txCell);
62-
final int nD = r[0].getNDim();
61+
final int nD = entry[0].getNDim();
6362

6463
// choose axis to split
6564
int axis = 0;
@@ -76,7 +75,7 @@ protected Node split(final RectNd t) {
7675
final int splitDimension = axis;
7776

7877
// sort along split dimension
79-
final RectNd[] sortedMbr = Arrays.copyOf(r, r.length);
78+
final RectNd[] sortedMbr = Arrays.copyOf(entry, entry.length);
8079

8180
Arrays.sort(sortedMbr, new Comparator<RectNd>() {
8281
@Override
@@ -92,7 +91,7 @@ public int compare(final RectNd o1, final RectNd o2) {
9291
for (int i = 0; i < size / 2; i++) {
9392
outerLoop:
9493
for (int j = 0; j < size; j++) {
95-
if (r[j] == sortedMbr[i]) {
94+
if (entry[j] == sortedMbr[i]) {
9695
l1Node.add(entry[j]);
9796
break outerLoop;
9897
}
@@ -102,7 +101,7 @@ public int compare(final RectNd o1, final RectNd o2) {
102101
for (int i = size / 2; i < size; i++) {
103102
outerLoop:
104103
for (int j = 0; j < size; j++) {
105-
if (r[j] == sortedMbr[i]) {
104+
if (entry[j] == sortedMbr[i]) {
106105
l2Node.add(entry[j]);
107106
break outerLoop;
108107
}

src/main/java/org/wowtools/neo4j/rtree/internal/edit/NodeOfLeaf.java

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ public Node add(final RectNd t) {
7979
mbr = tRect;
8080
}
8181
cacheNode.setMbr((RectNd) mbr);
82-
cacheNode.setRAtI(size, (RectNd) tRect);
8382
cacheNode.setEntryAtI(size, t);
8483
size = size + 1;
8584
cacheNode.setProperty("size", size);
@@ -109,20 +108,13 @@ public Node remove(final RectNd t) {
109108

110109
if (i < j) {
111110
final int nRemoved = j - i;
112-
RectNd[] r = cacheNode.getR();
113111
if (j < size) {
114112
final int nRemaining = size - j;
115-
// System.arraycopy(r, j, r, i, nRemaining);
116-
for (int i1 = 0; i1 < nRemaining; i1++) {
117-
cacheNode.setRAtI(i + i1, (RectNd) r[j + i1]);
118-
}
119-
// System.arraycopy(entry, j, entry, i, nRemaining);
120113
for (int i1 = 0; i1 < nRemaining; i1++) {
121114
cacheNode.setEntryAtI(i + i1, entry[j + i1]);
122115
}
123116

124117
for (int k = size - nRemoved; k < size; k++) {
125-
cacheNode.setRAtI(k, null);
126118
cacheNode.setEntryAtI(k, null);
127119
}
128120
} else {
@@ -131,7 +123,6 @@ public Node remove(final RectNd t) {
131123
return null;
132124
}
133125
for (int k = i; k < size; k++) {
134-
cacheNode.setRAtI(k, null);
135126
cacheNode.setEntryAtI(k, null);
136127
}
137128
}
@@ -142,9 +133,9 @@ public Node remove(final RectNd t) {
142133
RectNd mbr = null;
143134
for (int k = 0; k < size; k++) {
144135
if (k == 0) {
145-
mbr = r[k];
136+
mbr = entry[k];
146137
} else {
147-
mbr = mbr.getMbr(r[k]);
138+
mbr = mbr.getMbr(entry[k]);
148139
}
149140
}
150141
if (null != mbr) {
@@ -161,19 +152,16 @@ public Node remove(final RectNd t) {
161152
public Node update(final RectNd told, final RectNd tnew) {
162153
int size = (int) cacheNode.getProperty("size");
163154
RectNd[] entry = cacheNode.getEntry();
164-
RectNd[] r = cacheNode.getR();
165-
final RectNd bbox = builder.getBBox(tnew);
166155

167156
RectNd mbr = null;
168157
for (int i = 0; i < size; i++) {
169158
if (entry[i].equals(told)) {
170-
cacheNode.setRAtI(i, (RectNd) bbox);
171159
cacheNode.setEntryAtI(i, tnew);
172160
}
173161
if (i == 0) {
174-
mbr = r[i];
162+
mbr = entry[i];
175163
} else {
176-
mbr = mbr.getMbr(r[i]);
164+
mbr = mbr.getMbr(entry[i]);
177165
}
178166
}
179167
if (null != mbr) {
@@ -189,10 +177,9 @@ public int search(final RectNd rect, final RectNd[] t, int n) {
189177
final int n0 = n;
190178
int size = (int) cacheNode.getProperty("size");
191179
RectNd[] entry = cacheNode.getEntry();
192-
RectNd[] r = cacheNode.getR();
193180

194181
for (int i = 0; i < size && n < tLen; i++) {
195-
if (rect.contains(r[i])) {
182+
if (rect.contains(entry[i])) {
196183
t[n++] = entry[i];
197184
}
198185
}
@@ -203,9 +190,8 @@ public int search(final RectNd rect, final RectNd[] t, int n) {
203190
public void search(RectNd rect, Consumer consumer) {
204191
int size = (int) cacheNode.getProperty("size");
205192
RectNd[] entry = cacheNode.getEntry();
206-
RectNd[] r = cacheNode.getR();
207193
for (int i = 0; i < size; i++) {
208-
if (rect.contains(r[i])) {
194+
if (rect.contains(entry[i])) {
209195
consumer.accept(entry[i]);
210196
}
211197
}
@@ -218,10 +204,9 @@ public int intersects(final RectNd rect, final RectNd[] t, int n) {
218204

219205
int size = (int) cacheNode.getProperty("size");
220206
RectNd[] entry = cacheNode.getEntry();
221-
RectNd[] r = cacheNode.getR();
222207

223208
for (int i = 0; i < size && n < tLen; i++) {
224-
if (rect.intersects(r[i])) {
209+
if (rect.intersects(entry[i])) {
225210
t[n++] = entry[i];
226211
}
227212
}
@@ -232,10 +217,9 @@ public int intersects(final RectNd rect, final RectNd[] t, int n) {
232217
public void intersects(RectNd rect, Consumer consumer) {
233218
int size = (int) cacheNode.getProperty("size");
234219
RectNd[] entry = cacheNode.getEntry();
235-
RectNd[] r = cacheNode.getR();
236220

237221
for (int i = 0; i < size; i++) {
238-
if (rect.intersects(r[i])) {
222+
if (rect.intersects(entry[i])) {
239223
consumer.accept(entry[i]);
240224
}
241225
}
@@ -288,10 +272,9 @@ public void forEach(Consumer consumer) {
288272
public boolean contains(RectNd rect, RectNd t) {
289273
int size = (int) cacheNode.getProperty("size");
290274
RectNd[] entry = cacheNode.getEntry();
291-
RectNd[] r = cacheNode.getR();
292275

293276
for (int i = 0; i < size; i++) {
294-
if (rect.contains(r[i])) {
277+
if (rect.contains(entry[i])) {
295278
if (entry[i].equals(t)) {
296279
return true;
297280
}

0 commit comments

Comments
 (0)