Skip to content

Commit 736c30b

Browse files
authored
Merge pull request #303 from ldbc/change-header-attribute-names
Change header attribute names
2 parents d1e041d + 0d377d0 commit 736c30b

File tree

7 files changed

+50
-48
lines changed

7 files changed

+50
-48
lines changed

src/main/java/ldbc/snb/datagen/serializer/DynamicActivitySerializer.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,14 @@ public void writeFileHeaders() {
6161

6262
List<String> dates2 = ImmutableList.of("creationDate", "deletionDate");
6363

64-
writers.get(FORUM) .writeHeader(dates1, ImmutableList.of("id", "title", "moderator"));
64+
writers.get(FORUM) .writeHeader(dates1, ImmutableList.of("id", "title", "ModeratorPerson.id"));
6565
writers.get(FORUM_HASTAG_TAG) .writeHeader(dates2, ImmutableList.of("Forum.id", "Tag.id"));
6666
writers.get(FORUM_HASMEMBER_PERSON) .writeHeader(dates1, ImmutableList.of("Forum.id", "Person.id"));
6767

68-
writers.get(POST) .writeHeader(dates1, ImmutableList.of("id", "imageFile", "locationIP", "browserUsed", "language", "content", "length", "creator", "Forum.id", "Country.id"));
68+
writers.get(POST) .writeHeader(dates1, ImmutableList.of("id", "imageFile", "locationIP", "browserUsed", "language", "content", "length", "CreatorPerson.id", "ContainerForum.id", "LocationCountry.id"));
6969
writers.get(POST_HASTAG_TAG) .writeHeader(dates2, ImmutableList.of("Post.id", "Tag.id"));
7070

71-
writers.get(COMMENT) .writeHeader(dates1, ImmutableList.of("id", "locationIP", "browserUsed", "content", "length", "creator", "Country.id", "replyOfPost", "replyOfComment"));
71+
writers.get(COMMENT) .writeHeader(dates1, ImmutableList.of("id", "locationIP", "browserUsed", "content", "length", "CreatorPerson.id", "LocationCountry.id", "ParentPost.id", "ParentComment.id"));
7272
writers.get(COMMENT_HASTAG_TAG) .writeHeader(dates2, ImmutableList.of("Comment.id", "Tag.id"));
7373

7474
writers.get(PERSON_LIKES_POST) .writeHeader(dates1, ImmutableList.of("Person.id", "Post.id"));
@@ -79,7 +79,7 @@ public void writeFileHeaders() {
7979
public void serialize(final Forum forum) {
8080
List<String> dates = ImmutableList.of(formatDateTime(forum.getCreationDate()), formatDateTime(forum.getDeletionDate()), String.valueOf(forum.isExplicitlyDeleted()));
8181

82-
// creationDate, deletionDate, explicitlyDeleted, id, title, moderator
82+
// creationDate, deletionDate, explicitlyDeleted, id, title, ModeratorPerson.id
8383
writers.get(FORUM).writeEntry(dates, ImmutableList.of(
8484
Long.toString(forum.getId()),
8585
forum.getTitle(),
@@ -88,7 +88,7 @@ public void serialize(final Forum forum) {
8888

8989
List<String> dates2 = ImmutableList.of(formatDateTime(forum.getCreationDate()), formatDateTime(forum.getDeletionDate()));
9090
for (Integer i : forum.getTags()) {
91-
// creationDate, deletionDate Forum.id, Tag.id
91+
// creationDate, deletionDate, Forum.id, Tag.id
9292
writers.get(FORUM_HASTAG_TAG).writeEntry(dates2, ImmutableList.of(
9393
Long.toString(forum.getId()),
9494
Integer.toString(i)
@@ -100,7 +100,7 @@ public void serialize(final Forum forum) {
100100
public void serialize(final Post post) {
101101
List<String> dates1 = ImmutableList.of(formatDateTime(post.getCreationDate()), formatDateTime(post.getDeletionDate()), String.valueOf(post.isExplicitlyDeleted()));
102102

103-
// creationDate, deletionDate, explicitlyDeleted, id, imageFile, locationIP, browserUsed, language, content, length, creator, Forum.id, place
103+
// creationDate, deletionDate, explicitlyDeleted, id, imageFile, locationIP, browserUsed, language, content, length, CreatorPerson.id, ContainerForum.id, LocationCountry.id
104104
writers.get(POST).writeEntry(dates1, ImmutableList.of(
105105
Long.toString(post.getMessageId()),
106106
"",
@@ -117,7 +117,7 @@ public void serialize(final Post post) {
117117
List<String> dates2 = ImmutableList.of(formatDateTime(post.getCreationDate()), formatDateTime(post.getDeletionDate()));
118118

119119
for (Integer t : post.getTags()) {
120-
// creationDate, deletionDate Post.id, Tag.id
120+
// creationDate, deletionDate, Post.id, Tag.id
121121
writers.get(POST_HASTAG_TAG).writeEntry(dates2, ImmutableList.of(
122122
Long.toString(post.getMessageId()),
123123
Integer.toString(t)
@@ -128,7 +128,7 @@ public void serialize(final Post post) {
128128
public void serialize(final Comment comment) {
129129
List<String> dates1 = ImmutableList.of(formatDateTime(comment.getCreationDate()), formatDateTime(comment.getDeletionDate()), String.valueOf(comment.isExplicitlyDeleted()));
130130

131-
// creationDate, deletionDate, explicitlyDeleted, id, locationIP, browserUsed, content, length, creator, place, parentPost, parentComment
131+
// creationDate, deletionDate, explicitlyDeleted, id, locationIP, browserUsed, content, length, CreatorPerson.id, LocationCountry.id, ParentPost.id, ParentComment.id
132132
writers.get(COMMENT).writeEntry(dates1, ImmutableList.of(
133133
Long.toString(comment.getMessageId()),
134134
comment.getIpAddress().toString(),
@@ -143,7 +143,7 @@ public void serialize(final Comment comment) {
143143

144144
List<String> dates2 = ImmutableList.of(formatDateTime(comment.getCreationDate()), formatDateTime(comment.getDeletionDate()));
145145
for (Integer t : comment.getTags()) {
146-
// creationDate, deletionDate Comment.id, Tag.id
146+
// creationDate, deletionDate, Comment.id, Tag.id
147147
writers.get(COMMENT_HASTAG_TAG).writeEntry(dates2, ImmutableList.of(
148148
Long.toString(comment.getMessageId()),
149149
Integer.toString(t)
@@ -154,7 +154,7 @@ public void serialize(final Comment comment) {
154154
public void serialize(final Photo photo) {
155155
List<String> dates1 = ImmutableList.of(formatDateTime(photo.getCreationDate()), formatDateTime(photo.getDeletionDate()), String.valueOf(photo.isExplicitlyDeleted()));
156156

157-
// creationDate, deletionDate, explicitlyDeleted, id, imageFile, locationIP, browserUsed, language, content, length, creator, Forum.id, place
157+
// creationDate, deletionDate, explicitlyDeleted, id, imageFile, locationIP, browserUsed, language, content, length, CreatorPerson.id, ContainerForum.id, LocationCountry.id
158158
writers.get(POST).writeEntry(dates1, ImmutableList.of(
159159
Long.toString(photo.getMessageId()),
160160
photo.getContent(),
@@ -170,7 +170,7 @@ public void serialize(final Photo photo) {
170170

171171
List<String> dates2 = ImmutableList.of(formatDateTime(photo.getCreationDate()), formatDateTime(photo.getDeletionDate()));
172172
for (Integer t : photo.getTags()) {
173-
// creationDate, deletionDate Post.id, Tag.id
173+
// creationDate, deletionDate, Post.id, Tag.id
174174
writers.get(POST_HASTAG_TAG).writeEntry(dates2, ImmutableList.of(
175175
Long.toString(photo.getMessageId()),
176176
Integer.toString(t)
@@ -191,7 +191,9 @@ public void serialize(final ForumMembership membership) {
191191
public void serialize(final Like like) {
192192
List<String> dates = ImmutableList.of(formatDateTime(like.getCreationDate()), formatDateTime(like.getDeletionDate()), String.valueOf(like.isExplicitlyDeleted()));
193193

194-
// creationDate, deletionDate, explicitlyDeleted, Person.id, Message.id
194+
// creationDate, deletionDate, explicitlyDeleted, Person.id, Post.id
195+
// or
196+
// creationDate, deletionDate, explicitlyDeleted, Person.id, Comment.id
195197
List<String> arguments = ImmutableList.of(
196198
Long.toString(like.getPerson()),
197199
Long.toString(like.getMessageId())
@@ -203,7 +205,6 @@ public void serialize(final Like like) {
203205
}
204206
}
205207

206-
207208
@Override
208209
protected boolean isDynamic() {
209210
return true;

src/main/java/ldbc/snb/datagen/serializer/DynamicPersonSerializer.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void writeFileHeaders() {
6060
List<String> dates1 = ImmutableList.of("creationDate", "deletionDate", "explicitlyDeleted");
6161

6262
// one-to-many edges, single- and multi-valued attributes
63-
writers.get(PERSON) .writeHeader(dates1, ImmutableList.of("id", "firstName", "lastName", "gender", "birthday", "locationIP", "browserUsed", "city", "language", "email"));
63+
writers.get(PERSON) .writeHeader(dates1, ImmutableList.of("id", "firstName", "lastName", "gender", "birthday", "locationIP", "browserUsed", "LocationCity.id", "language", "email"));
6464

6565
// many-to-many edges
6666
writers.get(PERSON_KNOWS_PERSON) .writeHeader(dates1, ImmutableList.of("Person1.id", "Person2.id"));
@@ -74,7 +74,7 @@ public void writeFileHeaders() {
7474
public void serialize(final Person person) {
7575
List<String> dates1 = ImmutableList.of(formatDateTime(person.getCreationDate()), formatDateTime(person.getDeletionDate()), String.valueOf(person.isExplicitlyDeleted()));
7676

77-
// creationDate, deletionDate, explicitlyDeleted, id, firstName, lastName, gender, birthday, locationIP, browserUsed, isLocatedIn, language, email
77+
// creationDate, deletionDate, explicitlyDeleted, id, firstName, lastName, gender, birthday, locationIP, browserUsed, LocationCity.id, language, email
7878
writers.get(PERSON).writeEntry(dates1, ImmutableList.of(
7979
Long.toString(person.getAccountId()),
8080
person.getFirstName(),
@@ -90,7 +90,7 @@ public void serialize(final Person person) {
9090

9191
List<String> dates2 = ImmutableList.of(formatDateTime(person.getCreationDate()), formatDateTime(person.getDeletionDate()));
9292
for (Integer interestIdx : person.getInterests()) {
93-
// creationDate, deletionDate Person.id, Tag.id
93+
// creationDate, deletionDate, Person.id, Tag.id
9494
writers.get(PERSON_HASINTEREST_TAG).writeEntry(dates2, ImmutableList.of(
9595
Long.toString(person.getAccountId()),
9696
Integer.toString(interestIdx)
@@ -101,7 +101,7 @@ public void serialize(final Person person) {
101101
public void serialize(final StudyAt studyAt, final Person person) {
102102
List<String> dates = ImmutableList.of(formatDateTime(person.getCreationDate()), formatDateTime(person.getDeletionDate()));
103103

104-
// creationDate, deletionDate Person.id, University.id, classYear
104+
// creationDate, deletionDate, Person.id, University.id, classYear
105105
writers.get(PERSON_STUDYAT_UNIVERSITY).writeEntry(dates, ImmutableList.of(
106106
Long.toString(studyAt.person),
107107
Long.toString(studyAt.university),
@@ -112,7 +112,7 @@ public void serialize(final StudyAt studyAt, final Person person) {
112112
public void serialize(final WorkAt workAt, final Person person) {
113113
List<String> dates = ImmutableList.of(formatDateTime(person.getCreationDate()), formatDateTime(person.getDeletionDate()));
114114

115-
// creationDate, deletionDate Person.id, Company.id, workFrom
115+
// creationDate, deletionDate, Person.id, Company.id, workFrom
116116
writers.get(PERSON_WORKAT_COMPANY).writeEntry(dates, ImmutableList.of(
117117
Long.toString(workAt.person),
118118
Long.toString(workAt.company),

src/main/scala/ldbc/snb/datagen/transformation/TransformationStage.scala

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,46 +43,46 @@ object TransformationStage extends SparkApp with Logging {
4343
"`id` INT, `name` STRING, `url` STRING, `isSubclassOf` INT"
4444
),
4545
Node("Comment") -> Some(
46-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `id` BIGINT, `locationIP` STRING, `browserUsed` STRING, `content` STRING, `length` INT, `Person.id` BIGINT, `Country.id` INT, `replyOfPost` BIGINT, `replyOfComment` BIGINT"
46+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `id` BIGINT, `locationIP` STRING, `browserUsed` STRING, `content` STRING, `length` INT, `CreatorPersonId` BIGINT, `LocationCountryId` INT, `ParentPostId` BIGINT, `ParentCommentId` BIGINT"
4747
),
4848
Edge("HasTag", "Comment", "Tag", NN) -> Some(
49-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `Comment.id` BIGINT, `Tag.id` INT"
49+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `CommentId` BIGINT, `TagId` INT"
5050
),
5151
Node("Forum") -> Some(
52-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `id` BIGINT, `title` STRING, `moderator` BIGINT"
52+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `id` BIGINT, `title` STRING, `ModeratorPersonId` BIGINT"
5353
),
5454
Edge("HasMember", "Forum", "Person", NN) -> Some(
55-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `Forum.id` BIGINT, `Person.id` BIGINT"
55+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `ForumId` BIGINT, `PersonId` BIGINT"
5656
),
5757
Edge("HasTag", "Forum", "Tag", NN) -> Some(
58-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `Forum.id` BIGINT, `Tag.id` INT"
58+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `ForumId` BIGINT, `TagId` INT"
5959
),
6060
Node("Person") -> Some(
61-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `id` BIGINT, `firstName` STRING, `lastName` STRING, `gender` STRING, `birthday` DATE, `locationIP` STRING, `browserUsed` STRING, `City.id` INT, `language` STRING, `email` STRING"
61+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `id` BIGINT, `firstName` STRING, `lastName` STRING, `gender` STRING, `birthday` DATE, `locationIP` STRING, `browserUsed` STRING, `LocationCityId` INT, `language` STRING, `email` STRING"
6262
),
6363
Edge("HasInterest", "Person", "Tag", NN) -> Some(
64-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `Person.id` BIGINT, `Tag.id` INT"
64+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `PersonId` BIGINT, `TagId` INT"
6565
),
6666
Edge("Knows", "Person", "Person", NN) -> Some(
67-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `Person1.id` BIGINT, `Person2.id` BIGINT"
67+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `Person1Id` BIGINT, `Person2Id` BIGINT"
6868
),
6969
Edge("Likes", "Person", "Comment", NN) -> Some(
70-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `Person.id` BIGINT, `Comment.id` BIGINT"
70+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `PersonId` BIGINT, `CommentId` BIGINT"
7171
),
7272
Edge("Likes", "Person", "Post", NN) -> Some(
73-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `Person.id` BIGINT, `Post.id` BIGINT"
73+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `PersonId` BIGINT, `PostId` BIGINT"
7474
),
7575
Edge("StudyAt", "Person", "University", OneN) -> Some(
76-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `Person.id` BIGINT, `University.id` INT, `classYear` INT"
76+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `PersonId` BIGINT, `UniversityId` INT, `classYear` INT"
7777
),
7878
Edge("WorkAt", "Person", "Company", NN) -> Some(
79-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `Person.id` BIGINT, `Company.id` INT, `workFrom` INT"
79+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `PersonId` BIGINT, `CompanyId` INT, `workFrom` INT"
8080
),
8181
Node("Post") -> Some(
82-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `id` BIGINT, `imageFile` STRING, `locationIP` STRING, `browserUsed` STRING, `language` STRING, `content` STRING, `length` INT, `Person.id` BIGINT, `Forum.id` BIGINT, `Country.id` INT"
82+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `explicitlyDeleted` BOOLEAN, `id` BIGINT, `imageFile` STRING, `locationIP` STRING, `browserUsed` STRING, `language` STRING, `content` STRING, `length` INT, `CreatorPersonId` BIGINT, `ContainerForumId` BIGINT, `LocationCountryId` INT"
8383
),
8484
Edge("HasTag", "Post", "Tag", NN) -> Some(
85-
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `Post.id` BIGINT, `Tag.id` INT"
85+
"`creationDate` TIMESTAMP, `deletionDate` TIMESTAMP, `PostId` BIGINT, `TagId` INT"
8686
)
8787
)
8888
)

src/main/scala/ldbc/snb/datagen/transformation/model/package.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ package object model {
4242
override val primaryKey: Seq[String] = ((source, destination) match {
4343
case (s, d) if s == d => Seq(s"${s}1", s"${d}2")
4444
case (s, d) => Seq(s, d)
45-
}).map(name => s"$name.id")
45+
}).map(name => s"${name}Id")
4646

4747
override def toString: String = s"$source -[${`type`}]-> $destination"
4848
}
@@ -53,7 +53,7 @@ package object model {
5353
override val primaryKey: Seq[String] = ((parent, attribute) match {
5454
case (s, d) if s == d => Seq(s"${s}1", s"${d}2")
5555
case (s, d) => Seq(s, d)
56-
}).map(name => s"$name.id")
56+
}).map(name => s"${name}Id")
5757
override def toString: String = s"$parent ♢-[${`type`}]-> $attribute"
5858
}
5959

src/main/scala/ldbc/snb/datagen/transformation/transform/ExplodeAttrs.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ object ExplodeAttrs extends Transform[Mode.Raw.type, Mode.Raw.type] {
1212
override def transform(input: In): Out = {
1313

1414
def explodedAttr(attr: Attr, node: DataFrame, column: Column) =
15-
attr -> node.select(withRawColumns(attr, $"id".as(s"${attr.parent}.id"), explode(split(column, ";")).as(s"${attr.attribute}.id")))
15+
attr -> node.select(withRawColumns(attr, $"id".as(s"${attr.parent}Id"), explode(split(column, ";")).as(s"${attr.attribute}Id")))
1616

1717
val updatedEntities = input.entities.collect {
1818
case (k@Node("Person", false), v) => Map(

src/main/scala/ldbc/snb/datagen/transformation/transform/ExplodeEdges.scala

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,27 +41,27 @@ object ExplodeEdges extends Transform[Mode.Raw.type, Mode.Raw.type]{
4141
k -> v.drop("isSubclassOf")
4242
)
4343
case (k@Node("Comment", false), v) => Map(
44-
explodedEdge(Edge("HasCreator", "Comment", "Person", OneN), v, $"`Person.id`"),
45-
explodedEdge(Edge("IsLocatedIn", "Comment", "Country", OneN), v, $"`Country.id`"),
46-
explodedEdge(Edge("ReplyOf", "Comment", "Comment", OneN), v, $"replyOfComment"),
47-
explodedEdge(Edge("ReplyOf", "Comment", "Post", OneN), v, $"replyOfPost"),
48-
k -> v.drop("Person.id", "Country.id", "replyOfPost", "replyOfComment")
44+
explodedEdge(Edge("HasCreator", "Comment", "Person", OneN), v, $"CreatorPersonId"),
45+
explodedEdge(Edge("IsLocatedIn", "Comment", "Country", OneN), v, $"LocationCountryId"),
46+
explodedEdge(Edge("ReplyOf", "Comment", "Post", OneN), v, $"ParentPostId"),
47+
explodedEdge(Edge("ReplyOf", "Comment", "Comment", OneN), v, $"ParentCommentId"),
48+
k -> v.drop("CreatorPersonId", "LocationCountryId", "ParentPostId", "ParentCommentId")
4949
)
5050
case (k@Node("Forum", false), v) => Map(
51-
explodedEdge(Edge("HasModerator", "Forum", "Person", OneN), v, $"moderator"),
52-
k -> v.drop("moderator")
51+
explodedEdge(Edge("HasModerator", "Forum", "Person", OneN), v, $"ModeratorPersonId"),
52+
k -> v.drop("ModeratorPersonId")
5353
)
5454

5555
case (k@Node("Person", false), v) => Map(
56-
explodedEdge(Edge("IsLocatedIn", "Person", "City", OneN), v, $"`City.id`"),
57-
k -> v.drop("City.id")
56+
explodedEdge(Edge("IsLocatedIn", "Person", "City", OneN), v, $"LocationCityId"),
57+
k -> v.drop("LocationCityId")
5858
)
5959

6060
case (k@Node("Post", false), v) => Map(
61-
explodedEdge(Edge("HasCreator", "Post", "Person", OneN), v, $"`Person.id`"),
62-
explodedEdge(Edge("IsLocatedIn", "Post", "Country", OneN), v, $"`Country.id`"),
63-
explodedEdge(Edge("ContainerOf", "Forum", "Post", NOne), v, $"`Forum.id`"),
64-
k -> v.drop("Person.id", "Country.id", "Forum.id")
61+
explodedEdge(Edge("HasCreator", "Post", "Person", OneN), v, $"CreatorPersonId"),
62+
explodedEdge(Edge("IsLocatedIn", "Post", "Country", OneN), v, $"LocationCountryId"),
63+
explodedEdge(Edge("ContainerOf", "Forum", "Post", NOne), v, $"ContainerForumId"),
64+
k -> v.drop("CreatorPersonId", "LocationCountryId", "ContainerForumId")
6565
)
6666
}.foldLeft(entities)(_ ++ _)
6767

0 commit comments

Comments
 (0)