2016-04-08 2 views
2

Рассмотрим типичный Заказчикам стол:Как представить таблицу SQL и SELECT Query в Guava?

Customers table

и типичный SQL шаблон, соответствующий запрос:

SELECT FirstName, LastName, City 

FROM Customers 

WHERE FirstName LIKE '%ab%' 

OR LastName LIKE '%an%' 

Как мы можем представить эту таблицу и SQL SELECT запрос с помощью Google Guava Library Таблица коллекция и Предикаты?

РЕДАКТИРОВАТЬ

Как отмечали mfulton26, гуавы Таблица, вероятно, не самая идеальная структура данных эквивалентна таблице базы данных.

Так, который является наиболее подходящей структурой данных для в таблице данных памяти способны обеспечить:

1) Итерация (возможно, с итераторы)

2) Фильтр (возможно с предикатами)

3) Несколько столбцов данных с индексированием для быстрого доступа.

+0

Наконец-то я реализовал основную структуру TABLE в соответствии с ответом Евгения (http://stackoverflow.com/a/36494261/4419474) и FluentIterable в соответствии с ответом mfulton26 (http://stackoverflow.com/a/36500647/4419474) – Chebyr

ответ

3

Обратите внимание, что SQL-таблице не принято сопоставляется с таблицей Guava. Таблица Guava предназначена для тех случаев, когда вам нужны два индекса (см. NewCollectionTypesExplained · google/guava Wiki). Набор результатов таблицы SQL обычно представлен как простой Collection или Iterable.

С учетом сказанного, вот как вы можете "запрос" гуавы таблица:

Java 8

table.rowMap().values().stream().filter(row -> { 
    return row.get("FirstName").contains("ab") || row.get("LastName").contains("an"); 
}); 

Java 7/6

FluentIterable.from(table.rowMap().values()).filter(new Predicate<Map<String, String>>() { 
    @Override 
    public boolean apply(Map<String, String> row) { 
     return row.get("FirstName").contains("ab") || row.get("LastName").contains("an"); 
    } 
}); 

Также обратите внимание, что таблица Guava не похожа на таблицу базы данных, где вы n добавить дополнительные индексы и т. д. вы получите только два индекса: строку и столбец.

3

Таблица

public class CustomerTable { 

    public enum Column { 
     FIRST_NAME, LAST_NAME, ADDRESS_LINE1, CITY, STATE_PROVINCE_CD, POSTAL_CODE; 
    } 

    private Table<Integer, Column, String> table = HashBasedTable.create(); 

    @Override 
    public String toString() { 
     return table.toString(); 
    } 

    public void createRow(String[] values) { 
     if (Column.values().length != values.length) { 
      throw new IllegalArgumentException(); 
     } 
     Integer rowNum = table.rowKeySet().size() + 1; 
     for(int i=0; i < values.length; i ++) { 
      table.put(rowNum, Column.values()[i], values[i]); 
     } 
    } 

    public Table<Integer, Column, String> query(Predicate<Map<Column, String>> query) { 
     return query(query, allOf(Column.class)); 
    } 

    public Table<Integer, Column, String> query(Predicate<Map<Column, String>> query, EnumSet<Column> columns) { 
     Map<Integer, Map<Column, String>> filtered = Maps.filterValues(table.rowMap(), query); 
     return createResultTable(filtered, columns); 
    } 

    private Table<Integer, Column, String> createResultTable(Map<Integer, Map<Column, String>> resultMap, final EnumSet<Column> columns) { 

     int i = 0; 
     Table<Integer, Column, String> result = HashBasedTable.create(); 
     for (Map<Column, String> row : resultMap.values()) { 
      i++; 
      for (Column column : row.keySet()){ 
       if (columns.contains(column)) { 
        result.put(i, column, row.get(column)); 
       } 
      } 
     } 
     return result; 
    } 

предиката

class LikePredicate implements Predicate<Map<CustomerTable.Column, String>> { 

    private Column column; 
    private String value; 

    public LikePredicate(Column column, String value) { 
     this.column = column; 
     this.value = value; 
    } 

    @Override 
    public boolean apply(Map<Column, String> input) { 
     return input.get(column) != null && input.get(column).contains(value); 
    } 

    public static LikePredicate like(Column column, String value) { 
     return new LikePredicate(column, value); 
    } 
} 

Пример использования

public static void main(String[] args) { 

    CustomerTable customerTable = new CustomerTable(); 
    customerTable.createRow(new String[]{"Ben", "Miller", "101 Candy Rd.", "Redmond", "WA", "98052"}); 
    customerTable.createRow(new String[]{"Garret", "Vargas", "10203 Acorn Avenue", "Calgary", "AB", "T2P 2G8"}); 
    //Create other rows or read rows from a file 


    Table<Integer, Column, String> result; 
    /* 
    SELECT FirstName, LastName, City 
    FROM Customers 
    WHERE FirstName LIKE '%ab%' 
      OR LastName LIKE '%an%' 
    */ 
    result = customerTable.query(or(like(Column.FIRST_NAME, "ab"), like(Column.LAST_NAME, "an")), 
      EnumSet.of(Column.FIRST_NAME, Column.LAST_NAME, Column.CITY)); 

    System.out.println(result); 
}