in core/src/main/java/com/jetbrains/youtrackdb/internal/core/serialization/serializer/JSONReader.java [299:455]
public Map<String, RidSet> readNextRecord(
final char[] iUntil,
final boolean iInclude,
final char[] iJumpChars,
final char[] iSkipChars,
boolean preserveQuotes,
int maxRidbagSizeLazyImport)
throws IOException, ParseException {
if (!in.ready()) {
return Collections.emptyMap();
}
jump(iJumpChars);
if (!in.ready()) {
return Collections.emptyMap();
}
Map<String, RidSet> result = new HashMap<>();
var ridPattern = Pattern.compile("\"#([0-9]+):([0-9]+)\"");
RidSet ridbagSet = null;
StringBuilder lastString = null;
String lastFieldName = null;
StringBuilder lastCollection = null;
// READ WHILE THERE IS SOMETHING OF AVAILABLE
var openBrackets = 0;
var openSquare = 0;
var beginStringChar = ' ';
var encodeMode = false;
boolean found;
do {
found = false;
if (beginStringChar == ' ') {
// NO INSIDE A STRING
if (openBrackets == 0) {
// FIND FOR SEPARATOR
for (var u : iUntil) {
if (u == c) {
found = true;
break;
}
}
}
if (c == '\'' || c == '"' && !encodeMode) {
// BEGIN OF STRING
beginStringChar = c;
lastString = new StringBuilder();
} else if (c == '{')
// OPEN EMBEDDED
{
openBrackets++;
} else if (c == '}' && openBrackets > 0)
// CLOSE EMBEDDED
{
openBrackets--;
} else if (c == '[') {
if (openSquare == 0
&& (lastString.toString().startsWith("out_")
|| lastString.toString().startsWith("in_"))) {
lastCollection = new StringBuilder();
lastFieldName = lastString.toString();
lastFieldName = lastFieldName.substring(0, lastFieldName.length() - 1);
ridbagSet = new RidSet();
}
openSquare++;
} else if (c == ']' && openSquare == 1) {
if (lastFieldName != null && ridbagSet != null && ridbagSet.size() > 0) {
var ridbagAdderd = stringToRidbag(lastCollection, ridbagSet, ridPattern);
result.put(lastFieldName, ridbagSet);
lastFieldName = null;
ridbagSet = null;
if (ridbagAdderd) {
buffer.append("]");
}
}
openSquare--;
}
if (!found && openBrackets == 0) {
// FIND FOR SEPARATOR
for (var u : iUntil) {
if (u == c) {
found = true;
break;
}
}
}
} else if (beginStringChar == c && !encodeMode)
// END OF STRING
{
beginStringChar = ' ';
}
encodeMode = c == '\\' && !encodeMode;
if (!found) {
final var read = nextChar();
if (read == -1) {
break;
}
// APPEND IT
c = (char) read;
var skip = false;
if (iSkipChars != null) {
for (var j : iSkipChars) {
if (j == c) {
skip = true;
break;
}
}
}
if (!skip && (preserveQuotes || !encodeMode)) {
lastCharacter = c;
if (openSquare == 0 && lastCollection != null && lastFieldName != null) {
buffer.append(lastCollection);
buffer.append(c);
lastCollection = null;
} else if (openSquare > 0 && lastCollection != null) {
lastCollection.append(c);
if (lastCollection.length() > maxRidbagSizeLazyImport
&& lastFieldName != null
&& lastCollection != null) {
// preprocess RIDs
if (!stringToRidbag(lastCollection, ridbagSet, ridPattern)) {
lastFieldName = null;
// openBrackets = 0;
}
}
} else {
buffer.append(c);
}
if (beginStringChar != ' ') {
lastString.append(c);
}
}
}
} while (!found && in.ready());
if (buffer.length() == 0) {
throw new ParseException(
"Expected characters '" + Arrays.toString(iUntil) + "' not found", cursor);
}
if (!iInclude) {
buffer.setLength(buffer.length() - 1);
}
value = buffer.toString();
return result;
}