예제 #1
0
  /**
   * @param metadata The metadata query.
   * @return The id of the matching column.
   * @throws RemoteException Thrown if the metadata query does not match exactly one column.
   */
  @Deprecated
  public AttributeColumnData getColumnFromMetadata(Map<String, String> metadata)
      throws RemoteException {
    if (metadata == null || metadata.size() == 0)
      throw new RemoteException("No metadata query parameters specified.");

    metadata.put(PublicMetadata.ENTITYTYPE, EntityType.COLUMN);

    final String DATATABLE = "dataTable";
    final String NAME = "name";

    // exclude these parameters from the query
    if (metadata.containsKey(NAME)) metadata.remove(PublicMetadata.TITLE);
    String minStr = metadata.remove(PublicMetadata.MIN);
    String maxStr = metadata.remove(PublicMetadata.MAX);
    String paramsStr = metadata.remove(PrivateMetadata.SQLPARAMS);

    DataConfig dataConfig = getDataConfig();

    Collection<Integer> ids = dataConfig.searchPublicMetadata(metadata, null);

    // attempt recovery for backwards compatibility
    if (ids.size() == 0) {
      if (metadata.containsKey(DATATABLE) && metadata.containsKey(NAME)) {
        // try to find columns sqlTable==dataTable and sqlColumn=name
        Map<String, String> privateMetadata = new HashMap<String, String>();
        String sqlTable = metadata.get(DATATABLE);
        String sqlColumn = metadata.get(NAME);
        for (int i = 0; i < 2; i++) {
          if (i == 1) sqlTable = sqlTable.toLowerCase();
          privateMetadata.put(PrivateMetadata.SQLTABLE, sqlTable);
          privateMetadata.put(PrivateMetadata.SQLCOLUMN, sqlColumn);
          ids = dataConfig.searchPrivateMetadata(privateMetadata, null);
          if (ids.size() > 0) break;
        }
      } else if (metadata.containsKey(NAME)
          && Strings.equal(metadata.get(PublicMetadata.DATATYPE), DataType.GEOMETRY)) {
        metadata.put(PublicMetadata.TITLE, metadata.remove(NAME));
        ids = dataConfig.searchPublicMetadata(metadata, null);
      }
      if (ids.size() == 0)
        throw new RemoteException("No column matches metadata query: " + metadata);
    }

    // warning if more than one column
    if (ids.size() > 1) {
      String message =
          String.format(
              "WARNING: Multiple columns (%s) match metadata query: %s", ids.size(), metadata);
      System.err.println(message);
      // throw new RemoteException(message);
    }

    // return first column
    int id = ListUtils.getFirstSortedItem(ids, DataConfig.NULL);
    double min = Double.NaN, max = Double.NaN;
    try {
      min = (Double) cast(minStr, double.class);
    } catch (Throwable t) {
    }
    try {
      max = (Double) cast(maxStr, double.class);
    } catch (Throwable t) {
    }
    String[] sqlParams = CSVParser.defaultParser.parseCSVRow(paramsStr, true);
    return getColumn(id, min, max, sqlParams);
  }