Skip to content

Commit cf8dd81

Browse files
committed
Update Tools
1 parent f5b7bdc commit cf8dd81

File tree

11 files changed

+30058
-19
lines changed

11 files changed

+30058
-19
lines changed

astra-db-java/src/main/java/com/datastax/astra/client/databases/Database.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,8 @@ public <T> Table<T> getTable(String tableName, @NonNull Class<T> rowClass) {
512512
}
513513

514514
public <T> Table<T> getTable(@NonNull Class<T> rowClass) {
515-
com.datastax.astra.client.tables.annotations.Table ann = rowClass
516-
.getAnnotation(com.datastax.astra.client.tables.annotations.Table.class);
515+
com.datastax.astra.client.tables.mapping.Table ann = rowClass
516+
.getAnnotation(com.datastax.astra.client.tables.mapping.Table.class);
517517
if (ann == null) {
518518
throw new IllegalArgumentException("Class " + rowClass.getName() + " is not annotated with @Table");
519519
}
@@ -568,6 +568,10 @@ public Table<Row> createTable(String tableName, TableDefinition tableDefinition,
568568
return createTable(tableName, tableDefinition, options, commandOptions, Row.class);
569569
}
570570

571+
public <T> Table<T> createTable(Class<T> clazz) {
572+
return null;
573+
}
574+
571575
/**
572576
* Create a new table with the given description.
573577
*

astra-db-java/src/main/java/com/datastax/astra/client/tables/annotations/Column.java renamed to astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/Column.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package com.datastax.astra.client.tables.annotations;
1+
package com.datastax.astra.client.tables.mapping;
2+
3+
import com.datastax.astra.client.tables.columns.ColumnTypes;
24

35
import java.lang.annotation.ElementType;
46
import java.lang.annotation.Retention;
@@ -9,6 +11,7 @@
911
@Retention(RetentionPolicy.RUNTIME)
1012
public @interface Column {
1113

12-
String value();
14+
String name();
1315

16+
ColumnTypes type();
1417
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.datastax.astra.client.tables.mapping;
2+
3+
import com.datastax.astra.client.tables.columns.ColumnTypes;
4+
import com.dtsx.astra.sdk.utils.Utils;
5+
import com.fasterxml.jackson.databind.JavaType;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.fasterxml.jackson.databind.SerializationFeature;
8+
import com.fasterxml.jackson.databind.introspect.AnnotatedField;
9+
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
10+
import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
11+
import com.fasterxml.jackson.databind.type.TypeFactory;
12+
import lombok.Data;
13+
import lombok.NoArgsConstructor;
14+
15+
import java.lang.annotation.Annotation;
16+
import java.lang.reflect.Method;
17+
import java.util.HashMap;
18+
import java.util.List;
19+
import java.util.Map;
20+
21+
/**
22+
* Bean introspector will get information of a Bean to populate fields
23+
* directly from the output.
24+
*/
25+
@Data
26+
public class IntrospectedBean<T> {
27+
28+
/** Class introspected. */
29+
final Class<T> clazz;
30+
31+
/** Table name. */
32+
final String name;
33+
34+
/** Class of the bean. */
35+
final Map<String, IntrospectedField> fields;
36+
37+
/**
38+
* Mapper for the serialization
39+
*/
40+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
41+
.enable(SerializationFeature.INDENT_OUTPUT);
42+
43+
/**
44+
* Constructor for the beam.
45+
*
46+
* @param clazz
47+
* class type
48+
*/
49+
public IntrospectedBean(Class<T> clazz) {
50+
this.clazz = clazz;
51+
this.fields = new HashMap<>();
52+
53+
// Table Name
54+
Table tableAnn = clazz.getAnnotation(Table.class);
55+
if (tableAnn == null) {
56+
throw new IllegalArgumentException("Please annotate your bean with @Table(name=\"table_name\")");
57+
}
58+
this.name = tableAnn.value();
59+
60+
// Find properties
61+
List<BeanPropertyDefinition> properties = OBJECT_MAPPER
62+
.getSerializationConfig()
63+
.introspect(TypeFactory.defaultInstance().constructType(clazz))
64+
.findProperties();
65+
66+
// Fields
67+
for (BeanPropertyDefinition property : properties) {
68+
IntrospectedField field = new IntrospectedField();
69+
field.setColumnName(property.getName());
70+
field.setType(property.getPrimaryType().getRawClass());
71+
AnnotatedMethod getter = property.getGetter();
72+
field.setGetter((getter != null) ? getter.getAnnotated() : null);
73+
AnnotatedMethod setter = property.getSetter();
74+
field.setSetter((setter != null) ? setter.getAnnotated() : null);
75+
AnnotatedField annfield = property.getField();
76+
field.setColumnName(field.getName());
77+
Column column = annfield.getAnnotated().getAnnotation(Column.class);
78+
if (column != null) {
79+
if (Utils.hasLength(column.name())) {
80+
field.setColumnName(column.name());
81+
}
82+
if (column.type() != null) {
83+
field.setColumnType(column.type());
84+
}
85+
}
86+
PartitionBy partitionBy = annfield.getAnnotated().getAnnotation(PartitionBy.class);
87+
if (partitionBy != null) {
88+
field.setPartitionByPosition(partitionBy.value());
89+
}
90+
PartitionSort partitionSort = annfield.getAnnotated().getAnnotation(PartitionSort.class);
91+
if (partitionSort != null) {
92+
field.setPartitionSortPosition(partitionSort.position());
93+
field.setPartitionSortOrder(partitionSort.order());
94+
}
95+
fields.put(field.getName(), field);
96+
}
97+
}
98+
99+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.datastax.astra.client.tables.mapping;
2+
3+
import com.datastax.astra.client.core.query.SortOrder;
4+
import com.datastax.astra.client.tables.columns.ColumnTypes;
5+
import lombok.Data;
6+
7+
import java.lang.reflect.Method;
8+
9+
@Data
10+
public class IntrospectedField {
11+
12+
private String name;
13+
14+
private Class<?> type;
15+
16+
private Method getter;
17+
18+
private Method setter;
19+
20+
// @Column
21+
private String columnName;
22+
private ColumnTypes columnType;
23+
24+
// @PartitionBy
25+
private Integer partitionByPosition;
26+
27+
// @PartitionSort
28+
private Integer partitionSortPosition;
29+
private SortOrder partitionSortOrder;
30+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.datastax.astra.client.tables.mapping;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target({ElementType.FIELD, ElementType.METHOD})
9+
@Retention(RetentionPolicy.RUNTIME)
10+
public @interface PartitionBy {
11+
int value() default 0;
12+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.datastax.astra.client.tables.mapping;
2+
3+
import com.datastax.astra.client.core.query.SortOrder;
4+
5+
import java.lang.annotation.ElementType;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
@Target({ElementType.FIELD, ElementType.METHOD})
11+
@Retention(RetentionPolicy.RUNTIME)
12+
public @interface PartitionSort {
13+
14+
int position() default 0;
15+
16+
SortOrder order() default SortOrder.ASCENDING;
17+
18+
}

astra-db-java/src/main/java/com/datastax/astra/client/tables/annotations/Table.java renamed to astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/Table.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.datastax.astra.client.tables.annotations;
1+
package com.datastax.astra.client.tables.mapping;
22

33
import java.lang.annotation.ElementType;
44
import java.lang.annotation.Retention;

astra-db-java/src/test/java/com/datastax/astra/test/integration/local/LocalTableITTest.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package com.datastax.astra.test.integration.local;
22

33
import com.datastax.astra.client.DataAPIClients;
4+
import com.datastax.astra.client.core.query.Sorts;
5+
import com.datastax.astra.client.core.vector.SimilarityMetric;
46
import com.datastax.astra.client.databases.Database;
57
import com.datastax.astra.client.tables.Table;
6-
import com.datastax.astra.client.core.vector.SimilarityMetric;
7-
import com.datastax.astra.client.core.query.Sorts;
88
import com.datastax.astra.client.tables.TableDefinition;
99
import com.datastax.astra.client.tables.TableDescriptor;
1010
import com.datastax.astra.client.tables.columns.ColumnTypes;
11-
import com.datastax.astra.client.tables.commands.TableInsertOneOptions;
1211
import com.datastax.astra.client.tables.commands.TableInsertOneResult;
1312
import com.datastax.astra.client.tables.index.IndexDefinition;
1413
import com.datastax.astra.client.tables.index.IndexDefinitionOptions;
1514
import com.datastax.astra.client.tables.index.IndexOptions;
1615
import com.datastax.astra.client.tables.index.VectorIndexDefinition;
1716
import com.datastax.astra.client.tables.index.VectorIndexDefinitionOptions;
17+
import com.datastax.astra.client.tables.mapping.IntrospectedBean;
18+
import com.datastax.astra.client.tables.mapping.IntrospectedField;
1819
import com.datastax.astra.client.tables.row.Row;
1920
import com.datastax.astra.test.integration.AbstractTableITTest;
2021
import com.datastax.astra.test.model.TableSimpleRow;
@@ -209,9 +210,18 @@ public void shouldMapTableSimple() {
209210
TableInsertOneResult res = table.insertOne(row);
210211
System.out.println(res.insertedIds());
211212

212-
Table<TableSimpleRow> table2 = getDatabase().getTable(TableSimpleRow.class);
213-
table2.insertOne(new TableSimpleRow());
213+
//Table<TableSimpleRow> table2 = getDatabase().getTable(TableSimpleRow.class);
214+
//table2.insertOne(new TableSimpleRow());
214215

215216
}
216217

218+
@Test
219+
public void shouldIntrospectBean() {
220+
IntrospectedBean<TableSimpleRow> rowDecorator = new IntrospectedBean<>(TableSimpleRow.class);
221+
System.out.println("Table Name: " + rowDecorator.getName());
222+
for (IntrospectedField field : rowDecorator.getFields().values()) {
223+
System.out.println("Field: " + field.getName() + ", Type: " + field.getType().getName());
224+
}
225+
}
226+
217227
}
Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,38 @@
11
package com.datastax.astra.test.model;
22

3-
import com.datastax.astra.client.tables.annotations.Column;
4-
import com.datastax.astra.client.tables.annotations.Table;
3+
import com.datastax.astra.client.tables.mapping.Column;
4+
import com.datastax.astra.client.tables.mapping.PartitionBy;
5+
import com.datastax.astra.client.tables.mapping.PartitionSort;
6+
import com.datastax.astra.client.tables.mapping.Table;
57
import com.datastax.astra.test.integration.local.LocalTableITTest;
8+
import lombok.Builder;
9+
import lombok.Data;
610

11+
import static com.datastax.astra.client.core.query.SortOrder.ASCENDING;
12+
import static com.datastax.astra.client.tables.columns.ColumnTypes.BOOLEAN;
13+
import static com.datastax.astra.client.tables.columns.ColumnTypes.INT;
14+
import static com.datastax.astra.client.tables.columns.ColumnTypes.TEXT;
15+
16+
@Data
17+
@Builder
718
@Table(LocalTableITTest.TABLE_SIMPLE)
819
public class TableSimpleRow {
920

10-
@Column("email")
21+
@PartitionBy
22+
@Column(name="email", type= TEXT)
1123
private String email;
1224

13-
@Column("human")
14-
private Boolean human;
15-
16-
@Column("age")
25+
@PartitionSort(position = 0, order = ASCENDING)
26+
@Column(name="age", type = INT)
1727
private Integer age;
1828

19-
@Column("country")
29+
@Column(name="country", type = TEXT)
2030
private String country;
2131

22-
@Column("name")
32+
@Column(name="name", type = TEXT)
2333
private String name;
34+
35+
@Column(name="human", type = BOOLEAN)
36+
private Boolean human;
37+
2438
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.datastax.astra.samples;
2+
3+
import com.datastax.astra.client.DataAPIClient;
4+
import com.datastax.astra.client.collections.Collection;
5+
import com.datastax.astra.client.collections.documents.Document;
6+
import com.datastax.astra.client.databases.Database;
7+
import com.datastax.astra.tool.loader.csv.CsvLoader;
8+
import com.datastax.astra.tool.loader.csv.CsvRowMapper;
9+
import lombok.extern.slf4j.Slf4j;
10+
11+
/**
12+
* Load a CSV to Astra
13+
*/
14+
@Slf4j
15+
public class CsvCustomerSupport {
16+
17+
private static final String ASTRA_TOKEN = System.getenv("ASTRA_DB_APPLICATION_TOKEN");
18+
private static final String API_ENDPOINT = "https://e0ac686e-7942-4b25-832a-664ede8b1da0-us-east-2.apps.astra.datastax.com";
19+
20+
public static void main(String[] args) throws Exception {
21+
// Get an empty Collection
22+
DataAPIClient client = new DataAPIClient(ASTRA_TOKEN);
23+
Database db = client.getDatabase(API_ENDPOINT);
24+
Collection<Document> collection = db.getCollection("customer_support");
25+
26+
collection.deleteAll();
27+
28+
// Zou !
29+
String csvFilename = "/Users/cedricklunven/dev/datastax/JAVA/astra-db-java/tools/src/test/resources/customer_support_tickets.csv";
30+
CsvLoader.load(csvFilename, collection, new CsvRowMapper() {
31+
@Override
32+
public Document map(Document csvRow) {
33+
csvRow.vectorize(csvRow.getString("ticket_description"));
34+
return csvRow;
35+
}
36+
});
37+
Thread.sleep(10000);
38+
39+
}
40+
41+
}

0 commit comments

Comments
 (0)