mirror of
https://github.com/nosqlbench/nosqlbench.git
synced 2025-02-25 18:55:28 -06:00
added support for path level regex matching
This commit is contained in:
parent
59ee5355c4
commit
a42ba634d7
@ -245,10 +245,11 @@ public class NBIO implements NBPathsAPI.Facets {
|
||||
if (!extension.startsWith(".")) {
|
||||
extension = "." + extension;
|
||||
}
|
||||
|
||||
String pattern = name.endsWith(extension) ? name : name + Pattern.quote(extension);
|
||||
RegexPathFilter filter = new RegexPathFilter(pattern);
|
||||
|
||||
NBIOWalker.walk(path, capture, filter);
|
||||
NBIOWalker.walkFullPath(path, capture, filter);
|
||||
}
|
||||
|
||||
}
|
||||
@ -267,6 +268,10 @@ public class NBIO implements NBPathsAPI.Facets {
|
||||
private final Pattern regex;
|
||||
|
||||
public RegexPathFilter(String pattern) {
|
||||
if (!pattern.startsWith("^")) {
|
||||
pattern = ".*" + pattern;
|
||||
}
|
||||
|
||||
this.regex = Pattern.compile(pattern);
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@ import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.DirectoryStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.nio.file.spi.FileSystemProvider;
|
||||
@ -13,8 +14,9 @@ import java.util.List;
|
||||
|
||||
public class NBIOWalker {
|
||||
private final static Logger logger = LogManager.getLogger(NBIOWalker.class);
|
||||
|
||||
public static void walk(Path p, PathVisitor v) {
|
||||
walk(p,v,NBIOWalker.WALK_ALL);
|
||||
walkShortPath(p, v, NBIOWalker.WALK_ALL);
|
||||
}
|
||||
|
||||
public static List<Path> findAll(Path p) {
|
||||
@ -24,24 +26,60 @@ public class NBIOWalker {
|
||||
|
||||
}
|
||||
|
||||
public static void walk(Path p, PathVisitor v, DirectoryStream.Filter<Path> filter) {
|
||||
/**
|
||||
* This walks the directory structure starting at the path specified. The path visitor is invoked for every
|
||||
* directory, and every non-directory which matches the filter.
|
||||
* This form uses only the filename component in Paths to be matched by the filter, and the short name is also
|
||||
* what is returned by the filter.
|
||||
*
|
||||
* @param p The path to search
|
||||
* @param v The visitor to accumulate or operate on matched paths and all directories
|
||||
* @param filter The Path filter to determine whether a path is included
|
||||
*/
|
||||
public static void walkShortPath(Path p, PathVisitor v, DirectoryStream.Filter<Path> filter) {
|
||||
walk(null, p, v, filter, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* This walks the directory structure starting at the path specified. The path visitor is invoked for every
|
||||
* directory, and every non-directory which matches the filter.
|
||||
* This form uses only the full path from the initial search path root in all Paths to be matched by
|
||||
* the filter, and this form of a Path component is also returned in all Paths seen by the visitor.
|
||||
*
|
||||
* @param p The path to search
|
||||
* @param v The visitor to accumulate or operate on matched paths and all directories
|
||||
* @param filter The Path filter to determine whether a path is included
|
||||
*/
|
||||
public static void walkFullPath(Path p, PathVisitor v, DirectoryStream.Filter<Path> filter) {
|
||||
walk(null, p, v, filter, true);
|
||||
}
|
||||
|
||||
public static void walk(Path root, Path p, PathVisitor v, DirectoryStream.Filter<Path> filter, boolean fullpath) {
|
||||
|
||||
try {
|
||||
FileSystemProvider provider = p.getFileSystem().provider();
|
||||
DirectoryStream<Path> paths = provider.newDirectoryStream(p, (Path r) -> true);
|
||||
List<Path> pathlist = new ArrayList<>();
|
||||
|
||||
for (Path path : paths) {
|
||||
pathlist.add(path);
|
||||
}
|
||||
|
||||
for (Path path : pathlist) {
|
||||
if (fullpath && root != null) {
|
||||
path = root.resolve(path);
|
||||
}
|
||||
|
||||
if (path.getFileSystem().provider().readAttributes(path, BasicFileAttributes.class).isDirectory()) {
|
||||
v.preVisitDir(path);
|
||||
walk(path, v, filter);
|
||||
walk(root, path, v, filter, fullpath);
|
||||
v.postVisitDir(path);
|
||||
} else if (filter.accept(path)) {
|
||||
v.preVisitFile(path);
|
||||
v.visit(path);
|
||||
v.postVisitFile(path);
|
||||
}
|
||||
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
@ -50,10 +88,18 @@ public class NBIOWalker {
|
||||
|
||||
public interface PathVisitor {
|
||||
void visit(Path p);
|
||||
default void preVisitFile(Path path) {}
|
||||
default void postVisitFile(Path path) {}
|
||||
default void preVisitDir(Path path) {}
|
||||
default void postVisitDir(Path path) {}
|
||||
|
||||
default void preVisitFile(Path path) {
|
||||
}
|
||||
|
||||
default void postVisitFile(Path path) {
|
||||
}
|
||||
|
||||
default void preVisitDir(Path path) {
|
||||
}
|
||||
|
||||
default void postVisitDir(Path path) {
|
||||
}
|
||||
}
|
||||
|
||||
public static DirectoryStream.Filter<Path> WALK_ALL = entry -> true;
|
||||
|
@ -98,4 +98,15 @@ public class NBIOTest {
|
||||
assertThat(list).hasSize(3);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPathSearchForSuffix() {
|
||||
List<Content<?>> list = NBIO.classpath()
|
||||
.prefix("nesteddir1")
|
||||
.regex()
|
||||
.name("nesteddir2/testdata12")
|
||||
.extension("txt")
|
||||
.list();
|
||||
assertThat(list).hasSize(1);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user