docs: public void loadFromJSONPlan(JSONObject jobj, Database db)  throws JSONException {
          if (jobj.has(Members.PLAN_NODES_LISTS)) {
              JSONArray jplanNodesArray = jobj.getJSONArray(Members.PLAN_NODES_LISTS);
              for (int i = 0; i < jplanNodesArray.length(); ++i) {
                  JSONObject jplanNodesObj = jplanNodesArray.getJSONObject(i);
                  JSONArray jplanNodes = jplanNodesObj.getJSONArray(Members.PLAN_NODES);
                  int stmtId = jplanNodesObj.getInt(Members.STATEMENT_ID);
                  loadPlanNodesFromJSONArrays(stmtId, jplanNodes, db);
              }
          }
          else {
              // There is only one statement in the plan. Its id is set to 0 by default
              int stmtId = 0;
              JSONArray jplanNodes = jobj.getJSONArray(Members.PLAN_NODES);
              loadPlanNodesFromJSONArrays(stmtId, jplanNodes, db);
          }
  
          // Connect the parent and child statements
          for (List<AbstractPlanNode> nextPlanNodes : m_planNodesListMap.values()) {
              for (AbstractPlanNode node : nextPlanNodes) {
                  connectNodesIfNecessary(node);
              }
          }
      }