public Map readNextRecord()

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;
  }