2016-04-08 14 views
2

Betrachten sie einen typischen Kunden Tabelle:Wie SQL-Tabelle und SELECT-Abfrage in Guava vertreten?

Customers table

und eine typische SQL Pattern-Matching-Abfrage:

SELECT FirstName, LastName, City 

FROM Customers 

WHERE FirstName LIKE '%ab%' 

OR LastName LIKE '%an%' 

Wie können wir diese Tabelle und SQL SELECT-Abfrage mit Google Guava Bibliothek darstellen Tabelle Sammlung und Prädikate?

EDIT

Wie mfulton26 erwähnt, ist die Guava Tabelle wahrscheinlich nicht die ideale Datenstruktur entspricht einer Datenbanktabelle.

ja, welche die am besten geeignete Datenstruktur für ein in Speicherdatentabelle der Lage ist, ist:

1) Iteration (wahrscheinlich mit Iteratoren)

2) Filter (wahrscheinlich mit Prädikaten)

3) Mehrere Datenspalten mit Indizierung für schnellen Zugriff.

+0

Ich implementiert schließlich die grundlegende TABLE-Struktur nach Evgeny Antwort (http://stackoverflow.com/a/36494261/4419474) und FluentIterable wie mfulton26's Antwort (http://stackoverflow.com/a/36500647/4419474) – Chebyr

Antwort

3

Beachten Sie, dass eine SQL-Tabelle nicht üblich ly kartiert zu einem Guava-Tisch. Guava-Tabelle ist für, wenn Sie zwei Indizes benötigen (siehe NewCollectionTypesExplained · google/guava Wiki). Ein SQL-Tabellenergebnissatz wird normalerweise als einfaches Collection oder Iterable dargestellt.

Mit dieser sagte, hier ist, wie man "Abfrage" ein Guava Tabelle:

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"); 
    } 
}); 

Beachten Sie auch, dass Guavas Tabelle nicht wie eine Datenbanktabelle ist, in der Sie ca n fügen Sie zusätzliche Indizes hinzu, usw. Sie erhalten nur zwei Indizes: Zeile und Spalte.

3

Tabelle

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; 
    } 

Prädikats

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); 
    } 
} 

Anwendungsbeispiel

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); 
}