2012-06-12 26 views
2

我們是否有一些IBM pureQuery的開源替代品來查詢Java集合框架的內存集合或複合Java對象?任何有效的開源可以替代IBM purequery來查詢內存集合?

+0

我不知道是否你問,如果有一個OSS替代的pureQuery以及是否工作的pureQuery在內存中的Java集合框架的DS,如果你想要一個OSS替代方案,可以處理內存中的集合,特別是Java集合框架。 – haylem

回答

7

正如我的評論中提到的,我不完全確定我理解您的問題:我不確定您是否問是否存在pureQuery的OSS替代方案,以及pureQuery是否適用於Java Collection的內存DS框架,如果你想要一個可以在內存集合上工作的OSS替代品,尤其是Java集合框架。

不過,我會的git它一個嘗試...

持久層查詢語言/框架

如果你正在尋找一個開源軟件查詢 - 鹼相互作用與持久層,明顯的解決方案很簡單:

請注意,這些也可用於內存數據庫(如H2或HSQLDb)。

集合的查詢語言/框架

不過,如果你想查詢的集合,有幾個項目,如:

  • the java Query Language (JQL)語言的擴展:

    ArrayList<String> words = dict.getWords(Puzzle.MEDIUM); 
    ArrayList<Integer> gaplengths = puzzle.getGapLengths(); 
    
    List<Object[]> matches = selectAll(
        String w : words, 
        Integer i : gaplengths | w.length() == i); 
    
  • the Stack-Based Query Language for Java (sqbl4j)語言擴展:

    List<Product> products = getProductList(); 
    List<Product> expensiveInStockProducts = #{ 
        products 
        where unitsInStock > 0 and unitPrice > 3.00 
    }; 
    
  • Java Objects SQL (JoSQL)

    List myObjs = getMyObjects(); 
    Query q = new Query(); 
    q.parse ("SELECT * FROM java.io.File WHERE name LIKE '%.java'"); 
    QueryResults qr = q.execute (myObjs); 
    List res = qr.getResults(); 
    
  • jxpath,一種不同的方法使用XPath表達式:

    Address address = (Address)JXPathContext 
        .newContext(vendor) 
        .getValue("locations[address/zipCode='90210']/address"); 
    
  • 的Java函數式編程庫提供了類似的功能,因爲他們給你訪問基本功能構建體filter,map, collect,transform等...例如,有:

    • Google Guava

      Set<String> strings = buildSetStrings(); 
      Collection<String> filteredStrings = 
          Collections2.filter(strings, Predicates.containsPattern("^J")); 
      
    • Functional Java

      Array<Integer> a = array(97, 44, 67, 3, 22, 90, 1, 77, 98, 1078, 6, 64, 6, 79, 42); 
      final Array<Integer> b = a.filter(even); 
      
    • LambdaJ

      // with normal interfaces: 
      List<Person> buyersSortedByAges = sort(
          extract(
           select(sales, having(on(Sale.class).getValue(), greaterThan(50000))) 
          ), on(Sale.class).getBuyer() 
      ), on(Person.class).getAge()); 
      
      // with fluent/chainable intefaces: 
      List<Person> buyersSortedByAges = with(sales) 
          .retain(having(on(Sale.class).getValue(), greaterThan(50000))) 
          .extract(on(Sale.class).getBuyer()) 
          .sort(on(Person.class).getAge()); 
      

或者,也許你只是在找這個教程querying in-memory collections with pureQuery

+0

謝謝!如果您可以更新您的答案,那將很酷,因爲它包含許多似乎無法維護的項目。也許現在有一些新的選擇?像下面提到的CQEngine一樣... – Simon