3
3
//
4
4
package io .deephaven .parquet .base ;
5
5
6
+ import io .deephaven .UncheckedDeephavenException ;
6
7
import org .jetbrains .annotations .NotNull ;
7
8
8
9
import java .io .File ;
10
+ import java .net .URI ;
11
+ import java .net .URISyntaxException ;
9
12
import java .nio .charset .StandardCharsets ;
10
13
import java .nio .file .Path ;
11
14
15
+ import static io .deephaven .base .FileUtils .URI_SEPARATOR ;
12
16
import static io .deephaven .base .FileUtils .URI_SEPARATOR_CHAR ;
13
17
14
18
public final class ParquetUtils {
15
19
20
+ public static final String PARQUET_FILE_EXTENSION = ".parquet" ;
21
+
16
22
public static final String METADATA_FILE_NAME = "_metadata" ;
17
23
public static final String COMMON_METADATA_FILE_NAME = "_common_metadata" ;
18
- public static final String PARQUET_FILE_EXTENSION = ".parquet" ;
19
24
public static final String METADATA_FILE_URI_SUFFIX = URI_SEPARATOR_CHAR + METADATA_FILE_NAME ;
20
25
public static final String COMMON_METADATA_FILE_URI_SUFFIX = URI_SEPARATOR_CHAR + COMMON_METADATA_FILE_NAME ;
21
- public static final String METADATA_FILE_SUFFIX = File .separatorChar + METADATA_FILE_NAME ;
22
- public static final String COMMON_METADATA_FILE_SUFFIX = File .separatorChar + COMMON_METADATA_FILE_NAME ;
26
+ private static final String METADATA_FILE_SUFFIX = File .separatorChar + METADATA_FILE_NAME ;
27
+ private static final String COMMON_METADATA_FILE_SUFFIX = File .separatorChar + COMMON_METADATA_FILE_NAME ;
28
+
23
29
private static final String MAGIC_STR = "PAR1" ;
24
30
public static final byte [] MAGIC = MAGIC_STR .getBytes (StandardCharsets .US_ASCII );
25
31
32
+ private static final String WINDOWS_FILE_SEPARATOR = "\\ " ;
33
+
26
34
/**
27
35
* The number of bytes to buffer before flushing while writing parquet files and metadata files.
28
36
*/
@@ -42,17 +50,23 @@ public static String getPerFileMetadataKey(final String filePath) {
42
50
}
43
51
44
52
/**
45
- * This method verifies if the source points to a parquet file or a metadata file. Provided source can be a local
46
- * file path or a URI. Also, it can point to a parquet file, metadata file or a directory.
53
+ * This method verifies if the source points to a parquet file. Provided source can be a local file path or a URI.
47
54
*/
48
55
public static boolean isParquetFile (@ NotNull final String source ) {
49
- boolean ret = source .endsWith (PARQUET_FILE_EXTENSION )
50
- || source .endsWith (METADATA_FILE_URI_SUFFIX )
51
- || source .endsWith (COMMON_METADATA_FILE_URI_SUFFIX );
56
+ return source .endsWith (PARQUET_FILE_EXTENSION );
57
+ }
58
+
59
+ /**
60
+ * This method verifies if the source points to a metadata file. Provided source can be a local file path or a URI.
61
+ */
62
+ public static boolean isMetadataFile (@ NotNull final String source ) {
63
+ if (source .endsWith (METADATA_FILE_URI_SUFFIX ) || source .endsWith (COMMON_METADATA_FILE_URI_SUFFIX )) {
64
+ return true ;
65
+ }
52
66
if (File .separatorChar != URI_SEPARATOR_CHAR ) {
53
- ret = ret || source .endsWith (METADATA_FILE_SUFFIX ) || source .endsWith (COMMON_METADATA_FILE_SUFFIX );
67
+ return source .endsWith (METADATA_FILE_SUFFIX ) || source .endsWith (COMMON_METADATA_FILE_SUFFIX );
54
68
}
55
- return ret ;
69
+ return false ;
56
70
}
57
71
58
72
/**
@@ -74,4 +88,18 @@ public static boolean isVisibleParquetFile(@NotNull final Path rootDir, @NotNull
74
88
}
75
89
return true ;
76
90
}
91
+
92
+ /**
93
+ * Resolve a relative path against a base URI. The path can be from Windows or Unix systems.
94
+ */
95
+ public static URI resolve (final URI base , final String relativePath ) {
96
+ final URI relativeURI ;
97
+ try {
98
+ // Sanitize the relative path before resolving it to avoid issues with separators and special characters
99
+ relativeURI = new URI (null , null , relativePath .replace (WINDOWS_FILE_SEPARATOR , URI_SEPARATOR ), null );
100
+ } catch (final URISyntaxException e ) {
101
+ throw new UncheckedDeephavenException ("Failed to create URI from relative path: " + relativePath , e );
102
+ }
103
+ return base .resolve (relativeURI );
104
+ }
77
105
}
0 commit comments