public Planetiler addParquetSource(String name, List<Path> paths, boolean hivePartitioning,
    Function<Map<String, Object>, Object> getId, Function<Map<String, Object>, Object> getLayer) {
    // TODO handle auto-downloading
    for (var path : paths) {
      inputPaths.add(new InputPath(name, path, false));
    }
    var separator = Pattern.quote(paths.isEmpty() ? "/" : paths.getFirst().getFileSystem().getSeparator());
    String prefix = StringUtils.getCommonPrefix(paths.stream().map(Path::toString).toArray(String[]::new))
      .replaceAll(separator + "[^" + separator + "]*$", "");
    return addStage(name, "Process features in " + (prefix.isEmpty() ? (paths.size() + " files") : prefix),
      ifSourceUsed(name, () -> new ParquetReader(name, profile, stats, getId, getLayer, hivePartitioning)
        .process(paths, featureGroup, config)));
  }
Adds a new <a href="https://github.com/opengeospatial/geoparquet">geoparquet</a> source that will be processed when
{@link #run()} is called.

@param name             string to use in stats and logs to identify this stage
@param paths            paths to the geoparquet files to read.
@param hivePartitioning Set to true to parse extra feature tags from the file path, for example
                        {@code {them="buildings", type="part"}} from
                        {@code base/theme=buildings/type=part/file.parquet}
@param getId            function that extracts a unique vector tile feature ID from each input feature, string or
                        binary features will be hashed to a {@code long}.
@param getLayer         function that extracts {@link SourceFeature#getSourceLayer()} from the properties of each
                        input feature
@return this runner instance for chaining
@see GeoPackageReader
planetiler-core/src/main/java/com/onthegomap/planetiler/Planetiler.java