docs: public static ExtractFromRow extractFullText( final int indexInRow,
                                                    final NodeCache cache,
                                                    TypeSystem types,
                                                    final BinaryStore binaries ) {
          final TypeFactory<String> type = types.getStringFactory();
          final boolean trace = NodeSequence.LOGGER.isTraceEnabled();
          return new ExtractFromRow() {
              @Override
              public TypeFactory<String> getType() {
                  return type;
              }
  
              @Override
              public Object getValueInRow( RowAccessor row ) {
                  CachedNode node = row.getNode(indexInRow);
                  if (node == null) return null;
                  StringBuilder fullTextString = new StringBuilder();
                  Name name = node.getName(cache);
                  fullTextString.append(name.getLocalName());
                  Iterator<Property> iter = node.getProperties(cache);
                  while (iter.hasNext()) {
                      extractFullTextFrom(iter.next(), type, fullTextString, binaries, node, cache);
                  }
                  if (trace) NodeSequence.LOGGER.trace("Extracting full-text from {0}: {1}", node.getPath(cache), fullTextString);
                  // There should always be some content, since every node except the root has a name and even the
                  // root node has some properties that will be converted to full-text ...
                  return fullTextString.toString();
              }
  
              @Override
              public String toString() {
                  return "(extract-full-text)";
              }
          };
      }