Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Encode resources with data #88

Merged
merged 3 commits into from
Aug 23, 2023
Merged

feat: Encode resources with data #88

merged 3 commits into from
Aug 23, 2023

Conversation

erezrokah
Copy link
Member

@erezrokah erezrokah commented Aug 22, 2023

Part of #5

Still doesn't work but at least Arrow doesn't throw an exception

Added column metadata too, and had to change some of the scalars/types to use whatever Java type the Arrow vector expects

@@ -64,7 +64,7 @@ dependencies {
test {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this because it makes it a pain to see the failing tests

@@ -100,6 +100,7 @@ task runMemDBServe(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = javaMainClass
args = ["serve"]
jvmArgs = ["--add-opens=java.base/java.nio=ALL-UNNAMED"]
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needed this for the arrow serialization

writer.start();
writer.end();
return ByteString.copyFrom(out.toByteArray());
try (VectorSchemaRoot schemaRoot = VectorSchemaRoot.create(schema, bufferAllocator)) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apparently we need to close VectorSchemaRoot (which closes all the underlying vectors) to avoid memory leaks. It's only an issue when we set data on the vectors so we I didn't see it on the table encode before.

Field field =
new Field(
column.getName(),
new FieldType(!column.isNotNull(), column.getType(), null, metadata),
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First argument of FieldType says if the field is nullable

@erezrokah erezrokah marked this pull request as ready for review August 23, 2023 10:53
@erezrokah erezrokah added the automerge Add to automerge PRs once requirements are met label Aug 23, 2023
@erezrokah
Copy link
Member Author

Going to merge to unblock. I can follow up if something is missing

@erezrokah erezrokah merged commit 2c7060f into main Aug 23, 2023
5 checks passed
@erezrokah erezrokah deleted the feat/resolvers branch August 23, 2023 11:36
Copy link
Collaborator

@mnorbury mnorbury left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great progress 🚀 - left some comments.

Comment on lines +60 to +63
if (vector instanceof BigIntVector) {
((BigIntVector) vector).set(0, (long) data);
return;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can follow this pattern which we do elsewhere to remove the cast on the line below:

Suggested change
if (vector instanceof BigIntVector) {
((BigIntVector) vector).set(0, (long) data);
return;
}
if (vector instanceof BigIntVector bigIntVector) {
bigIntVector.set(0, (long) data);
return;
}

@@ -57,7 +167,15 @@ public static Schema toArrowSchema(Table table) {
Field[] fields = new Field[columns.size()];
for (int i = 0; i < columns.size(); i++) {
Column column = columns.get(i);
Field field = Field.nullable(column.getName(), column.getType());
Map<String, String> metadata = new HashMap<>();
metadata.put(CQ_EXTENSION_UNIQUE, column.isUnique() ? "true" : "false");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this just be Boolean.toString(column.isUnique())?

return new Schema(asList(fields), metadata);
}

public static Table fromArrowSchema(Schema schema) {
List<Column> columns = new ArrayList<>();
for (Field field : schema.getFields()) {
columns.add(Column.builder().name(field.getName()).type(field.getType()).build());
boolean isUnique = field.getMetadata().get(CQ_EXTENSION_UNIQUE) == "true";
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
boolean isUnique = field.getMetadata().get(CQ_EXTENSION_UNIQUE) == "true";
boolean isUnique = field.getMetadata().get(CQ_EXTENSION_UNIQUE).equals("true");

Or use Objects.equals(field.getMetadata().get(CQ_EXTENSION_UNIQUE), "true") if it can be null.

@@ -38,6 +37,10 @@ public void sync() {
for (Table table : tables) {
try {
logger.info("resolving table: {}", table.getName());
if (table.getResolver() == null) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could change the getResolver to return Optional<Resolver> - to force clients to handle a potential null sceenario.

kodiakhq bot pushed a commit that referenced this pull request Aug 24, 2023
🤖 I have created a release *beep* *boop*
---


## 0.0.1 (2023-08-24)


### Features

* `io.cloudquery.scalar.Binary` implementation ([#20](#20)) ([b9b73d1](b9b73d1))
* `io.cloudquery.scalar.Bool` ([#27](#27)) ([2a91c92](2a91c92)), closes [#26](#26)
* adding basic support for tables ([#19](#19)) ([22b2350](22b2350))
* adding JSON scalar ([#82](#82)) ([fc92542](fc92542)), closes [#63](#63)
* adding Table filterDFS functionaility ([#21](#21)) ([02d8515](02d8515))
* Date scalars ([#36](#36)) ([adc6ba2](adc6ba2)), closes [#34](#34)
* Duration scalar ([#42](#42)) ([7529438](7529438)), closes [#39](#39)
* Encode resources with data ([#88](#88)) ([2c7060f](2c7060f))
* Generics in scalars ([#56](#56)) ([bc7d6e3](bc7d6e3))
* Implement `getTables` ([#71](#71)) ([085c51f](085c51f))
* Implement concurrency and relations resolving ([#91](#91)) ([0a470b7](0a470b7))
* Init logger, add initial MemDB plugin ([#70](#70)) ([20ebb42](20ebb42))
* int/uint/float/string scalars ([#59](#59)) ([39ec6e6](39ec6e6)), closes [#53](#53) [#54](#54) [#58](#58) [#60](#60)
* Resolve CQId, add CQIds to MemDB plugin ([#95](#95)) ([9d7f1bd](9d7f1bd))
* Scalar Timestamp ([#46](#46)) ([4220e92](4220e92)), closes [#44](#44)
* **sync:** Initial insert message support ([#81](#81)) ([bd729bb](bd729bb))
* **sync:** Send migrate messages ([#79](#79)) ([dd2c1a5](dd2c1a5))


### Bug Fixes

* Add `jackson-annotations` to `build.gradle` ([#83](#83)) ([ead7dd9](ead7dd9))
* **deps:** Update dependency com.google.guava:guava to v32 ([#15](#15)) ([ce8028b](ce8028b))
* **deps:** Update dependency io.grpc:grpc-protobuf to v1.57.1 ([#10](#10)) ([bcfa29c](bcfa29c))
* **deps:** Update dependency io.grpc:grpc-services to v1.57.1 ([#11](#11)) ([71c2ea1](71c2ea1))
* **deps:** Update dependency io.grpc:grpc-stub to v1.57.1 ([#12](#12)) ([c65e5d6](c65e5d6))
* **deps:** Update dependency io.grpc:grpc-testing to v1.57.1 ([#13](#13)) ([a7b1fa6](a7b1fa6))
* **deps:** Update plugin org.gradle.toolchains.foojay-resolver-convention to v0.6.0 ([#14](#14)) ([443990c](443990c))
* Flatten tables in getTables gRPC call ([#80](#80)) ([8c9872a](8c9872a))
* Pass options to tables method ([#78](#78)) ([4b77a2f](4b77a2f))


### Miscellaneous Chores

* Release 0.0.1 ([e169dbc](e169dbc))

---
This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
automerge Add to automerge PRs once requirements are met
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants