Skip to content

Commit c41d853

Browse files
andiemontoyeahandiem-bq
and
andiem-bq
authored
[AD-400] Increase code coverage in calcite adapter (#228)
* [AD-400] Remove query execution in calcite-adapter * [AD-400] Remove schema reader and writer interface and file schema reader/writer * [AD-400] Remove unused methods in DocumentDbMetadataTable and DocumentDbSchemaTable * [AD-400] Remove unused imports * [AD-400] Add equals tests for models * [AD-400] Remove passing mongo cursor to enumerator * [AD-400] Fix test - create .documentdb dir if does not yet exist * Commit Code Coverage Badge * Commit Code Coverage Badge * [AD-400] Improvements from code review * [AD-400] Improvements from code review * [AD-400] Correct formatting issues * Commit Code Coverage Badge * [AD-400] Improvements from code review * Commit Code Coverage Badge Co-authored-by: andiem-bq <[email protected]>
1 parent b84c1d9 commit c41d853

File tree

43 files changed

+308
-1560
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+308
-1560
lines changed

.github/badges/branches.svg

+1-1
Loading

.github/badges/jacoco.svg

+1-1
Loading

calcite-adapter/src/main/java/software/amazon/documentdb/jdbc/calcite/adapter/DocumentDbEnumerable.java

+2-18
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,12 @@
1616

1717
package software.amazon.documentdb.jdbc.calcite.adapter;
1818

19-
import com.mongodb.client.MongoClient;
20-
import com.mongodb.client.MongoDatabase;
2119
import lombok.AllArgsConstructor;
2220
import lombok.Getter;
2321
import org.apache.calcite.linq4j.AbstractEnumerable;
2422
import org.apache.calcite.linq4j.Enumerator;
25-
import org.apache.calcite.linq4j.function.Function1;
26-
import org.apache.calcite.util.Util;
27-
import org.bson.Document;
2823
import org.bson.conversions.Bson;
2924

30-
import java.util.Iterator;
3125
import java.util.List;
3226

3327
/**
@@ -38,24 +32,14 @@
3832
@AllArgsConstructor
3933
public class DocumentDbEnumerable extends AbstractEnumerable<Object> {
4034

41-
private final MongoClient client;
4235
private final String databaseName;
4336
private final String collectionName;
4437
private final List<Bson> list;
45-
private final Function1<Document, Object> getter;
4638
private final List<String> paths;
4739

4840
@Override
4941
public Enumerator<Object> enumerator() {
50-
final Iterator<Document> resultIterator;
51-
try {
52-
final MongoDatabase database = client.getDatabase(databaseName);
53-
resultIterator = database.getCollection(collectionName)
54-
.aggregate(list).iterator();
55-
} catch (Exception e) {
56-
throw new RuntimeException("While running MongoDB query "
57-
+ Util.toString(list, "[", ",\n", "]"), e);
58-
}
59-
return new DocumentDbEnumerator(resultIterator, getter);
42+
// Implement the enumerable interface but do not execute query.
43+
return new DocumentDbEnumerator();
6044
}
6145
}

calcite-adapter/src/main/java/software/amazon/documentdb/jdbc/calcite/adapter/DocumentDbEnumerator.java

+6-158
Original file line numberDiff line numberDiff line change
@@ -16,177 +16,25 @@
1616
*/
1717
package software.amazon.documentdb.jdbc.calcite.adapter;
1818

19-
import lombok.SneakyThrows;
2019
import org.apache.calcite.linq4j.Enumerator;
21-
import org.apache.calcite.linq4j.function.Function1;
22-
import org.apache.calcite.linq4j.tree.Primitive;
23-
import org.bson.Document;
24-
import org.bson.types.Binary;
25-
import software.amazon.documentdb.jdbc.metadata.DocumentDbSchemaTable;
2620

27-
import java.util.Date;
28-
import java.util.Iterator;
29-
import java.util.List;
30-
import java.util.Map;
31-
import java.util.Map.Entry;
32-
import java.util.stream.Collectors;
33-
34-
/** Enumerator that reads from a MongoDB collection. */
21+
/** Implements the enumerator interface but does not return data. */
3522
class DocumentDbEnumerator implements Enumerator<Object> {
36-
private final Iterator<Document> cursor;
37-
private final Function1<Document, Object> getter;
38-
private Object current;
3923

40-
/** Creates a DocumentDbEnumerator.
41-
*
42-
* @param cursor Mongo iterator (usually a {@link com.mongodb.client.MongoCursor})
43-
* @param getter Converts an object into a list of fields
44-
*/
45-
DocumentDbEnumerator(final Iterator<Document> cursor,
46-
final Function1<Document, Object> getter) {
47-
this.cursor = cursor;
48-
this.getter = getter;
49-
}
24+
/** Creates a DocumentDbEnumerator. */
25+
DocumentDbEnumerator() { }
5026

5127
@Override public Object current() {
52-
return current;
28+
return null;
5329
}
5430

5531
@Override public boolean moveNext() {
56-
try {
57-
if (cursor.hasNext()) {
58-
final Document map = cursor.next();
59-
current = getter.apply(map);
60-
return true;
61-
} else {
62-
current = null;
63-
return false;
64-
}
65-
} catch (Exception e) {
66-
throw new RuntimeException(e);
67-
}
32+
return false;
6833
}
6934

7035
@Override public void reset() {
7136
throw new UnsupportedOperationException();
7237
}
7338

74-
@SneakyThrows
75-
@Override public void close() {
76-
if (cursor instanceof AutoCloseable) {
77-
((AutoCloseable) cursor).close();
78-
}
79-
// AggregationOutput implements Iterator but not DBCursor. There is no
80-
// available close() method -- apparently there is no open resource.
81-
}
82-
83-
static Function1<Document, Map> mapGetter() {
84-
return a0 -> (Map) a0;
85-
}
86-
87-
/** Returns a function that projects a single field. */
88-
static Function1<Document, Object> singletonGetter(final String fieldPath,
89-
final Class fieldClass,
90-
final DocumentDbSchemaTable tableMetadata) {
91-
// DocumentDB: modified - start
92-
return a0 -> getField(a0, fieldPath, fieldClass);
93-
// DocumentDB: modified - end
94-
}
95-
96-
/** Returns a function that projects fields.
97-
*
98-
* @param fields List of fields to project; or null to return map
99-
*/
100-
static Function1<Document, Object[]> listGetter(
101-
final List<Entry<String, Class<?>>> fields,
102-
final DocumentDbSchemaTable tableMetadata) {
103-
return a0 -> {
104-
// DocumentDB: modified - start
105-
return fields
106-
.stream()
107-
.map(field -> {
108-
final String path = field.getKey();
109-
return getField(a0, path, field.getValue());
110-
})
111-
.toArray();
112-
// DocumentDB: modified - end
113-
};
114-
}
115-
116-
@SuppressWarnings("unchecked")
117-
static Function1<Document, Object> getter(
118-
final List<Entry<String, Class<?>>> fields,
119-
final DocumentDbSchemaTable tableMetadata) {
120-
//noinspection unchecked
121-
// DocumentDB: modified - start
122-
return fields == null
123-
? (Function1) mapGetter()
124-
: fields.size() == 1
125-
? singletonGetter(fields.get(0).getKey(), fields.get(0).getValue(),
126-
tableMetadata)
127-
: (Function1) listGetter(fields, tableMetadata);
128-
// DocumentDB: modified - end
129-
}
130-
131-
@SuppressWarnings("JdkObsolete")
132-
private static Object convert(final Object o, final Class clazz) {
133-
// DocumentDB: modified - start
134-
Object sourceObject = o;
135-
// DocumentDB: modified - end
136-
Class sourceClazz = clazz;
137-
if (sourceObject == null) {
138-
return null;
139-
}
140-
Primitive primitive = Primitive.of(sourceClazz);
141-
if (primitive != null) {
142-
sourceClazz = primitive.boxClass;
143-
} else {
144-
primitive = Primitive.ofBox(sourceClazz);
145-
}
146-
if (sourceClazz.isInstance(sourceObject)) {
147-
return sourceObject;
148-
}
149-
if (sourceObject instanceof Date && primitive != null) {
150-
// DocumentDB: modified - begin
151-
sourceObject = ((Date) sourceObject).getTime();
152-
// DocumentDB: modified - end
153-
}
154-
if (sourceObject instanceof Number && primitive != null) {
155-
return primitive.number((Number) sourceObject);
156-
}
157-
// DocumentDB: modified - begin
158-
if (sourceObject instanceof Binary) {
159-
return ((Binary) sourceObject).getData();
160-
}
161-
if (sourceObject instanceof Document) {
162-
return ((Document) sourceObject).toJson();
163-
}
164-
if (sourceObject instanceof List) {
165-
return ((List<?>) sourceObject)
166-
.stream()
167-
.map(o1 -> o1 instanceof Document ? ((Document) o1).toJson() : o1)
168-
.collect(Collectors.toList());
169-
}
170-
// DocumentDB: modified - end
171-
return sourceObject;
172-
}
173-
174-
private static Object getField(
175-
final Document a0,
176-
final String path,
177-
final Class<?> fieldClass)
178-
throws UnsupportedOperationException {
179-
final String[] segmentedPath = path.split("\\.");
180-
int j = 0;
181-
Object segmentValue = a0.get(segmentedPath[j]);
182-
while (segmentValue instanceof Document) {
183-
final Document document = (Document) segmentValue;
184-
j++;
185-
if (j >= segmentedPath.length) {
186-
break;
187-
}
188-
segmentValue = document.get(segmentedPath[j]);
189-
}
190-
return convert(segmentValue, fieldClass);
191-
}
39+
@Override public void close() { }
19240
}

calcite-adapter/src/main/java/software/amazon/documentdb/jdbc/calcite/adapter/DocumentDbMethod.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
* Builtin methods in the MongoDB adapter.
2626
*/
2727
public enum DocumentDbMethod {
28-
MONGO_QUERYABLE_FIND(DocumentDbTable.DocumentDbQueryable.class, "find", String.class,
29-
String.class, List.class),
28+
// TODO: Investigate using find() here for simpler queries.
29+
// See: https://github.com/aws/amazon-documentdb-jdbc-driver/issues/240
3030
MONGO_QUERYABLE_AGGREGATE(DocumentDbTable.DocumentDbQueryable.class, "aggregate",
3131
List.class, List.class, List.class);
3232

calcite-adapter/src/main/java/software/amazon/documentdb/jdbc/calcite/adapter/DocumentDbSchema.java

+2-30
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
*/
1717
package software.amazon.documentdb.jdbc.calcite.adapter;
1818

19-
import com.mongodb.client.MongoClient;
20-
import com.mongodb.client.MongoClients;
2119
import lombok.SneakyThrows;
2220
import org.apache.calcite.schema.Table;
2321
import org.apache.calcite.schema.impl.AbstractSchema;
@@ -36,33 +34,22 @@
3634
/**
3735
* Provides a schema for DocumentDB
3836
*/
39-
public class DocumentDbSchema extends AbstractSchema implements AutoCloseable {
37+
public class DocumentDbSchema extends AbstractSchema {
4038
private static final Logger LOGGER = LoggerFactory.getLogger(DocumentDbSchema.class);
4139
private Map<String, Table> tables;
4240
private final DocumentDbDatabaseSchemaMetadata databaseMetadata;
4341
private final String databaseName;
44-
private final MongoClient client;
45-
private final boolean closeClient;
4642

4743
/**
4844
* Constructs a new {@link DocumentDbSchema} from {@link DocumentDbDatabaseSchemaMetadata}.
4945
*
5046
* @param databaseMetadata the database metadata.
51-
* @param client the {@link MongoClient} client.
5247
*/
5348
protected DocumentDbSchema(final DocumentDbDatabaseSchemaMetadata databaseMetadata,
54-
final DocumentDbConnectionProperties connectionProperties,
55-
final MongoClient client) {
49+
final DocumentDbConnectionProperties connectionProperties) {
5650
this.databaseMetadata = databaseMetadata;
5751
this.databaseName = connectionProperties.getDatabase();
5852
tables = null;
59-
if (client != null) {
60-
this.client = client;
61-
this.closeClient = false;
62-
} else {
63-
this.client = MongoClients.create(connectionProperties.buildMongoClientSettings());
64-
this.closeClient = true;
65-
}
6653
}
6754

6855
@SneakyThrows
@@ -92,14 +79,6 @@ private Table getDocumentDbTable(final String tableName) {
9279
return new DocumentDbTable(schemaTable.getCollectionName(), schemaTable);
9380
}
9481

95-
/**
96-
* Gets the {@link MongoClient} client.
97-
*
98-
* @return the {@link MongoClient} client.
99-
*/
100-
public MongoClient getClient() {
101-
return client;
102-
}
10382

10483
/**
10584
* Gets the name of the database.
@@ -109,11 +88,4 @@ public MongoClient getClient() {
10988
public String getDatabaseName() {
11089
return databaseName;
11190
}
112-
113-
@Override
114-
public void close() {
115-
if (closeClient && client != null) {
116-
client.close();
117-
}
118-
}
11991
}

calcite-adapter/src/main/java/software/amazon/documentdb/jdbc/calcite/adapter/DocumentDbSchemaFactory.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
package software.amazon.documentdb.jdbc.calcite.adapter;
1919

20-
import com.mongodb.client.MongoClient;
2120
import org.apache.calcite.schema.Schema;
2221
import software.amazon.documentdb.jdbc.DocumentDbConnectionProperties;
2322
import software.amazon.documentdb.jdbc.metadata.DocumentDbDatabaseSchemaMetadata;
@@ -28,12 +27,10 @@ public class DocumentDbSchemaFactory {
2827
*
2928
* @param databaseMetadata the database metadata.
3029
* @param connectionProperties the connection properties.
31-
* @param client the {@link MongoClient} client.
3230
* @return a new {@link Schema} for the database.
3331
*/
3432
public static Schema create(final DocumentDbDatabaseSchemaMetadata databaseMetadata,
35-
final DocumentDbConnectionProperties connectionProperties,
36-
final MongoClient client) {
37-
return new DocumentDbSchema(databaseMetadata, connectionProperties, client);
33+
final DocumentDbConnectionProperties connectionProperties) {
34+
return new DocumentDbSchema(databaseMetadata, connectionProperties);
3835
}
3936
}

0 commit comments

Comments
 (0)