docs: @Override
      public void loadFromJSONObject( JSONObject jobj, Database db ) throws JSONException {
          super.loadFromJSONObject(jobj, db);
          m_lookupType = IndexLookupType.get( jobj.getString( Members.LOOKUP_TYPE.name() ) );
          m_sortDirection = SortDirectionType.get( jobj.getString( Members.SORT_DIRECTION.name() ) );
          if (jobj.has(Members.HAS_OFFSET_RANK.name())) {
              m_hasOffsetRankOptimization = jobj.getBoolean(Members.HAS_OFFSET_RANK.name());
          }
          m_purpose = jobj.has(Members.PURPOSE.name()) ?
                  jobj.getInt(Members.PURPOSE.name()) : FOR_SCANNING_PERFORMANCE_OR_ORDERING;
          m_targetIndexName = jobj.getString(Members.TARGET_INDEX_NAME.name());
          m_catalogIndex = db.getTables().get(super.m_targetTableName).getIndexes().get(m_targetIndexName);
          // load end_expression
          m_endExpression = AbstractExpression.fromJSONChild(jobj, Members.END_EXPRESSION.name(), m_tableScan);
          // load initial_expression
          m_initialExpression = AbstractExpression.fromJSONChild(jobj, Members.INITIAL_EXPRESSION.name(), m_tableScan);
          // load searchkey_expressions
          AbstractExpression.loadFromJSONArrayChild(m_searchkeyExpressions, jobj,
                  Members.SEARCHKEY_EXPRESSIONS.name(), m_tableScan);
          // load COMPARE_NOTDISTINCT flag vector
          loadBooleanArrayFromJSONObject(jobj, Members.COMPARE_NOTDISTINCT.name(), m_compareNotDistinct);
          // load skip_null_predicate
          m_skip_null_predicate = AbstractExpression.fromJSONChild(jobj, Members.SKIP_NULL_PREDICATE.name(), m_tableScan);
      }