docs: private void loadPlanNodesFromJSONArrays(int stmtId, JSONArray jArray, Database db) {
          List<AbstractPlanNode> planNodes = new ArrayList<>();
          int size = jArray.length();
  
          try {
              for (int i = 0; i < size; i++) {
                  JSONObject jobj = jArray.getJSONObject(i);
                  String nodeTypeStr = jobj.getString("PLAN_NODE_TYPE");
                  PlanNodeType nodeType = PlanNodeType.get(nodeTypeStr);
                  AbstractPlanNode apn = nodeType.getPlanNodeClass().newInstance();
                  apn.loadFromJSONObject(jobj, db);
                  planNodes.add(apn);
              }
  
              //link children and parents
              for (int i = 0; i < size; i++) {
                  JSONObject jobj = jArray.getJSONObject(i);
                  if (jobj.has("CHILDREN_IDS")) {
                      AbstractPlanNode parent = planNodes.get(i);
                      JSONArray children = jobj.getJSONArray("CHILDREN_IDS");
                      for (int j = 0; j < children.length(); j++) {
                          AbstractPlanNode child = getNodeofId(children.getInt(j), planNodes);
                          parent.addAndLinkChild(child);
                      }
                  }
              }
              m_planNodesListMap.put(stmtId,  planNodes);
          }
          catch (JSONException | InstantiationException | IllegalAccessException e) {
              System.err.println(e);
              e.printStackTrace();
          }
      }