code: private static Map<String, Map<Table, List<String>>> mergeJoinTableMetadata(Map<String, Map<Table, List<String>>> data,
                                                                                  Map<String, Map<Table, List<String>>> extension) {
          for (String key : extension.keySet()) {
              Map<Table, List<String>> dataForTable = data.get(key);
              if (dataForTable == null) {
                  data.put(key, extension.get(key));
                  continue;
              }
              for (Table t : extension.get(key).keySet()) {
                  dataForTable.put(t, extension.get(key).get(t));
              }
              data.put(key, dataForTable);
          }
          return data;
      }
docs: Performs a deep-merge on the two provided maps, integrating everything from the second map into the first and returning the first map.
  @param data The first map. Will be modified
  @param extension The second map, which will be integrated into the first one. Will not be modified
  @return The resulting map, a reference to the same object that was passed as the first parameter