use of org.apache.pulsar.client.api.schema.Field in project pulsar by apache.
the class GenericJsonRecord method getField.
@Override
public Object getField(String fieldName) {
JsonNode fn = jn.get(fieldName);
if (fn == null) {
return null;
}
if (fn.isContainerNode()) {
AtomicInteger idx = new AtomicInteger(0);
List<Field> fields = Lists.newArrayList(fn.fieldNames()).stream().map(f -> new Field(f, idx.getAndIncrement())).collect(Collectors.toList());
return new GenericJsonRecord(schemaVersion, fields, fn, schemaInfo);
} else if (fn.isBoolean()) {
return fn.asBoolean();
} else if (fn.isFloatingPointNumber()) {
return fn.asDouble();
} else if (fn.isBigInteger()) {
if (fn.canConvertToLong()) {
return fn.asLong();
} else {
return fn.asText();
}
} else if (fn.isNumber()) {
return fn.numberValue();
} else if (fn.isBinary()) {
try {
return fn.binaryValue();
} catch (IOException e) {
return fn.asText();
}
} else if (isBinaryValue(fieldName)) {
try {
return fn.binaryValue();
} catch (IOException e) {
return fn.asText();
}
} else if (fn.isNull()) {
return null;
} else {
return fn.asText();
}
}
use of org.apache.pulsar.client.api.schema.Field in project pulsar by apache.
the class MultiVersionGenericJsonReader method loadReader.
@Override
protected SchemaReader<GenericRecord> loadReader(BytesSchemaVersion schemaVersion) {
SchemaInfo schemaInfo = getSchemaInfoByVersion(schemaVersion.get());
if (schemaInfo != null) {
LOG.info("Load schema reader for version({}), schema is : {}", SchemaUtils.getStringSchemaVersion(schemaVersion.get()), schemaInfo.getSchemaDefinition());
Schema readerSchema;
if (useProvidedSchemaAsReaderSchema) {
readerSchema = this.readerSchema;
} else {
readerSchema = parseAvroSchema(schemaInfo.getSchemaDefinition());
}
return new GenericJsonReader(schemaVersion.get(), readerSchema.getFields().stream().map(f -> new Field(f.name(), f.pos())).collect(Collectors.toList()), schemaInfo);
} else {
LOG.warn("No schema found for version({}), use latest schema : {}", SchemaUtils.getStringSchemaVersion(schemaVersion.get()), this.readerSchema);
return providerSchemaReader;
}
}
use of org.apache.pulsar.client.api.schema.Field in project pulsar by apache.
the class GenericJsonRecordTest method testGetNativeRecord.
@Test
public void testGetNativeRecord() throws Exception {
byte[] json = "{\"somefield\":null}".getBytes(UTF_8);
GenericJsonRecord record = new GenericJsonReader(Collections.singletonList(new Field("somefield", 0))).read(json, 0, json.length);
assertEquals(SchemaType.JSON, record.getSchemaType());
assertSame(record.getNativeObject(), record.getJsonNode());
}
use of org.apache.pulsar.client.api.schema.Field in project pulsar by apache.
the class JSONSchemaTest method testJsonGenericRecordBuilder.
@Test
public void testJsonGenericRecordBuilder() {
JSONSchema<Seller> sellerJsonSchema = JSONSchema.of(Seller.class);
RecordSchemaBuilder sellerSchemaBuilder = SchemaBuilder.record("seller");
sellerSchemaBuilder.field("state").type(SchemaType.STRING);
sellerSchemaBuilder.field("street").type(SchemaType.STRING);
sellerSchemaBuilder.field("zipCode").type(SchemaType.INT64);
SchemaInfo sellerSchemaInfo = sellerSchemaBuilder.build(SchemaType.JSON);
GenericSchemaImpl sellerGenericSchema = GenericSchemaImpl.of(sellerSchemaInfo);
JSONSchema<PC> pcJsonSchema = JSONSchema.of(PC.class);
RecordSchemaBuilder pcSchemaBuilder = SchemaBuilder.record("pc");
pcSchemaBuilder.field("brand").type(SchemaType.STRING);
pcSchemaBuilder.field("model").type(SchemaType.STRING);
pcSchemaBuilder.field("gpu").type(SchemaType.STRING);
pcSchemaBuilder.field("year").type(SchemaType.INT64);
pcSchemaBuilder.field("seller", sellerGenericSchema).type(SchemaType.JSON).optional();
SchemaInfo pcGenericSchemaInfo = pcSchemaBuilder.build(SchemaType.JSON);
GenericSchemaImpl pcGenericSchema = GenericSchemaImpl.of(pcGenericSchemaInfo);
Seller seller = new Seller("USA", "oakstreet", 9999);
PC pc = new PC("dell", "g3", 2020, GPU.AMD, seller);
byte[] bytes = pcJsonSchema.encode(pc);
Assert.assertTrue(bytes.length > 0);
Object pc2 = pcJsonSchema.decode(bytes);
assertEquals(pc, pc2);
GenericRecord sellerRecord = sellerGenericSchema.newRecordBuilder().set("state", "USA").set("street", "oakstreet").set("zipCode", 9999).build();
GenericRecord pcRecord = pcGenericSchema.newRecordBuilder().set("brand", "dell").set("model", "g3").set("year", 2020).set("gpu", GPU.AMD).set("seller", sellerRecord).build();
byte[] bytes3 = pcGenericSchema.encode(pcRecord);
Assert.assertTrue(bytes3.length > 0);
GenericRecord pc3Record = pcGenericSchema.decode(bytes3);
for (Field field : pc3Record.getFields()) {
assertTrue(pcGenericSchema.getFields().contains(field));
}
assertEquals("dell", pc3Record.getField("brand"));
assertEquals("g3", pc3Record.getField("model"));
assertEquals(2020, pc3Record.getField("year"));
assertEquals(GPU.AMD.toString(), pc3Record.getField("gpu"));
GenericRecord seller3Record = (GenericRecord) pc3Record.getField("seller");
assertEquals("USA", seller3Record.getField("state"));
assertEquals("oakstreet", seller3Record.getField("street"));
assertEquals(9999, seller3Record.getField("zipCode"));
assertTrue(pc3Record instanceof GenericJsonRecord);
Assertions.assertThatCode(() -> pc3Record.getField("I_DO_NOT_EXIST")).doesNotThrowAnyException();
}
use of org.apache.pulsar.client.api.schema.Field in project pulsar by apache.
the class InfluxDBGenericRecordSink method buildPoint.
@Override
protected Point buildPoint(Record<GenericRecord> message) throws Exception {
Map<String, String> tags;
Map<String, Object> fields = Maps.newHashMap();
GenericRecord record = message.getValue();
Object measurementField = getFiled(record, "measurement");
if (null == measurementField) {
throw new SchemaSerializationException("measurement is a required field.");
}
String measurement = measurementField.toString();
// Looking for tags
Object tagsField = getFiled(record, "tags");
if (null == tagsField) {
tags = ImmutableMap.of();
} else if (Map.class.isAssignableFrom(tagsField.getClass())) {
tags = ((Map<Object, Object>) tagsField).entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey().toString(), entry -> entry.getValue().toString()));
} else {
// Field 'tags' that is not of Map type will be ignored
tags = ImmutableMap.of();
}
// Just insert the current time millis
long timestamp = System.currentTimeMillis();
for (Field field : record.getFields()) {
String fieldName = field.getName();
if (FIELDS_TO_SKIP.contains(fieldName)) {
continue;
}
Object fieldValue = record.getField(field);
if (null != fieldValue) {
fields.put(fieldName, fieldValue);
}
}
Point.Builder builder = Point.measurement(measurement).time(timestamp, TimeUnit.MILLISECONDS).tag(tags).fields(fields);
return builder.build();
}
Aggregations