public PointValues getValues()

in lucene/core/src/java/org/apache/lucene/index/SlowCompositeCodecReaderWrapper.java [596:798]


    public PointValues getValues(String field) throws IOException {
      List<PointValuesSub> values = new ArrayList<>();
      for (int i = 0; i < readers.length; ++i) {
        FieldInfo fi = codecReaders[i].getFieldInfos().fieldInfo(field);
        if (fi != null && fi.getPointDimensionCount() > 0) {
          PointValues v = readers[i].getValues(field);
          if (v != null) {
            // Apparently FieldInfo can claim a field has points, yet the returned
            // PointValues is null
            values.add(new PointValuesSub(v, docStarts[i]));
          }
        }
      }
      if (values.isEmpty()) {
        return null;
      }
      return new PointValues() {

        @Override
        public PointTree getPointTree() throws IOException {
          return new PointTree() {

            @Override
            public PointTree clone() {
              return this;
            }

            @Override
            public void visitDocValues(IntersectVisitor visitor) throws IOException {
              for (PointValuesSub sub : values) {
                sub.sub.getPointTree().visitDocValues(wrapIntersectVisitor(visitor, sub.docBase));
              }
            }

            @Override
            public void visitDocIDs(IntersectVisitor visitor) throws IOException {
              for (PointValuesSub sub : values) {
                sub.sub.getPointTree().visitDocIDs(wrapIntersectVisitor(visitor, sub.docBase));
              }
            }

            private IntersectVisitor wrapIntersectVisitor(IntersectVisitor visitor, int docStart) {
              return new IntersectVisitor() {

                @Override
                public void visit(int docID, byte[] packedValue) throws IOException {
                  visitor.visit(docStart + docID, packedValue);
                }

                @Override
                public void visit(int docID) throws IOException {
                  visitor.visit(docStart + docID);
                }

                @Override
                public Relation compare(byte[] minPackedValue, byte[] maxPackedValue) {
                  return visitor.compare(minPackedValue, maxPackedValue);
                }
              };
            }

            @Override
            public long size() {
              long size = 0;
              for (PointValuesSub sub : values) {
                size += sub.sub.size();
              }
              return size;
            }

            @Override
            public boolean moveToSibling() throws IOException {
              return false;
            }

            @Override
            public boolean moveToParent() throws IOException {
              return false;
            }

            @Override
            public boolean moveToChild() throws IOException {
              return false;
            }

            @Override
            public byte[] getMinPackedValue() {
              try {
                byte[] minPackedValue = null;
                for (PointValuesSub sub : values) {
                  if (minPackedValue == null) {
                    minPackedValue = sub.sub.getMinPackedValue().clone();
                  } else {
                    byte[] leafMinPackedValue = sub.sub.getMinPackedValue();
                    int numIndexDimensions = sub.sub.getNumIndexDimensions();
                    int numBytesPerDimension = sub.sub.getBytesPerDimension();
                    ArrayUtil.ByteArrayComparator comparator =
                        ArrayUtil.getUnsignedComparator(numBytesPerDimension);
                    for (int i = 0; i < numIndexDimensions; ++i) {
                      if (comparator.compare(
                              leafMinPackedValue,
                              i * numBytesPerDimension,
                              minPackedValue,
                              i * numBytesPerDimension)
                          < 0) {
                        System.arraycopy(
                            leafMinPackedValue,
                            i * numBytesPerDimension,
                            minPackedValue,
                            i * numBytesPerDimension,
                            numBytesPerDimension);
                      }
                    }
                  }
                }
                return minPackedValue;
              } catch (IOException e) {
                throw new UncheckedIOException(e);
              }
            }

            @Override
            public byte[] getMaxPackedValue() {
              try {
                byte[] maxPackedValue = null;
                for (PointValuesSub sub : values) {
                  if (maxPackedValue == null) {
                    maxPackedValue = sub.sub.getMaxPackedValue().clone();
                  } else {
                    byte[] leafMinPackedValue = sub.sub.getMaxPackedValue();
                    int numIndexDimensions = sub.sub.getNumIndexDimensions();
                    int numBytesPerDimension = sub.sub.getBytesPerDimension();
                    ArrayUtil.ByteArrayComparator comparator =
                        ArrayUtil.getUnsignedComparator(numBytesPerDimension);
                    for (int i = 0; i < numIndexDimensions; ++i) {
                      if (comparator.compare(
                              leafMinPackedValue,
                              i * numBytesPerDimension,
                              maxPackedValue,
                              i * numBytesPerDimension)
                          > 0) {
                        System.arraycopy(
                            leafMinPackedValue,
                            i * numBytesPerDimension,
                            maxPackedValue,
                            i * numBytesPerDimension,
                            numBytesPerDimension);
                      }
                    }
                  }
                }
                return maxPackedValue;
              } catch (IOException e) {
                throw new UncheckedIOException(e);
              }
            }
          };
        }

        @Override
        public byte[] getMinPackedValue() throws IOException {
          return getPointTree().getMinPackedValue();
        }

        @Override
        public byte[] getMaxPackedValue() throws IOException {
          return getPointTree().getMaxPackedValue();
        }

        @Override
        public int getNumDimensions() throws IOException {
          return values.get(0).sub.getNumDimensions();
        }

        @Override
        public int getNumIndexDimensions() throws IOException {
          return values.get(0).sub.getNumIndexDimensions();
        }

        @Override
        public int getBytesPerDimension() throws IOException {
          return values.get(0).sub.getBytesPerDimension();
        }

        @Override
        public long size() {
          try {
            return getPointTree().size();
          } catch (IOException e) {
            throw new UncheckedIOException(e);
          }
        }

        @Override
        public int getDocCount() {
          int docCount = 0;
          for (PointValuesSub sub : values) {
            docCount += sub.sub.getDocCount();
          }
          return docCount;
        }
      };
    }