/** * @return * Returns a comma separated list of all the fields in the schema */ private String generateFieldsSyntax() { final List<String> fields = this.schema.getFields().stream() .map(field -> field.toString()).collect(Collectors.toList()); return joiner.join(fields); }
/** * @return * Insert statement used for sstable loading using the fields and ttl value */ public String generateInsertStmt() { final String fields = this.schema.getFields() .stream() .map(f -> StringTypes.SPACE + f.getFieldName()) .collect(Collectors.joining(",")); final String values = this.schema.getFields() .stream() .map(f -> "?") .collect(Collectors.joining(",")); final String ttlStr = this.ttl.isPresent() ? "USING TTL " + this.ttl.get().toString() : StringTypes.EMPTY; return String.format("INSERT INTO %s.%s ( %s ) VALUES ( %s ) %s", this.schema.getKeySpace(), this.schema.getTableName(), fields, values, ttlStr); }
/** * The schema is the source of truth here and if any of the schema field names aren't found * in the existing columns we need to alter that table and update the schema * * @param existingColumns * @return List of strings, one for each column that needs to be added */ public List<String> generateAlterTableStmt(final List<String> existingColumns) { final List<String> fieldNames = this.schema.getFields().stream() .map(field -> field.getFieldName()).collect(Collectors.toList()); log.info("Existing field names in schema: {}", Arrays.toString(fieldNames.toArray())); final List<String> missingCols = fieldNames.stream() .filter(field -> !existingColumns.contains(field)) .collect(Collectors.toList()); log.info("Missing columns (if any): {}", Arrays.toString(missingCols.toArray())); return this.schema.getFields().stream() .filter(field -> missingCols.contains(field.getFieldName())) .map(field -> String.format("ALTER TABLE %s.%s ADD %s", this.schema.getKeySpace(), this.schema.getTableName(), field.toString())) .collect(Collectors.toList()); }
Preconditions.checkState(!Strings.isNullOrEmpty(this.schema.getKeySpace()), "Keyspace is missing"); Preconditions.checkState(!Strings.isNullOrEmpty(this.schema.getTableName()), "Table name is missing"); Preconditions.checkState(this.schema.getFields() != null && !this.schema.getFields().isEmpty(), "Schema fields missing"); Preconditions.checkState(this.partitionKeys != null && !this.partitionKeys.isEmpty(), this.schema.getFields() .stream() .map(f -> f.getFieldName().toLowerCase())
@Test public void testConvertCommonToCassandraSchemaWithFilteredFields() { final Schema record = SchemaBuilder.record("commonSchema") .fields() .name("field0").type().intType().noDefault() .name("field1").type().doubleType().noDefault() .name("field2").type().stringType().noDefault() .name("field3").type().booleanType().noDefault() .endRecord(); final CassandraSchemaConverter converter = new CassandraSchemaConverter("testKeyspace", "testTableName", Optional.of(new HashSet<>(Arrays.asList("field2", "field3")))); final CassandraSchema cassSchema = converter.convertToExternalSchema(record); Assert.assertTrue(cassSchema.getFields().size() == 2); Assert.assertEquals("field2", cassSchema.getFields().get(0).getFieldName()); Assert.assertEquals("field3", cassSchema.getFields().get(1).getFieldName()); Assert.assertEquals(CassandraSchemaField.convertFromAvroType( SchemaTestUtil.getSchema(CassandraSchemaField.STRING_TYPE)), cassSchema.getFields().get(0).getType()); Assert.assertEquals(CassandraSchemaField.convertFromAvroType( SchemaTestUtil.getSchema(CassandraSchemaField.BOOLEAN_TYPE)), cassSchema.getFields().get(1).getType()); } }
@Test public void testConvertCommonToCassandraSchemaWithStringTimestamp() { final Schema record = SchemaBuilder.record("commonSchema") .fields() .name("field0").type().intType().noDefault() .endRecord(); final TimestampInfo tsInfo = new TimestampInfo(Optional.of("10000"), false); final CassandraSchemaConverter converter = new CassandraSchemaConverter("testKeyspace", "testTableName", tsInfo, Optional.absent()); final CassandraSchema cassSchema = converter.convertToExternalSchema(record); Assert.assertTrue(cassSchema.getFields().size() == 2); final CassandraSchemaField intField = cassSchema.getFields().get(0); Assert.assertEquals("field0", intField.getFieldName()); Assert.assertEquals(CassandraSchemaField.convertFromAvroType( SchemaTestUtil.getSchema(CassandraSchemaField.INT_TYPE)), intField.getType()); final CassandraSchemaField timestampField = cassSchema.getFields().get(1); Assert.assertEquals(SchemaUtil.DISPERSAL_TIMESTAMP, timestampField.getFieldName()); Assert.assertEquals(CassandraSchemaField.convertFromAvroType( SchemaTestUtil.getSchema(CassandraSchemaField.STRING_TYPE)), timestampField.getType()); }
@Test public void testConvertCommonToCassandraSchemaRemovesFieldStartingWithUnderscore() { final Schema record = SchemaBuilder.record("commonSchema") .fields() .name("_field0").type().intType().noDefault() .name("_field1").type().doubleType().noDefault() .name("_field2").type().stringType().noDefault() .name("field3").type().booleanType().noDefault() .endRecord(); final CassandraSchemaConverter converter = new CassandraSchemaConverter("testKeyspace", "testTableName", Optional.absent()); final CassandraSchema cassSchema = converter.convertToExternalSchema(record); Assert.assertTrue(cassSchema.getFields().size() == 1); Assert.assertEquals("field3", cassSchema.getFields().get(0).getFieldName()); Assert.assertEquals(CassandraSchemaField.convertFromAvroType( SchemaTestUtil.getSchema(CassandraSchemaField.BOOLEAN_TYPE)), cassSchema.getFields().get(0).getType()); }