Index: solr/core/src/java/org/apache/solr/handler/export/SortValue.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/SortValue.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/SortValue.java (date 1533161803000) @@ -27,4 +27,12 @@ public void setCurrentValue(SortValue value); public void reset(); public SortValue copy(); + public Object getCurrentValue() throws IOException; + public String getField(); + + /** + * + * @return true if document has a value for the specified field + */ + public boolean isPresent(); } \ No newline at end of file Index: solr/core/src/java/org/apache/solr/handler/export/DateFieldWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/DateFieldWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/DateFieldWriter.java (date 1533162023000) @@ -32,13 +32,24 @@ this.field = field; } - public boolean write(int docId, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { - NumericDocValues vals = DocValues.getNumeric(reader, this.field); - long val; - if (vals.advance(docId) == docId) { - val = vals.longValue(); - } else { - return false; + public boolean write(SortDoc sortDoc, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { + Long val; + SortValue sortValue = sortDoc.getSortValue(this.field); + if (sortValue != null) { + if (sortValue.isPresent()) { + val = (long) sortValue.getCurrentValue(); + } + else { // value not present for requested field computed while sorting + return false; + } + } else { + // field is not part of 'sort' param, but part of 'fl' param + NumericDocValues vals = DocValues.getNumeric(reader, this.field); + if (vals.advance(sortDoc.docId) == sortDoc.docId) { + val = vals.longValue(); + } else { + return false; + } } ew.put(this.field, new Date(val)); return true; Index: solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java (date 1533161803000) @@ -290,7 +290,7 @@ LeafReaderContext context = leaves.get(ord); int fieldIndex = 0; for (FieldWriter fieldWriter : fieldWriters) { - if (fieldWriter.write(sortDoc.docId, context.reader(), ew, fieldIndex)) { + if (fieldWriter.write(sortDoc, context.reader(), ew, fieldIndex)) { ++fieldIndex; } } Index: solr/core/src/java/org/apache/solr/handler/export/LongFieldWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/LongFieldWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/LongFieldWriter.java (date 1533162527000) @@ -31,13 +31,24 @@ this.field = field; } - public boolean write(int docId, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { - NumericDocValues vals = DocValues.getNumeric(reader, this.field); - long val; - if (vals.advance(docId) == docId) { - val = vals.longValue(); - } else { - return false; + public boolean write(SortDoc sortDoc, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { + Long val; + SortValue sortValue = sortDoc.getSortValue(this.field); + if (sortValue != null) { + if (sortValue.isPresent()) { + val = (long) sortValue.getCurrentValue(); + } + else { // value not present for requested field computed while sorting + return false; + } + } else { + // field is not part of 'sort' param, but part of 'fl' param + NumericDocValues vals = DocValues.getNumeric(reader, this.field); + if (vals.advance(sortDoc.docId) == sortDoc.docId) { + val = vals.longValue(); + } else { + return false; + } } ew.put(field, val); return true; Index: solr/core/src/java/org/apache/solr/handler/export/BoolFieldWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/BoolFieldWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/BoolFieldWriter.java (date 1533163180000) @@ -37,14 +37,25 @@ this.fieldType = fieldType; } - public boolean write(int docId, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { - SortedDocValues vals = DocValues.getSorted(reader, this.field); - if (vals.advance(docId) != docId) { - return false; - } - int ord = vals.ordValue(); + public boolean write(SortDoc sortDoc, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { + BytesRef ref; + SortValue sortValue = sortDoc.getSortValue(this.field); + if (sortValue != null) { + if (sortValue.isPresent()) { + ref = (BytesRef) sortValue.getCurrentValue(); + } else { // value not present for requested field computed while sorting + return false; + } + } else { + // field is not part of 'sort' param, but part of 'fl' param + SortedDocValues vals = DocValues.getSorted(reader, this.field); + if (vals.advance(sortDoc.docId) != sortDoc.docId) { + return false; + } + int ord = vals.ordValue(); + ref = vals.lookupOrd(ord); + } - BytesRef ref = vals.lookupOrd(ord); fieldType.indexedToReadable(ref, cref); ew.put(this.field, "true".equals(cref.toString())); return true; Index: solr/core/src/java/org/apache/solr/handler/export/DoubleValue.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/DoubleValue.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/DoubleValue.java (date 1533161803000) @@ -32,6 +32,7 @@ protected DoubleComp comp; private int lastDocID; private LeafReader reader; + private boolean present = false; public DoubleValue(String field, DoubleComp comp) { this.field = field; @@ -39,8 +40,23 @@ this.currentValue = comp.resetValue(); } + public DoubleValue(String field, DoubleComp comp, boolean present) { + this.field = field; + this.comp = comp; + this.currentValue = comp.resetValue(); + this.present = present; + } + + public Object getCurrentValue() { + return currentValue; + } + + public String getField() { + return field; + } + public DoubleValue copy() { - return new DoubleValue(field, comp); + return new DoubleValue(field, comp, present); } public void setNextReader(LeafReaderContext context) throws IOException { @@ -59,15 +75,23 @@ curDocID = vals.advance(docId); } if (docId == curDocID) { + present = true; currentValue = Double.longBitsToDouble(vals.longValue()); } else { + present = false; currentValue = 0f; } } + @Override + public boolean isPresent() { + return present; + } + public void setCurrentValue(SortValue sv) { DoubleValue dv = (DoubleValue)sv; this.currentValue = dv.currentValue; + this.present = dv.present; } public void reset() { Index: solr/core/src/java/org/apache/solr/handler/export/LongValue.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/LongValue.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/LongValue.java (date 1533161803000) @@ -30,6 +30,7 @@ protected long currentValue; protected LongComp comp; private int lastDocID; + private boolean present = false; public LongValue(String field, LongComp comp) { this.field = field; @@ -37,8 +38,23 @@ this.currentValue = comp.resetValue(); } + public LongValue(String field, LongComp comp, boolean present) { + this.field = field; + this.comp = comp; + this.currentValue = comp.resetValue(); + this.present = present; + } + + public Object getCurrentValue() { + return currentValue; + } + + public String getField() { + return field; + } + public LongValue copy() { - return new LongValue(field, comp); + return new LongValue(field, comp, present); } public void setNextReader(LeafReaderContext context) throws IOException { @@ -56,15 +72,23 @@ curDocID = vals.advance(docId); } if (docId == curDocID) { + present = true; currentValue = vals.longValue(); } else { + present = false; currentValue = 0; } } + @Override + public boolean isPresent() { + return present; + } + public void setCurrentValue(SortValue sv) { LongValue lv = (LongValue)sv; this.currentValue = lv.currentValue; + this.present = lv.present; } public int compareTo(SortValue o) { Index: solr/core/src/java/org/apache/solr/handler/export/FieldWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/FieldWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/FieldWriter.java (date 1533161803000) @@ -23,5 +23,5 @@ import org.apache.solr.common.MapWriter; abstract class FieldWriter { - public abstract boolean write(int docId, LeafReader reader, MapWriter.EntryWriter out, int fieldIndex) throws IOException; + public abstract boolean write(SortDoc sortDoc, LeafReader reader, MapWriter.EntryWriter out, int fieldIndex) throws IOException; } \ No newline at end of file Index: solr/core/src/java/org/apache/solr/handler/export/IntFieldWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/IntFieldWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/IntFieldWriter.java (date 1533162724000) @@ -31,15 +31,26 @@ this.field = field; } - public boolean write(int docId, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { - NumericDocValues vals = DocValues.getNumeric(reader, this.field); - int val; - if (vals.advance(docId) == docId) { - val = (int) vals.longValue(); - } else { - return false; + public boolean write(SortDoc sortDoc, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { + Integer val; + SortValue sortValue = sortDoc.getSortValue(this.field); + if (sortValue != null) { + if (sortValue.isPresent()) { + val = (Integer) sortValue.getCurrentValue(); + } + else { // value not present for requested field computed while sorting + return false; + } + } else { + // field is not part of 'sort' param, but part of 'fl' param + NumericDocValues vals = DocValues.getNumeric(reader, this.field); + if (vals.advance(sortDoc.docId) == sortDoc.docId) { + val = (int) vals.longValue(); + } else { + return false; + } } ew.put(this.field, val); return true; } -} +} \ No newline at end of file Index: solr/core/src/java/org/apache/solr/handler/export/StringFieldWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/StringFieldWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/StringFieldWriter.java (date 1533162662000) @@ -37,14 +37,25 @@ this.fieldType = fieldType; } - public boolean write(int docId, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { - SortedDocValues vals = DocValues.getSorted(reader, this.field); - if (vals.advance(docId) != docId) { - return false; - } - int ord = vals.ordValue(); - - BytesRef ref = vals.lookupOrd(ord); + public boolean write(SortDoc sortDoc, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { + BytesRef ref; + SortValue sortValue = sortDoc.getSortValue(this.field); + if (sortValue != null) { + if (sortValue.isPresent()) { + ref = (BytesRef) sortValue.getCurrentValue(); + } + else { // value not present for requested field computed while sorting + return false; + } + } else { + // field is not part of 'sort' param, but part of 'fl' param + SortedDocValues vals = DocValues.getSorted(reader, this.field); + if (vals.advance(sortDoc.docId) != sortDoc.docId) { + return false; + } + int ord = vals.ordValue(); + ref = vals.lookupOrd(ord); + } fieldType.indexedToReadable(ref, cref); ew.put(this.field, cref.toString()); return true; Index: solr/core/src/java/org/apache/solr/handler/export/DoubleFieldWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/DoubleFieldWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/DoubleFieldWriter.java (date 1533162217000) @@ -31,15 +31,27 @@ this.field = field; } - public boolean write(int docId, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { - NumericDocValues vals = DocValues.getNumeric(reader, this.field); - long val; - if (vals.advance(docId) == docId) { - val = vals.longValue(); - } else { - return false; + public boolean write(SortDoc sortDoc, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { + SortValue sortValue = sortDoc.getSortValue(this.field); + if (sortValue != null) { + if (sortValue.isPresent()) { + double val = (double) sortValue.getCurrentValue(); + ew.put(this.field, val); + return true; + } + else { // value not present for requested field computed while sorting + return false; + } + } else { + // field is not part of 'sort' param, but part of 'fl' param + NumericDocValues vals = DocValues.getNumeric(reader, this.field); + if (vals.advance(sortDoc.docId) == sortDoc.docId) { + long val = vals.longValue(); + ew.put(this.field, Double.longBitsToDouble(val)); + return true; + } else { + return false; + } } - ew.put(this.field, Double.longBitsToDouble(val)); - return true; } } \ No newline at end of file Index: solr/core/src/java/org/apache/solr/handler/export/FloatFieldWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/FloatFieldWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/FloatFieldWriter.java (date 1533162337000) @@ -31,15 +31,27 @@ this.field = field; } - public boolean write(int docId, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { - NumericDocValues vals = DocValues.getNumeric(reader, this.field); - int val; - if (vals.advance(docId) == docId) { - val = (int)vals.longValue(); - } else { - return false; + public boolean write(SortDoc sortDoc, LeafReader reader, MapWriter.EntryWriter ew, int fieldIndex) throws IOException { + SortValue sortValue = sortDoc.getSortValue(this.field); + if (sortValue != null) { + if (sortValue.isPresent()) { + float val = (float) sortValue.getCurrentValue(); + ew.put(this.field, val); + return true; + } + else { // value not present for requested field computed while sorting + return false; + } + } else { + // field is not part of 'sort' param, but part of 'fl' param + NumericDocValues vals = DocValues.getNumeric(reader, this.field); + if (vals.advance(sortDoc.docId) == sortDoc.docId) { + int val = (int) vals.longValue(); + ew.put(this.field, Float.intBitsToFloat(val)); + return true; + } else { + return false; + } } - ew.put(this.field, Float.intBitsToFloat(val)); - return true; } } \ No newline at end of file Index: solr/core/src/java/org/apache/solr/handler/export/FloatValue.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/FloatValue.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/FloatValue.java (date 1533161803000) @@ -30,6 +30,7 @@ protected float currentValue; protected FloatComp comp; private int lastDocID; + private boolean present = false; public FloatValue(String field, FloatComp comp) { this.field = field; @@ -37,8 +38,23 @@ this.currentValue = comp.resetValue(); } + public FloatValue(String field, FloatComp comp, boolean present) { + this.field = field; + this.comp = comp; + this.currentValue = comp.resetValue(); + this.present =present; + } + + public Object getCurrentValue() { + return currentValue; + } + + public String getField() { + return field; + } + public FloatValue copy() { - return new FloatValue(field, comp); + return new FloatValue(field, comp, present); } public void setNextReader(LeafReaderContext context) throws IOException { @@ -56,15 +72,23 @@ curDocID = vals.advance(docId); } if (docId == curDocID) { + present = true; currentValue = Float.intBitsToFloat((int)vals.longValue()); } else { + present = false; currentValue = 0f; } } + @Override + public boolean isPresent() { + return present; + } + public void setCurrentValue(SortValue sv) { FloatValue fv = (FloatValue)sv; this.currentValue = fv.currentValue; + this.present = fv.present; } public void reset() { Index: solr/core/src/java/org/apache/solr/handler/export/MultiFieldWriter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/MultiFieldWriter.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/MultiFieldWriter.java (date 1533161803000) @@ -54,10 +54,10 @@ } } - public boolean write(int docId, LeafReader reader, MapWriter.EntryWriter out, int fieldIndex) throws IOException { + public boolean write(SortDoc sortDoc, LeafReader reader, MapWriter.EntryWriter out, int fieldIndex) throws IOException { if (this.fieldType.isPointField()) { SortedNumericDocValues vals = DocValues.getSortedNumeric(reader, this.field); - if (!vals.advanceExact(docId)) return false; + if (!vals.advanceExact(sortDoc.docId)) return false; out.put(this.field, (IteratorWriter) w -> { for (int i = 0; i < vals.docValueCount(); i++) { @@ -67,7 +67,7 @@ return true; } else { SortedSetDocValues vals = DocValues.getSortedSet(reader, this.field); - if (vals.advance(docId) != docId) return false; + if (vals.advance(sortDoc.docId) != sortDoc.docId) return false; out.put(this.field, (IteratorWriter) w -> { long o; Index: solr/core/src/java/org/apache/solr/handler/export/IntValue.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/IntValue.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/IntValue.java (date 1533162455000) @@ -30,9 +30,18 @@ protected int currentValue; protected IntComp comp; private int lastDocID; + protected boolean present = false; + + public Object getCurrentValue() { + return currentValue; + } + + public String getField() { + return field; + } public IntValue copy() { - return new IntValue(field, comp); + return new IntValue(field, comp, present); } public IntValue(String field, IntComp comp) { @@ -41,6 +50,13 @@ this.currentValue = comp.resetValue(); } + public IntValue(String field, IntComp comp, boolean present) { + this.field = field; + this.comp = comp; + this.currentValue = comp.resetValue(); + this.present = present; + } + public void setNextReader(LeafReaderContext context) throws IOException { this.vals = DocValues.getNumeric(context.reader(), field); lastDocID = 0; @@ -56,19 +72,28 @@ curDocID = vals.advance(docId); } if (docId == curDocID) { + present = true; currentValue = (int) vals.longValue(); } else { + present = false; currentValue = 0; } } + @Override + public boolean isPresent() { + return this.present; + } + public int compareTo(SortValue o) { IntValue iv = (IntValue)o; return comp.compare(currentValue, iv.currentValue); } - public void setCurrentValue (SortValue value) { - currentValue = ((IntValue)value).currentValue; + public void setCurrentValue(SortValue sv) { + IntValue iv = (IntValue)sv; + this.currentValue = iv.currentValue; + this.present = iv.present; } public void reset() { Index: solr/core/src/java/org/apache/solr/handler/export/SortDoc.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/SortDoc.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/SortDoc.java (date 1533161803000) @@ -33,6 +33,15 @@ this.sortValues = sortValues; } + public SortValue getSortValue(String field) { + for (SortValue value : sortValues) { + if (value.getField().equals(field)) { + return value; + } + } + return null; + } + public void setNextReader(LeafReaderContext context) throws IOException { this.ord = context.ord; this.docBase = context.docBase; Index: solr/core/src/java/org/apache/solr/handler/export/StringValue.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- solr/core/src/java/org/apache/solr/handler/export/StringValue.java (revision 679b4aa71d205ac58621f6b2bad64637f6bd7d67) +++ solr/core/src/java/org/apache/solr/handler/export/StringValue.java (date 1533161803000) @@ -38,6 +38,7 @@ protected int currentOrd; protected IntComp comp; protected int lastDocID; + private boolean present = false; public StringValue(SortedDocValues globalDocValues, String field, IntComp comp) { this.globalDocValues = globalDocValues; @@ -50,8 +51,20 @@ this.currentOrd = comp.resetValue(); } + public StringValue(SortedDocValues globalDocValues, String field, IntComp comp, boolean present) { + this.globalDocValues = globalDocValues; + this.docValues = globalDocValues; + if (globalDocValues instanceof MultiDocValues.MultiSortedDocValues) { + this.ordinalMap = ((MultiDocValues.MultiSortedDocValues) globalDocValues).mapping; + } + this.field = field; + this.comp = comp; + this.currentOrd = comp.resetValue(); + this.present = present; + } + public StringValue copy() { - return new StringValue(globalDocValues, field, comp); + return new StringValue(globalDocValues, field, comp, present); } public void setCurrentValue(int docId) throws IOException { @@ -65,15 +78,31 @@ docValues.advance(docId); } if (docId == docValues.docID()) { + present = true; currentOrd = (int) toGlobal.get(docValues.ordValue()); } else { + present = false; currentOrd = -1; } } + @Override + public boolean isPresent() { + return present; + } + public void setCurrentValue(SortValue sv) { StringValue v = (StringValue)sv; this.currentOrd = v.currentOrd; + this.present = v.present; + } + + public Object getCurrentValue() throws IOException { + return docValues.lookupOrd(currentOrd); + } + + public String getField() { + return field; } public void setNextReader(LeafReaderContext context) throws IOException {