From 3cf3d3864717c83bf308e741869b5581d5267812 Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Thu, 7 Sep 2017 17:26:54 +0300 Subject: [PATCH 1/9] implement DynamicRealmObject.getValueList() --- .../src/main/java/io/realm/DynamicRealmObject.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java index 20b9a54a79..5424c1b2e6 100644 --- a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java +++ b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java @@ -367,8 +367,17 @@ public RealmList getList(String fieldName) { * @throws IllegalArgumentException if field name doesn't exist or it doesn't contain a list of values. */ public RealmList getValueList(String fieldName, Class valueClass) { - // TODO implement this - return null; + proxyState.getRealm$realm().checkIfValid(); + + long columnIndex = proxyState.getRow$realm().getColumnIndex(fieldName); + try { + OsList osList = proxyState.getRow$realm().getList(columnIndex); + //noinspection ConstantConditions + return new RealmList(valueClass, osList, proxyState.getRealm$realm()); + } catch (IllegalArgumentException e) { + checkFieldType(fieldName, columnIndex, RealmFieldType.LIST); + throw e; + } } /** From 56f8e6cadc907948cf70f4bf26158730904307b3 Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Sat, 9 Sep 2017 15:36:11 +0300 Subject: [PATCH 2/9] implement stricter check when handling list --- .../java/io/realm/DynamicRealmObject.java | 83 ++++++++++++++++--- 1 file changed, 73 insertions(+), 10 deletions(-) diff --git a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java index 5424c1b2e6..fd8ef0fa40 100644 --- a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java +++ b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java @@ -16,8 +16,11 @@ package io.realm; import java.util.Arrays; +import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -40,6 +43,30 @@ public class DynamicRealmObject extends RealmObject implements RealmObjectProxy { static final String MSG_LINK_QUERY_NOT_SUPPORTED = "Queries across relationships are not supported"; + private static final Map, RealmFieldType> VALUE_CLASS_TO_LIST_FIELD_TYPE; + static { + final HashMap, RealmFieldType> map = new HashMap<>(); + map.put(String.class, RealmFieldType.STRING_LIST); + map.put(byte[].class, RealmFieldType.BINARY_LIST); + map.put(Boolean.class, RealmFieldType.BOOLEAN_LIST); + map.put(Long.class, RealmFieldType.INTEGER_LIST); + map.put(Integer.class, RealmFieldType.INTEGER_LIST); + map.put(Short.class, RealmFieldType.INTEGER_LIST); + map.put(Byte.class, RealmFieldType.INTEGER_LIST); + map.put(Double.class, RealmFieldType.DOUBLE_LIST); + map.put(Float.class, RealmFieldType.FLOAT_LIST); + map.put(Date.class, RealmFieldType.DATE_LIST); + VALUE_CLASS_TO_LIST_FIELD_TYPE = Collections.unmodifiableMap(map); + } + + private static RealmFieldType getFieldTypeForValueClass(Class valueClass) { + final RealmFieldType expectedFieldType = VALUE_CLASS_TO_LIST_FIELD_TYPE.get(valueClass); + if (expectedFieldType == null) { + throw new IllegalArgumentException("Unsupported value type: " + valueClass.getName()); + } + return expectedFieldType; + } + private final ProxyState proxyState = new ProxyState<>(this); /** @@ -342,6 +369,7 @@ public DynamicRealmObject getObject(String fieldName) { * @param fieldName the name of the field. * @return the {@link RealmList} data for this field. * @throws IllegalArgumentException if field name doesn't exist or it doesn't contain a list of objects. + * @see #getValueList(String, Class) */ public RealmList getList(String fieldName) { proxyState.getRealm$realm().checkIfValid(); @@ -349,9 +377,15 @@ public RealmList getList(String fieldName) { long columnIndex = proxyState.getRow$realm().getColumnIndex(fieldName); try { OsList osList = proxyState.getRow$realm().getList(columnIndex); - //noinspection ConstantConditions - @Nonnull - String className = osList.getTargetTable().getClassName(); + final Table targetTable = osList.getTargetTable(); + if (targetTable == null) { + throw new IllegalArgumentException("The field is value list."); + } + + final String className = targetTable.getClassName(); + if (className == null) { + throw new IllegalStateException("Unexpectedly target class name is null."); + } return new RealmList<>(className, osList, proxyState.getRealm$realm()); } catch (IllegalArgumentException e) { checkFieldType(fieldName, columnIndex, RealmFieldType.LIST); @@ -364,20 +398,29 @@ public RealmList getList(String fieldName) { * * @param fieldName the name of the field. * @return the {@link RealmList} data for this field. - * @throws IllegalArgumentException if field name doesn't exist or it doesn't contain a list of values. + * @throws IllegalArgumentException if field name doesn't exist or it doesn't contain a list of values or {@code valueClass} is not valid for the field type. + * @see #getList(String) */ public RealmList getValueList(String fieldName, Class valueClass) { proxyState.getRealm$realm().checkIfValid(); + final RealmFieldType expectedFieldType = getFieldTypeForValueClass(valueClass); + final OsList osList; long columnIndex = proxyState.getRow$realm().getColumnIndex(fieldName); try { - OsList osList = proxyState.getRow$realm().getList(columnIndex); - //noinspection ConstantConditions - return new RealmList(valueClass, osList, proxyState.getRealm$realm()); + osList = proxyState.getRow$realm().getList(columnIndex); + final Table targetTable = osList.getTargetTable(); + if (targetTable != null) { + throw new IllegalArgumentException("The field is object list."); + } } catch (IllegalArgumentException e) { - checkFieldType(fieldName, columnIndex, RealmFieldType.LIST); + checkFieldType(fieldName, columnIndex, expectedFieldType); throw e; } + + checkFieldType(fieldName, columnIndex, expectedFieldType); + //noinspection ConstantConditions + return new RealmList(valueClass, osList, proxyState.getRealm$realm()); } /** @@ -404,8 +447,17 @@ public boolean isNull(String fieldName) { case DATE: return proxyState.getRow$realm().isNull(columnIndex); case LIST: + case BINARY_LIST: + case BOOLEAN_LIST: + case DATE_LIST: + case DOUBLE_LIST: + case FLOAT_LIST: + case STRING_LIST: + case INTEGER_LIST: + case LINKING_OBJECTS: case UNSUPPORTED_TABLE: case UNSUPPORTED_MIXED: + case UNSUPPORTED_DATE: default: return false; } @@ -753,9 +805,17 @@ public void setList(String fieldName, RealmList list) { throw new IllegalArgumentException("Null values not allowed for lists"); } - long columnIndex = proxyState.getRow$realm().getColumnIndex(fieldName); - OsList osList = proxyState.getRow$realm().getList(columnIndex); + final Row row = proxyState.getRow$realm(); + long columnIndex = row.getColumnIndex(fieldName); + OsList osList = row.getList(columnIndex); Table linkTargetTable = osList.getTargetTable(); + if (linkTargetTable == null) { + // designated field was value list, not object list. + throw new IllegalArgumentException(String.format(Locale.US, + "Unexpected field type. Was %s, expected %s.", + row.getColumnType(columnIndex).name(), RealmFieldType.LIST.name())); + } + //noinspection ConstantConditions @Nonnull final String linkTargetTableName = linkTargetTable.getClassName(); @@ -781,6 +841,9 @@ public void setList(String fieldName, RealmList list) { for (int i = 0; i < listLength; i++) { RealmObjectProxy obj = list.get(i); + if (obj == null) { + throw new IllegalArgumentException("Null element is not allowed."); + } if (obj.realmGet$proxyState().getRealm$realm() != proxyState.getRealm$realm()) { throw new IllegalArgumentException("Each element in 'list' must belong to the same Realm instance."); } From 1e037b3d7006ba6841889c6cfd927e824e90899a Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Sat, 9 Sep 2017 17:04:25 +0300 Subject: [PATCH 3/9] implement DynamicRealmObject.setValueList() --- .../java/io/realm/DynamicRealmObject.java | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java index fd8ef0fa40..8d7cdf974f 100644 --- a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java +++ b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java @@ -19,6 +19,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.Locale; import java.util.Map; @@ -59,6 +60,22 @@ public class DynamicRealmObject extends RealmObject implements RealmObjectProxy VALUE_CLASS_TO_LIST_FIELD_TYPE = Collections.unmodifiableMap(map); } + private static final Map> LIST_FIELD_TYPE_TO_VALUE_CLASS; + static { + final HashMap> map = new HashMap<>(); + map.put(RealmFieldType.STRING_LIST, String.class); + map.put(RealmFieldType.BINARY_LIST, byte[].class); + map.put(RealmFieldType.BOOLEAN_LIST, Boolean.class); + map.put(RealmFieldType.INTEGER_LIST, Long.class); + map.put(RealmFieldType.INTEGER_LIST, Integer.class); + map.put(RealmFieldType.INTEGER_LIST, Short.class); + map.put(RealmFieldType.INTEGER_LIST, Byte.class); + map.put(RealmFieldType.DOUBLE_LIST, Double.class); + map.put(RealmFieldType.FLOAT_LIST, Float.class); + map.put(RealmFieldType.DATE_LIST, Date.class); + LIST_FIELD_TYPE_TO_VALUE_CLASS = Collections.unmodifiableMap(map); + } + private static RealmFieldType getFieldTypeForValueClass(Class valueClass) { final RealmFieldType expectedFieldType = VALUE_CLASS_TO_LIST_FIELD_TYPE.get(valueClass); if (expectedFieldType == null) { @@ -864,6 +881,41 @@ public void setList(String fieldName, RealmList list) { } } + private static boolean isClassForRealmModel(Class clazz) { + return RealmModel.class.isAssignableFrom(clazz); + } + + private ManagedListOperator getOperator(BaseRealm realm, OsList osList, RealmFieldType valueListType, Class valueClass) { + if (valueListType == RealmFieldType.STRING_LIST) { + //noinspection unchecked + return (ManagedListOperator) new StringListOperator(realm, osList, (Class) valueClass); + } + if (valueListType == RealmFieldType.INTEGER_LIST) { + return new LongListOperator<>(realm, osList, valueClass); + } + if (valueListType == RealmFieldType.BOOLEAN_LIST) { + //noinspection unchecked + return (ManagedListOperator) new BooleanListOperator(realm, osList, (Class) valueClass); + } + if (valueListType == RealmFieldType.BINARY_LIST) { + //noinspection unchecked + return (ManagedListOperator) new BinaryListOperator(realm, osList, (Class) valueClass); + } + if (valueListType == RealmFieldType.DOUBLE_LIST) { + //noinspection unchecked + return (ManagedListOperator) new DoubleListOperator(realm, osList, (Class) valueClass); + } + if (valueListType == RealmFieldType.FLOAT_LIST) { + //noinspection unchecked + return (ManagedListOperator) new FloatListOperator(realm, osList, (Class) valueClass); + } + if (valueListType == RealmFieldType.DATE_LIST) { + //noinspection unchecked + return (ManagedListOperator) new DateListOperator(realm, osList, (Class) valueClass); + } + throw new IllegalArgumentException("Unexpected list type: " + valueListType.name()); + } + /** * Sets the reference to a {@link RealmList} on the given field. * @@ -874,7 +926,47 @@ public void setList(String fieldName, RealmList list) { * different Realm. */ public void setValueList(String fieldName, RealmList list) { - // TODO implement this + proxyState.getRealm$realm().checkIfValid(); + + //noinspection ConstantConditions + if (list == null) { + throw new IllegalArgumentException("Null values not allowed for lists"); + } + + final Row row = proxyState.getRow$realm(); + long columnIndex = row.getColumnIndex(fieldName); + final OsList targetOsList = row.getList(columnIndex); + final Table linkTargetTable = targetOsList.getTargetTable(); + if (linkTargetTable != null) { + // designated field was object list, not value list. + throw new IllegalArgumentException(String.format(Locale.US, + "Unexpected field type. Was %s, expected %s.", + row.getColumnType(columnIndex).name(), "one of the value list")); + } + + final RealmFieldType fieldType = getFieldType(fieldName); + final Class valueClass = LIST_FIELD_TYPE_TO_VALUE_CLASS.get(fieldType); + + final ManagedListOperator operator = getOperator(proxyState.getRealm$realm(), targetOsList, fieldType, valueClass); + + if (list.isManaged() && targetOsList.size() == list.size()) { + /* + * There is a chance that the source list and the target list are the same list in the same object. + * In this case, we can't use clear. + */ + final int size = list.size(); + final Iterator iterator = list.iterator(); + for (int i = 0; i < size; i++) { + @Nullable + final Object value = iterator.next(); + operator.set(i, value); + } + } else { + targetOsList.removeAll(); + for (Object value : list) { + operator.add(value); + } + } } /** From c8bf8c170250e0ffdde71ff1c2a5a6ac50b16f81 Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Sat, 9 Sep 2017 17:11:30 +0300 Subject: [PATCH 4/9] use EnumMap --- .../src/main/java/io/realm/DynamicRealmObject.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java index 8d7cdf974f..1cbc82e976 100644 --- a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java +++ b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java @@ -18,6 +18,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Date; +import java.util.EnumMap; import java.util.HashMap; import java.util.Iterator; import java.util.Locale; @@ -46,7 +47,7 @@ public class DynamicRealmObject extends RealmObject implements RealmObjectProxy private static final Map, RealmFieldType> VALUE_CLASS_TO_LIST_FIELD_TYPE; static { - final HashMap, RealmFieldType> map = new HashMap<>(); + final Map, RealmFieldType> map = new HashMap<>(); map.put(String.class, RealmFieldType.STRING_LIST); map.put(byte[].class, RealmFieldType.BINARY_LIST); map.put(Boolean.class, RealmFieldType.BOOLEAN_LIST); @@ -62,14 +63,11 @@ public class DynamicRealmObject extends RealmObject implements RealmObjectProxy private static final Map> LIST_FIELD_TYPE_TO_VALUE_CLASS; static { - final HashMap> map = new HashMap<>(); + final Map> map = new EnumMap<>(RealmFieldType.class); map.put(RealmFieldType.STRING_LIST, String.class); map.put(RealmFieldType.BINARY_LIST, byte[].class); map.put(RealmFieldType.BOOLEAN_LIST, Boolean.class); map.put(RealmFieldType.INTEGER_LIST, Long.class); - map.put(RealmFieldType.INTEGER_LIST, Integer.class); - map.put(RealmFieldType.INTEGER_LIST, Short.class); - map.put(RealmFieldType.INTEGER_LIST, Byte.class); map.put(RealmFieldType.DOUBLE_LIST, Double.class); map.put(RealmFieldType.FLOAT_LIST, Float.class); map.put(RealmFieldType.DATE_LIST, Date.class); @@ -952,7 +950,7 @@ public void setValueList(String fieldName, RealmList list) { if (list.isManaged() && targetOsList.size() == list.size()) { /* * There is a chance that the source list and the target list are the same list in the same object. - * In this case, we can't use clear. + * In this case, we can't use removeAll(). */ final int size = list.size(); final Iterator iterator = list.iterator(); From 09bd0365db9c4847190375988da7540bdf45e56c Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Sat, 9 Sep 2017 19:04:48 +0300 Subject: [PATCH 5/9] removed unused method --- .../src/main/java/io/realm/DynamicRealmObject.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java index 1cbc82e976..eb9af3e879 100644 --- a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java +++ b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java @@ -879,10 +879,6 @@ public void setList(String fieldName, RealmList list) { } } - private static boolean isClassForRealmModel(Class clazz) { - return RealmModel.class.isAssignableFrom(clazz); - } - private ManagedListOperator getOperator(BaseRealm realm, OsList osList, RealmFieldType valueListType, Class valueClass) { if (valueListType == RealmFieldType.STRING_LIST) { //noinspection unchecked From 8f8149c69383ba8e5807a2c5d5dacb82164690e8 Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Thu, 14 Sep 2017 02:18:34 +0300 Subject: [PATCH 6/9] use Row.getModelList(), Row.getValueList() instead of Row.getList(). --- .../java/io/realm/DynamicRealmObject.java | 14 +++++------ .../java/io/realm/internal/CheckedRow.java | 23 ++++++++++--------- .../java/io/realm/internal/InvalidRow.java | 5 ---- .../java/io/realm/internal/PendingRow.java | 5 ---- .../src/main/java/io/realm/internal/Row.java | 3 --- .../java/io/realm/internal/UncheckedRow.java | 5 ---- 6 files changed, 19 insertions(+), 36 deletions(-) diff --git a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java index eb9af3e879..13b8289ebd 100644 --- a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java +++ b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java @@ -391,7 +391,7 @@ public RealmList getList(String fieldName) { long columnIndex = proxyState.getRow$realm().getColumnIndex(fieldName); try { - OsList osList = proxyState.getRow$realm().getList(columnIndex); + OsList osList = proxyState.getRow$realm().getModelList(columnIndex); final Table targetTable = osList.getTargetTable(); if (targetTable == null) { throw new IllegalArgumentException("The field is value list."); @@ -423,7 +423,7 @@ public RealmList getValueList(String fieldName, Class valueClass) { final OsList osList; long columnIndex = proxyState.getRow$realm().getColumnIndex(fieldName); try { - osList = proxyState.getRow$realm().getList(columnIndex); + osList = proxyState.getRow$realm().getValueList(columnIndex, expectedFieldType); final Table targetTable = osList.getTargetTable(); if (targetTable != null) { throw new IllegalArgumentException("The field is object list."); @@ -822,7 +822,7 @@ public void setList(String fieldName, RealmList list) { final Row row = proxyState.getRow$realm(); long columnIndex = row.getColumnIndex(fieldName); - OsList osList = row.getList(columnIndex); + OsList osList = row.getModelList(columnIndex); Table linkTargetTable = osList.getTargetTable(); if (linkTargetTable == null) { // designated field was value list, not object list. @@ -928,8 +928,9 @@ public void setValueList(String fieldName, RealmList list) { } final Row row = proxyState.getRow$realm(); - long columnIndex = row.getColumnIndex(fieldName); - final OsList targetOsList = row.getList(columnIndex); + final long columnIndex = row.getColumnIndex(fieldName); + final RealmFieldType fieldType = proxyState.getRow$realm().getColumnType(columnIndex); + final OsList targetOsList = row.getValueList(columnIndex, fieldType); final Table linkTargetTable = targetOsList.getTargetTable(); if (linkTargetTable != null) { // designated field was object list, not value list. @@ -938,7 +939,6 @@ public void setValueList(String fieldName, RealmList list) { row.getColumnType(columnIndex).name(), "one of the value list")); } - final RealmFieldType fieldType = getFieldType(fieldName); final Class valueClass = LIST_FIELD_TYPE_TO_VALUE_CLASS.get(fieldType); final ManagedListOperator operator = getOperator(proxyState.getRealm$realm(), targetOsList, fieldType, valueClass); @@ -1126,7 +1126,7 @@ public String toString() { break; case LIST: String targetClassName = proxyState.getRow$realm().getTable().getLinkTarget(columnIndex).getClassName(); - sb.append(String.format(Locale.US, "RealmList<%s>[%s]", targetClassName, proxyState.getRow$realm().getList(columnIndex).size())); + sb.append(String.format(Locale.US, "RealmList<%s>[%s]", targetClassName, proxyState.getRow$realm().getModelList(columnIndex).size())); break; case UNSUPPORTED_TABLE: case UNSUPPORTED_MIXED: diff --git a/realm/realm-library/src/main/java/io/realm/internal/CheckedRow.java b/realm/realm-library/src/main/java/io/realm/internal/CheckedRow.java index f3a3e1f97b..49575b80a0 100644 --- a/realm/realm-library/src/main/java/io/realm/internal/CheckedRow.java +++ b/realm/realm-library/src/main/java/io/realm/internal/CheckedRow.java @@ -16,7 +16,9 @@ package io.realm.internal; +import java.util.EnumSet; import java.util.Locale; +import java.util.Set; import io.realm.RealmFieldType; @@ -97,17 +99,6 @@ public void setNull(long columnIndex) { } } - @Override - public OsList getList(long columnIndex) { - RealmFieldType fieldType = getTable().getColumnType(columnIndex); - if (fieldType != RealmFieldType.LIST) { - throw new IllegalArgumentException( - String.format(Locale.US, "Field '%s' is not a 'RealmList'.", - getTable().getColumnName(columnIndex))); - } - return super.getList(columnIndex); - } - @Override public OsList getModelList(long columnIndex) { RealmFieldType fieldType = getTable().getColumnType(columnIndex); @@ -119,8 +110,18 @@ public OsList getModelList(long columnIndex) { return super.getModelList(columnIndex); } + private static final Set VALUE_LIST_TYPES = EnumSet.of(RealmFieldType.STRING_LIST, + RealmFieldType.BINARY_LIST, RealmFieldType.BOOLEAN_LIST, RealmFieldType.INTEGER_LIST, + RealmFieldType.DOUBLE_LIST, RealmFieldType.FLOAT_LIST, RealmFieldType.DATE_LIST); + @Override public OsList getValueList(long columnIndex, RealmFieldType fieldType) { + if (!VALUE_LIST_TYPES.contains(fieldType)) { + throw new IllegalArgumentException( + String.format(Locale.US, "The type of field '%1$s' (RealmFieldType.%2$s) is not a value list type.", + getTable().getColumnName(columnIndex), fieldType.name())); + } + final RealmFieldType actualFieldType = getTable().getColumnType(columnIndex); if (fieldType != actualFieldType) { throw new IllegalArgumentException( diff --git a/realm/realm-library/src/main/java/io/realm/internal/InvalidRow.java b/realm/realm-library/src/main/java/io/realm/internal/InvalidRow.java index 79510c7e08..42f160d1d9 100644 --- a/realm/realm-library/src/main/java/io/realm/internal/InvalidRow.java +++ b/realm/realm-library/src/main/java/io/realm/internal/InvalidRow.java @@ -104,11 +104,6 @@ public boolean isNullLink(long columnIndex) { throw getStubException(); } - @Override - public OsList getList(long columnIndex) { - throw getStubException(); - } - @Override public OsList getModelList(long columnIndex) { throw getStubException(); diff --git a/realm/realm-library/src/main/java/io/realm/internal/PendingRow.java b/realm/realm-library/src/main/java/io/realm/internal/PendingRow.java index 88ace3a27b..638fc3d5f8 100644 --- a/realm/realm-library/src/main/java/io/realm/internal/PendingRow.java +++ b/realm/realm-library/src/main/java/io/realm/internal/PendingRow.java @@ -133,11 +133,6 @@ public boolean isNullLink(long columnIndex) { throw new IllegalStateException(QUERY_NOT_RETURNED_MESSAGE); } - @Override - public OsList getList(long columnIndex) { - throw new IllegalStateException(QUERY_NOT_RETURNED_MESSAGE); - } - @Override public OsList getModelList(long columnIndex) { throw new IllegalStateException(QUERY_NOT_RETURNED_MESSAGE); diff --git a/realm/realm-library/src/main/java/io/realm/internal/Row.java b/realm/realm-library/src/main/java/io/realm/internal/Row.java index f1a556f057..681d818999 100644 --- a/realm/realm-library/src/main/java/io/realm/internal/Row.java +++ b/realm/realm-library/src/main/java/io/realm/internal/Row.java @@ -81,9 +81,6 @@ public interface Row { boolean isNullLink(long columnIndex); - // FIXME remove this in DynamicRealm PR - OsList getList(long columnIndex); - OsList getModelList(long columnIndex); OsList getValueList(long columnIndex, RealmFieldType fieldType); diff --git a/realm/realm-library/src/main/java/io/realm/internal/UncheckedRow.java b/realm/realm-library/src/main/java/io/realm/internal/UncheckedRow.java index fbd7418aaf..7414edf980 100644 --- a/realm/realm-library/src/main/java/io/realm/internal/UncheckedRow.java +++ b/realm/realm-library/src/main/java/io/realm/internal/UncheckedRow.java @@ -172,11 +172,6 @@ public boolean isNullLink(long columnIndex) { return nativeIsNullLink(nativePtr, columnIndex); } - @Override - public OsList getList(long columnIndex) { - return new OsList(this, columnIndex); - } - @Override public OsList getModelList(long columnIndex) { return new OsList(this, columnIndex); From 6efb2a9a085519fa61ee9adc4147f7f680c33830 Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Thu, 14 Sep 2017 02:19:20 +0300 Subject: [PATCH 7/9] implement logic for primitive list in DynamicRealmObject.toString(). --- .../main/java/io/realm/DynamicRealmObject.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java index 13b8289ebd..8553ff0f24 100644 --- a/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java +++ b/realm/realm-library/src/main/java/io/realm/DynamicRealmObject.java @@ -1128,8 +1128,23 @@ public String toString() { String targetClassName = proxyState.getRow$realm().getTable().getLinkTarget(columnIndex).getClassName(); sb.append(String.format(Locale.US, "RealmList<%s>[%s]", targetClassName, proxyState.getRow$realm().getModelList(columnIndex).size())); break; + case BOOLEAN_LIST: // fall-through + case STRING_LIST: // fall-through + case BINARY_LIST: // fall-through + case INTEGER_LIST: // fall-through + case DOUBLE_LIST: // fall-through + case FLOAT_LIST: // fall-through + case DATE_LIST: + final String valueClassName = LIST_FIELD_TYPE_TO_VALUE_CLASS.get(type).getSimpleName(); + final OsList modelList = proxyState.getRow$realm().getValueList(columnIndex, type); + sb.append(String.format(Locale.US, "RealmList<%s>[%s]", valueClassName, modelList.size())); + break; + case LINKING_OBJECTS: + // nothing to print + break; case UNSUPPORTED_TABLE: case UNSUPPORTED_MIXED: + case UNSUPPORTED_DATE: default: sb.append("?"); break; From 680af0ba3f96c06c10997ab5f17e0138c8066dd5 Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Tue, 19 Sep 2017 16:51:54 +0900 Subject: [PATCH 8/9] review comment --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 530e8eefd0..af7ba86733 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,6 @@ * `RealmResults.distinct()`/`RealmResults.distinctAsync()` have been removed. Use `RealmQuery.distinct()`/`RealmQuery.distinctAsync()` instead. * `RealmQuery.createQuery(Realm, Class)`, `RealmQuery.createDynamicQuery(DynamicRealm, String)`, `RealmQuery.createQueryFromResult(RealmResults)` and `RealmQuery.createQueryFromList(RealmList)` have been removed. Use `Realm.where(Class)`, `DynamicRealm.where(String)`, RealmResults.where()` and `RealmList.where()` instead. -* Some exception messages are revised. ### Enhancements From 990f11c682d428cba96aef43636a6b17b91a5713 Mon Sep 17 00:00:00 2001 From: Makoto Yamazaki Date: Tue, 19 Sep 2017 19:26:42 +0900 Subject: [PATCH 9/9] Revert "review comment" This reverts commit 680af0ba3f96c06c10997ab5f17e0138c8066dd5. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index af7ba86733..530e8eefd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ * `RealmResults.distinct()`/`RealmResults.distinctAsync()` have been removed. Use `RealmQuery.distinct()`/`RealmQuery.distinctAsync()` instead. * `RealmQuery.createQuery(Realm, Class)`, `RealmQuery.createDynamicQuery(DynamicRealm, String)`, `RealmQuery.createQueryFromResult(RealmResults)` and `RealmQuery.createQueryFromList(RealmList)` have been removed. Use `Realm.where(Class)`, `DynamicRealm.where(String)`, RealmResults.where()` and `RealmList.where()` instead. +* Some exception messages are revised. ### Enhancements