private static byte getAccessType()

in fe/src/compat-apache-hive-3/java/org/apache/impala/compat/MetastoreShim.java [706:975]


  private static byte getAccessType(Table msTbl) {
    Preconditions.checkNotNull(msTbl);
    byte accessType = ACCESSTYPE_NONE;
    Map<String, String> params = msTbl.getParameters();
    if (params.containsKey(ACCESSTYPE)) {
      String accessTypeStr = msTbl.getParameters().get(ACCESSTYPE);
      accessType = accessTypeStr.getBytes()[0];
    } else { // Table not created by Impala
      if (!capabilitiestSet_) setHiveClientCapabilities();
      // The following logic comes from hive's MetastoreDefaultTransformer.transform()
      String tableType = msTbl.getTableType();
      String tCapabilities = params.get(CatalogOpExecutor.CAPABILITIES_KEY);
      int numBuckets = msTbl.isSetSd() ? msTbl.getSd().getNumBuckets() : 0;
      boolean isBucketed = numBuckets > 0;

      LOG.info("Table " + msTbl.getTableName() + ",#bucket=" + numBuckets + ",isBucketed:"
          + isBucketed + ",tableType=" + tableType + ",tableCapabilities="
          + tCapabilities);

      // if the table has no tCapabilities
      if (tCapabilities == null) {
        LOG.debug("Table has no specific required capabilities");

        switch (tableType) {
          case "EXTERNAL_TABLE":
            if (numBuckets > 0) {
              if (processorCapabilities.contains(HIVEBUCKET2)) {
                LOG.debug("External bucketed table with HB2 capability:RW");
                accessType = ACCESSTYPE_READWRITE;
              } else {
                LOG.debug("External bucketed table without HB2 capability:RO");
                accessType = ACCESSTYPE_READONLY;
              }
            } else { // Unbucketed
              if (processorCapabilities.contains(EXTWRITE) && processorCapabilities
                  .contains(EXTREAD)) {
                LOG.debug("External unbucketed table with EXTREAD/WRITE capability:RW");
                accessType = ACCESSTYPE_READWRITE;
              } else if (processorCapabilities.contains(EXTREAD)) {
                LOG.debug("External unbucketed table with EXTREAD capability:RO");
                accessType = ACCESSTYPE_READONLY;
              } else {
                LOG.debug(
                    "External unbucketed table without EXTREAD/WRITE capability:NONE");
                accessType = ACCESSTYPE_NONE;
              }
            }
            break;
          case "MANAGED_TABLE":
            String txnal = params.get(AcidUtils.TABLE_IS_TRANSACTIONAL);
            if (txnal == null || txnal
                .equalsIgnoreCase("FALSE")) { // non-ACID MANAGED table
              LOG.debug("Managed non-acid table:RW");
              accessType = ACCESSTYPE_READWRITE;
            }

            if (txnal != null && txnal.equalsIgnoreCase("TRUE")) { // ACID table
              String txntype = params.get(AcidUtils.TABLE_TRANSACTIONAL_PROPERTIES);
              if (txntype != null && txntype
                  .equalsIgnoreCase("insert_only")) { // MICRO_MANAGED Tables
                // MGD table is insert only, not full ACID
                if (processorCapabilities.contains(HIVEMANAGEDINSERTWRITE)
                    || processorCapabilities.contains(CONNECTORWRITE)) {
                  LOG.debug("Managed acid table with INSERTWRITE or CONNECTORWRITE "
                          + "capability:RW");
                  // clients have RW access to INSERT-ONLY ACID tables
                  accessType = ACCESSTYPE_READWRITE;
                  LOG.info("Processor has one of the write capabilities on insert-only, "
                          + "granting RW");
                } else if (processorCapabilities.contains(HIVEMANAGEDINSERTREAD)
                    || processorCapabilities.contains(CONNECTORREAD)) {
                  LOG.debug("Managed acid table with INSERTREAD or CONNECTORREAD "
                      + "capability:RO");
                  // clients have RO access to INSERT-ONLY ACID tables
                  accessType = ACCESSTYPE_READONLY;
                  LOG.info("Processor has one of the read capabilities on insert-only, "
                      + "granting RO");
                } else {
                  // clients have NO access to INSERT-ONLY ACID tables
                  accessType = ACCESSTYPE_NONE;
                  LOG.info("Processor has no read or write capabilities on insert-only, "
                          + "NO access");
                }
              } else { // FULL ACID MANAGED TABLE
                if (processorCapabilities.contains(HIVEFULLACIDWRITE)
                    || processorCapabilities.contains(CONNECTORWRITE)) {
                  LOG.debug(
                      "Full acid table with ACIDWRITE or CONNECTORWRITE capability:RW");
                  // clients have RW access to IUD ACID tables
                  accessType = ACCESSTYPE_READWRITE;
                } else if (processorCapabilities.contains(HIVEFULLACIDREAD)
                    || processorCapabilities.contains(CONNECTORREAD)) {
                  LOG.debug(
                      "Full acid table with ACIDREAD or CONNECTORREAD capability:RO");
                  // clients have RO access to IUD ACID tables
                  accessType = ACCESSTYPE_READONLY;
                } else {
                  LOG.debug("Full acid table without ACIDREAD/WRITE or "
                      + "CONNECTORREAD/WRITE capability:NONE");
                  // clients have NO access to IUD ACID tables
                  accessType = ACCESSTYPE_NONE;
                }
              }
            }
            break;
          case "VIRTUAL_VIEW":
            if (processorCapabilities.contains(HIVESQL) ||
                processorCapabilities.contains(CONNECTORREAD)) {
              accessType = ACCESSTYPE_READONLY;
            } else {
              accessType = ACCESSTYPE_NONE;
            }
            break;
          case "MATERIALIZED_VIEW":
            if ((processorCapabilities.contains(CONNECTORREAD) ||
                processorCapabilities.contains(HIVEFULLACIDREAD)) && processorCapabilities
                .contains(HIVEMQT)) {
              LOG.info(
                  "Processor has one of the READ abilities and HIVEMQT, AccessType=RO");
              accessType = ACCESSTYPE_READONLY;
            } else {
              LOG.info("Processor has no READ abilities or HIVEMQT, AccessType=None");
              accessType = ACCESSTYPE_NONE;
            }
            break;
          default:
            accessType = ACCESSTYPE_NONE;
            break;
        }
        return accessType;
      }

      // WITH CAPABLITIES ON TABLE
      tCapabilities = tCapabilities.replaceAll("\\s", "")
          .toUpperCase(); // remove spaces between tCapabilities + toUppercase
      List<String> requiredCapabilities = Arrays.asList(tCapabilities.split(","));
      switch (tableType) {
        case "EXTERNAL_TABLE":
          if (processorCapabilities.containsAll(requiredCapabilities)) {
            // AccessType is RW
            LOG.info(
                "Abilities for match: Table type=" + tableType + ",accesstype is RW");
            accessType = ACCESSTYPE_READWRITE;
            break;
          }

          if (requiredCapabilities.contains(EXTWRITE) && processorCapabilities
              .contains(EXTWRITE)) {
            if (!isBucketed) {
              LOG.info("EXTWRITE Matches, accessType=" + ACCESSTYPE_READWRITE);
              accessType = ACCESSTYPE_READWRITE;
              return accessType;
            }
          }

          if (requiredCapabilities.contains(EXTREAD) && processorCapabilities
              .contains(EXTREAD)) {
            LOG.info("EXTREAD Matches, accessType=" + ACCESSTYPE_READONLY);
            accessType = ACCESSTYPE_READONLY;
          } else {
            LOG.debug("No matches, accessType=" + ACCESSTYPE_NONE);
            accessType = ACCESSTYPE_NONE;
          }
          break;
        case "MANAGED_TABLE":
          if (processorCapabilities.size() == 0) { // processor has no capabilities
            LOG.info("Client has no capabilities for type " + tableType
                + ",accesstype is NONE");
            accessType = ACCESSTYPE_NONE;
            return accessType;
          }

          if (processorCapabilities.containsAll(requiredCapabilities)) {
            // AccessType is RW
            LOG.info(
                "Abilities for match: Table type=" + tableType + ",accesstype is RW");
            accessType = ACCESSTYPE_READWRITE;
            return accessType;
          }

          String txnal = params.get(AcidUtils.TABLE_IS_TRANSACTIONAL);
          if (txnal == null || txnal
              .equalsIgnoreCase("FALSE")) { // non-ACID MANAGED table
            LOG.info("Table is non ACID, accesstype is RO");
            accessType = ACCESSTYPE_READONLY;
            return accessType;
          }

          if (txnal != null && txnal.equalsIgnoreCase("TRUE")) { // ACID table
            String txntype = params.get(AcidUtils.TABLE_TRANSACTIONAL_PROPERTIES);
            List<String> hintList = new ArrayList<>();
            if (txntype != null && txntype
                .equalsIgnoreCase("insert_only")) { // MICRO_MANAGED Tables
              LOG.info("Table is INSERTONLY ACID");
              // MGD table is insert only, not full ACID
              if (processorCapabilities.containsAll(getWrites(requiredCapabilities))
                  // contains all writes on table
                  || processorCapabilities.contains(HIVEFULLACIDWRITE)) {
                LOG.info("Processor has all writes or full acid write, access is RW");
                // clients have RW access to INSERT-ONLY ACID tables
                accessType = ACCESSTYPE_READWRITE;
                return accessType;
              }

              if (processorCapabilities.contains(CONNECTORWRITE)) {
                LOG.debug("Managed acid table with CONNECTORWRITE capability:RW");
                // clients have RW access to INSERT-ONLY ACID tables with CONNWRITE
                accessType = ACCESSTYPE_READWRITE;
                return accessType;
              } else if (processorCapabilities.containsAll(getReads(requiredCapabilities))
                  || processorCapabilities.contains(HIVEMANAGEDINSERTREAD)) {
                LOG.debug("Managed acid table with MANAGEDREAD capability:RO");
                accessType = ACCESSTYPE_READONLY;
                return accessType;
              } else if (processorCapabilities.contains(CONNECTORREAD)) {
                LOG.debug("Managed acid table with CONNECTORREAD capability:RO");
                accessType = ACCESSTYPE_READONLY;
                return accessType;
              } else {
                LOG.debug("Managed acid table without any READ capability:NONE");
                accessType = ACCESSTYPE_NONE;
                return accessType;
              }
            } else { // MANAGED FULL ACID TABLES
              LOG.info("Table is FULLACID");
              if (processorCapabilities.containsAll(getWrites(requiredCapabilities))
                  // contains all writes on table
                  || processorCapabilities.contains(HIVEFULLACIDWRITE)) {
                LOG.info("Processor has all writes or atleast " + HIVEFULLACIDWRITE
                    + ", access is RW");
                // clients have RW access to ACID tables
                accessType = ACCESSTYPE_READWRITE;
                return accessType;
              }

              if (processorCapabilities.contains(CONNECTORWRITE)) {
                LOG.debug("Full acid table with CONNECTORWRITE capability:RW");
                // clients have RW access to IUD ACID tables
                accessType = ACCESSTYPE_READWRITE;
                return accessType;
              } else if (processorCapabilities.contains(HIVEFULLACIDREAD)
                  || (processorCapabilities.contains(CONNECTORREAD))) {
                LOG.debug("Full acid table with CONNECTORREAD/ACIDREAD capability:RO");
                // clients have RO access to IUD ACID tables
                accessType = ACCESSTYPE_READONLY;
                return accessType;
              } else {
                LOG.debug("Full acid table without READ capability:RO");
                // clients have NO access to IUD ACID tables
                accessType = ACCESSTYPE_NONE;
                return accessType;
              }
            }
          }
          break;
        case "VIRTUAL_VIEW":
        case "MATERIALIZED_VIEW":
          if (processorCapabilities.containsAll(requiredCapabilities)) {
            accessType = ACCESSTYPE_READONLY;
          } else {
            accessType = ACCESSTYPE_NONE;
          }
          break;
        default:
          accessType = ACCESSTYPE_NONE;
          break;
      }
    }
    return accessType;
  }