in core/src/main/java/com/jetbrains/youtrackdb/internal/core/serialization/serializer/record/string/RecordSerializerStringAbstract.java [333:455]
public static Object getTypeValue(DatabaseSessionEmbedded db, final String iValue) {
if (iValue == null || iValue.equalsIgnoreCase("NULL")) {
return null;
}
if (iValue.length() == 0) {
return "";
}
if (iValue.length() > 1) {
if (iValue.charAt(0) == '"' && iValue.charAt(iValue.length() - 1) == '"')
// STRING
{
return StringSerializerHelper.decode(iValue.substring(1, iValue.length() - 1));
} else if (iValue.charAt(0) == StringSerializerHelper.BINARY_BEGINEND
&& iValue.charAt(iValue.length() - 1) == StringSerializerHelper.BINARY_BEGINEND)
// STRING
{
return StringSerializerHelper.getBinaryContent(iValue);
} else if (iValue.charAt(0) == StringSerializerHelper.LIST_BEGIN
&& iValue.charAt(iValue.length() - 1) == StringSerializerHelper.LIST_END) {
// LIST
final var coll = new ArrayList<String>();
StringSerializerHelper.getCollection(
iValue,
0,
coll,
StringSerializerHelper.LIST_BEGIN,
StringSerializerHelper.LIST_END,
StringSerializerHelper.COLLECTION_SEPARATOR);
return coll;
} else if (iValue.charAt(0) == StringSerializerHelper.SET_BEGIN
&& iValue.charAt(iValue.length() - 1) == StringSerializerHelper.SET_END) {
// SET
final Set<String> coll = new HashSet<String>();
StringSerializerHelper.getCollection(
iValue,
0,
coll,
StringSerializerHelper.SET_BEGIN,
StringSerializerHelper.SET_END,
StringSerializerHelper.COLLECTION_SEPARATOR);
return coll;
} else if (iValue.charAt(0) == StringSerializerHelper.MAP_BEGIN
&& iValue.charAt(iValue.length() - 1) == StringSerializerHelper.MAP_END) {
// MAP
return StringSerializerHelper.getMap(db, iValue);
}
}
if (iValue.charAt(0) == RID.PREFIX)
// RID
{
return RecordIdInternal.fromString(iValue, false);
}
var integer = true;
char c;
var stringStarBySign = false;
for (var index = 0; index < iValue.length(); ++index) {
c = iValue.charAt(index);
if (c < '0' || c > '9') {
if ((index == 0 && (c == '+' || c == '-'))) {
stringStarBySign = true;
continue;
} else if (c == DECIMAL_SEPARATOR) {
integer = false;
} else {
if (index > 0) {
if (!integer && c == 'E') {
// CHECK FOR SCIENTIFIC NOTATION
if (index < iValue.length()) {
index++;
}
if (iValue.charAt(index) == '-') {
continue;
}
}
final var v = iValue.substring(0, index);
if (c == 'f') {
return Float.valueOf(v);
} else if (c == 'c') {
return new BigDecimal(v);
} else if (c == 'l') {
return Long.valueOf(v);
} else if (c == 'd') {
return Double.valueOf(v);
} else if (c == 'b') {
return Byte.valueOf(v);
} else if (c == 'a' || c == 't') {
return new Date(Long.parseLong(v));
} else if (c == 's') {
return Short.valueOf(v);
}
}
return iValue;
}
} else if (stringStarBySign) {
stringStarBySign = false;
}
}
if (stringStarBySign) {
return iValue;
}
if (integer) {
try {
return Integer.valueOf(iValue);
} catch (NumberFormatException ignore) {
return Long.valueOf(iValue);
}
} else if ("NaN".equals(iValue) || "Infinity".equals(iValue))
// NaN and Infinity CANNOT BE MANAGED BY BIG-DECIMAL TYPE
{
return Double.valueOf(iValue);
} else {
return new BigDecimal(iValue);
}
}