optimize for the more common case of single value facets when loading values
This commit is contained in:
parent
59ee8493ce
commit
d283c158d2
|
@ -40,11 +40,11 @@ public class FieldDataLoader {
|
||||||
loader.init();
|
loader.init();
|
||||||
|
|
||||||
field = StringHelper.intern(field);
|
field = StringHelper.intern(field);
|
||||||
int[][] ordinals = new int[reader.maxDoc()][];
|
int[] ordinals = new int[reader.maxDoc()];
|
||||||
|
int[][] multiValueOrdinals = null;
|
||||||
|
|
||||||
int t = 1; // current term number
|
int t = 1; // current term number
|
||||||
|
|
||||||
boolean multiValued = false;
|
|
||||||
TermDocs termDocs = reader.termDocs();
|
TermDocs termDocs = reader.termDocs();
|
||||||
TermEnum termEnum = reader.terms(new Term(field));
|
TermEnum termEnum = reader.terms(new Term(field));
|
||||||
try {
|
try {
|
||||||
|
@ -55,16 +55,43 @@ public class FieldDataLoader {
|
||||||
termDocs.seek(termEnum);
|
termDocs.seek(termEnum);
|
||||||
while (termDocs.next()) {
|
while (termDocs.next()) {
|
||||||
int doc = termDocs.doc();
|
int doc = termDocs.doc();
|
||||||
int[] ordinalPerDoc = ordinals[doc];
|
if (multiValueOrdinals != null) {
|
||||||
if (ordinalPerDoc == null) {
|
int[] ordinalPerDoc = multiValueOrdinals[doc];
|
||||||
ordinalPerDoc = new int[1];
|
if (ordinalPerDoc == null) {
|
||||||
ordinalPerDoc[0] = t;
|
ordinalPerDoc = new int[1];
|
||||||
ordinals[doc] = ordinalPerDoc;
|
ordinalPerDoc[0] = t;
|
||||||
|
multiValueOrdinals[doc] = ordinalPerDoc;
|
||||||
|
} else {
|
||||||
|
ordinalPerDoc = Arrays.copyOf(ordinalPerDoc, ordinalPerDoc.length + 1);
|
||||||
|
ordinalPerDoc[ordinalPerDoc.length - 1] = t;
|
||||||
|
multiValueOrdinals[doc] = ordinalPerDoc;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
multiValued = true;
|
int ordinal = ordinals[doc];
|
||||||
ordinalPerDoc = Arrays.copyOf(ordinalPerDoc, ordinalPerDoc.length + 1);
|
if (ordinal == 0) { // still not multi valued...
|
||||||
ordinalPerDoc[ordinalPerDoc.length - 1] = t;
|
ordinals[doc] = t;
|
||||||
ordinals[doc] = ordinalPerDoc;
|
} else {
|
||||||
|
// move to multi valued
|
||||||
|
multiValueOrdinals = new int[reader.maxDoc()][];
|
||||||
|
for (int i = 0; i < ordinals.length; i++) {
|
||||||
|
ordinal = ordinals[i];
|
||||||
|
if (ordinal != 0) {
|
||||||
|
multiValueOrdinals[i] = new int[1];
|
||||||
|
multiValueOrdinals[i][0] = ordinal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// now put the current "t" value
|
||||||
|
int[] ordinalPerDoc = multiValueOrdinals[doc];
|
||||||
|
if (ordinalPerDoc == null) {
|
||||||
|
ordinalPerDoc = new int[1];
|
||||||
|
ordinalPerDoc[0] = t;
|
||||||
|
multiValueOrdinals[doc] = ordinalPerDoc;
|
||||||
|
} else {
|
||||||
|
ordinalPerDoc = Arrays.copyOf(ordinalPerDoc, ordinalPerDoc.length + 1);
|
||||||
|
ordinalPerDoc[ordinalPerDoc.length - 1] = t;
|
||||||
|
multiValueOrdinals[doc] = ordinalPerDoc;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,17 +108,10 @@ public class FieldDataLoader {
|
||||||
termEnum.close();
|
termEnum.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (multiValued) {
|
if (multiValueOrdinals != null) {
|
||||||
return loader.buildMultiValue(field, ordinals);
|
return loader.buildMultiValue(field, multiValueOrdinals);
|
||||||
} else {
|
} else {
|
||||||
// optimize for a single valued
|
return loader.buildSingleValue(field, ordinals);
|
||||||
int[] sOrders = new int[reader.maxDoc()];
|
|
||||||
for (int i = 0; i < ordinals.length; i++) {
|
|
||||||
if (ordinals[i] != null) {
|
|
||||||
sOrders[i] = ordinals[i][0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return loader.buildSingleValue(field, sOrders);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue