Skip to content

Commit

Permalink
#4 Support for char, byte, short, float, double
Browse files Browse the repository at this point in the history
  • Loading branch information
gunnarmorling committed Dec 28, 2021
1 parent c51333c commit c3b76c7
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 14 deletions.
22 changes: 18 additions & 4 deletions src/main/java/org/moditect/jfranalytics/JfrSchema.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ public JfrSchema(Path jfrFile) {
}

private static Map<String, JfrScannableTable> getTableTypes(Path jfrFile) {

try (var es = EventStream.openFile(jfrFile)) {
RelDataTypeFactory typeFactory = new JavaTypeFactoryImpl();
Map<String, JfrScannableTable> tableTypes = new HashMap<>();
Expand Down Expand Up @@ -106,12 +105,21 @@ private static Map<String, JfrScannableTable> getTableTypes(Path jfrFile) {
private static RelDataType getRelDataType(EventType eventType, ValueDescriptor field, RelDataTypeFactory typeFactory) {
RelDataType type;
switch (field.getTypeName()) {
case "int":
type = typeFactory.createJavaType(int.class);
break;
case "boolean":
type = typeFactory.createJavaType(boolean.class);
break;
case "char":
type = typeFactory.createJavaType(char.class);
break;
case "byte":
type = typeFactory.createJavaType(byte.class);
break;
case "short":
type = typeFactory.createJavaType(short.class);
break;
case "int":
type = typeFactory.createJavaType(int.class);
break;
case "long":
if ("jdk.jfr.Timestamp".equals(field.getContentType())) {
type = typeFactory.createJavaType(Timestamp.class);
Expand All @@ -120,6 +128,12 @@ private static RelDataType getRelDataType(EventType eventType, ValueDescriptor f
type = typeFactory.createJavaType(long.class);
}
break;
case "float":
type = typeFactory.createJavaType(float.class);
break;
case "double":
type = typeFactory.createJavaType(double.class);
break;
case "java.lang.Class":
type = typeFactory.createJavaType(RecordedClass.class);
break;
Expand Down
83 changes: 73 additions & 10 deletions src/test/java/org/moditect/jfranalytics/JfrSchemaFactoryTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,21 @@ public void canRetrieveTables() throws Exception {

assertThat(rs.next()).isFalse();
}
}

try (Connection connection = getConnection("data-types.jfr")) {
DatabaseMetaData md = connection.getMetaData();
try (ResultSet rs = md.getTables(null, "jfr", "%", null)) {
Set<String> tableNames = new HashSet<>();

while (rs.next()) {
tableNames.add(rs.getString(3));
}

try (ResultSet rs = md.getColumns(null, "jfr", "jdk.GarbageCollection", null)) {
assertThat(tableNames).contains("test.DataTypes");
}

try (ResultSet rs = md.getColumns(null, "jfr", "test.DataTypes", null)) {
assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("startTime").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("TIMESTAMP(0)").describedAs("type name");
Expand All @@ -84,25 +97,75 @@ public void canRetrieveTables() throws Exception {
assertThat(rs.getString(6)).isEqualTo("BIGINT").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("gcId").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("INTEGER").describedAs("type name");
assertThat(rs.getString(4)).isEqualTo("eventThread").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("VARCHAR").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("name").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("VARCHAR").describedAs("type name");
assertThat(rs.getString(4)).isEqualTo("stackTrace").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("OTHER").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("cause").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("VARCHAR").describedAs("type name");
assertThat(rs.getString(4)).isEqualTo("someBoolean").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("BOOLEAN").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("sumOfPauses").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("BIGINT").describedAs("type name");
assertThat(rs.getString(4)).isEqualTo("someChar").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("CHAR(1)").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("someByte").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("TINYINT").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("someShort").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("SMALLINT").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("longestPause").describedAs("column name");
assertThat(rs.getString(4)).isEqualTo("someInt").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("INTEGER").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("someLong").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("BIGINT").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("someFloat").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("REAL").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("someDouble").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("DOUBLE").describedAs("type name");

assertThat(rs.next()).isTrue();
assertThat(rs.getString(4)).isEqualTo("someString").describedAs("column name");
assertThat(rs.getString(6)).isEqualTo("VARCHAR").describedAs("type name");

assertThat(rs.next()).isFalse();
}
}
}

@Test
public void canSelectDifferentDataTypes() throws Exception {
try (Connection connection = getConnection("data-types.jfr")) {
PreparedStatement statement = connection.prepareStatement("""
SELECT * FROM "jfr"."test.DataTypes"
""");

try (ResultSet rs = statement.executeQuery()) {
assertThat(rs.next()).isTrue();

assertThat(rs.getTimestamp(1)).isEqualTo(Timestamp.from(ZonedDateTime.parse("2021-12-28T17:10:09.724000000+01:00").toInstant()));
assertThat(rs.getBoolean(5)).isTrue();
assertThat(rs.getString(6)).isEqualTo("X");
assertThat(rs.getByte(7)).isEqualTo(Byte.MAX_VALUE);
assertThat(rs.getShort(8)).isEqualTo(Short.MAX_VALUE);
assertThat(rs.getInt(9)).isEqualTo(Integer.MAX_VALUE);
assertThat(rs.getLong(10)).isEqualTo(Long.MAX_VALUE);
assertThat(rs.getFloat(11)).isEqualTo(Float.MAX_VALUE);
assertThat(rs.getDouble(12)).isEqualTo(Double.MAX_VALUE);
assertThat(rs.getString(13)).isEqualTo("SQL rockz");

assertThat(rs.next()).isFalse();
}
}
Expand Down
Binary file added src/test/resources/data-types.jfr
Binary file not shown.

0 comments on commit c3b76c7

Please sign in to comment.