code: @VisibleForTesting
    protected static DbAndTable parseLogicalDbAndTable(String datasetNamePattern, DbAndTable dbAndTable,
        String logicalDbToken, String logicalTableToken) {
      Preconditions.checkArgument(StringUtils.isNotBlank(datasetNamePattern), "Dataset name pattern must not be empty.");
  
      List<String> datasetNameSplit = Lists.newArrayList(SPLIT_ON_DOT.split(datasetNamePattern));
      Preconditions.checkArgument(datasetNameSplit.size() == 2, "Dataset name pattern must of the format: "
          + "dbPrefix_$LOGICAL_DB_dbPostfix.tablePrefix_$LOGICAL_TABLE_tablePostfix (prefix / postfix are optional)");
  
      String dbNamePattern = datasetNameSplit.get(0);
      String tableNamePattern = datasetNameSplit.get(1);
  
      String logicalDb = extractTokenValueFromEntity(dbAndTable.getDb(), dbNamePattern, logicalDbToken);
      String logicalTable = extractTokenValueFromEntity(dbAndTable.getTable(), tableNamePattern, logicalTableToken);
  
      return new DbAndTable(logicalDb, logicalTable);
    }
docs: *
  Parse logical Database and Table name from a given DbAndTable object.
  
  Eg.
  Dataset Name Pattern         : prod_$LOGICAL_DB_linkedin.prod_$LOGICAL_TABLE_linkedin
  Source DB and Table          : prod_dbName_linkedin.prod_tableName_linkedin
  Logical DB Token             : $LOGICAL_DB
  Logical Table Token          : $LOGICAL_TABLE
  Parsed Logical DB and Table  : dbName.tableName
  
  @param datasetNamePattern    Dataset name pattern.
  @param dbAndTable            Source DB and Table.
  @param logicalDbToken        Logical DB token.
  @param logicalTableToken     Logical Table token.
  @return  Parsed logical DB and Table.