|
44 | 44 | import static java.util.stream.Collectors.toList;
|
45 | 45 | import static java.util.stream.Collectors.toMap;
|
46 | 46 | import static lombok.AccessLevel.PROTECTED;
|
| 47 | +import static tech.ydb.yoj.databind.FieldValueType.STRING; |
47 | 48 |
|
48 | 49 | public abstract class Schema<T> {
|
49 | 50 | public static final String PATH_DELIMITER = ".";
|
@@ -194,9 +195,20 @@ protected Schema(Schema<?> schema, String subSchemaFieldPath) {
|
194 | 195 |
|
195 | 196 | staticName = schema.staticName;
|
196 | 197 | globalIndexes = schema.globalIndexes;
|
197 |
| - fields = (subSchemaField.fields == null) |
198 |
| - ? List.of() |
199 |
| - : subSchemaField.fields.stream().map(this::newRootJavaField).toList(); |
| 198 | + |
| 199 | + if (subSchemaField.fields != null) { |
| 200 | + fields = subSchemaField.fields.stream().map(this::newRootJavaField).toList(); |
| 201 | + } else { |
| 202 | + var subSchemaFieldType = subSchemaField.getRawType(); |
| 203 | + if (subSchemaFieldType.getAnnotation(StringValueType.class) != null |
| 204 | + && subSchemaFieldType.getAnnotation(StringValueType.class).entityId()) { |
| 205 | + var dummyField = new JavaField(new DummyStringValueField(subSchemaField), subSchemaField, __ -> true); |
| 206 | + dummyField.setName(subSchemaField.getName()); |
| 207 | + fields = List.of(dummyField); |
| 208 | + } else { |
| 209 | + fields = List.of(); |
| 210 | + } |
| 211 | + } |
200 | 212 | ttlModifier = schema.ttlModifier;
|
201 | 213 | changefeeds = schema.changefeeds;
|
202 | 214 | }
|
@@ -379,6 +391,65 @@ public final String toString() {
|
379 | 391 | + " [type=" + getType().getName() + "]";
|
380 | 392 | }
|
381 | 393 |
|
| 394 | + private static final class DummyStringValueField implements ReflectField { |
| 395 | + private final JavaField donor; |
| 396 | + |
| 397 | + private DummyStringValueField(JavaField donor) { |
| 398 | + this.donor = donor; |
| 399 | + } |
| 400 | + |
| 401 | + @Override |
| 402 | + public String getName() { |
| 403 | + return donor.getName(); |
| 404 | + } |
| 405 | + |
| 406 | + @Override |
| 407 | + public Column getColumn() { |
| 408 | + return donor.getField().getColumn(); |
| 409 | + } |
| 410 | + |
| 411 | + @Override |
| 412 | + public Type getGenericType() { |
| 413 | + return String.class; |
| 414 | + } |
| 415 | + |
| 416 | + @Override |
| 417 | + public Class<?> getType() { |
| 418 | + return String.class; |
| 419 | + } |
| 420 | + |
| 421 | + @Override |
| 422 | + public ReflectType<?> getReflectType() { |
| 423 | + return donor.getField().getReflectType(); |
| 424 | + } |
| 425 | + |
| 426 | + @Override |
| 427 | + public Object getValue(Object containingObject) { |
| 428 | + Preconditions.checkArgument(donor.getRawType().isInstance(containingObject), |
| 429 | + "Tried to get value of a string-value field '%s' on an invalid type: expected %s, got %s", |
| 430 | + donor.getPath(), |
| 431 | + donor.getRawType(), |
| 432 | + containingObject == null ? "<null value>" : containingObject.getClass() |
| 433 | + ); |
| 434 | + return containingObject.toString(); |
| 435 | + } |
| 436 | + |
| 437 | + @Override |
| 438 | + public Collection<ReflectField> getChildren() { |
| 439 | + return Set.of(); |
| 440 | + } |
| 441 | + |
| 442 | + @Override |
| 443 | + public FieldValueType getValueType() { |
| 444 | + return STRING; |
| 445 | + } |
| 446 | + |
| 447 | + @Override |
| 448 | + public String toString() { |
| 449 | + return "DummyStringValueField[donor=" + donor + "]"; |
| 450 | + } |
| 451 | + } |
| 452 | + |
382 | 453 | public static final class JavaField {
|
383 | 454 | @Getter
|
384 | 455 | private final ReflectField field;
|
@@ -462,6 +533,10 @@ public Type getType() {
|
462 | 533 | return field.getGenericType();
|
463 | 534 | }
|
464 | 535 |
|
| 536 | + public Class<?> getRawType() { |
| 537 | + return field.getType(); |
| 538 | + } |
| 539 | + |
465 | 540 | // FIXME: make this method non-public
|
466 | 541 | @Deprecated
|
467 | 542 | public void setName(String newName) {
|
|
0 commit comments