2016-04-13 5 views
0

私はJavaストリームを理解するのに少し問題があります。基本的に要素をデータベースに格納し、取得し(結果はストリームで返されます)、次に両方の要素を比較するJUnitテストを作成しました。テストに失敗したので、デバッグを開始しました。突然テストが合格した。私のブレークポイントは、ストリームを作るのに必要な時間を与えましたか?ストリームは常に空です - 私が時間を与えない限り

データベースとしてElasticsearchと
@Test 
public void matchAllTest() { 
    client.insert(object); //database schema is empty 

    Stream<Object> stream = client.query("{ query matching all objects }"); 

    Object firstResult = stream.findFirst().get(); 
    assertObjectEquals(object, firstResult); 
} 

query作品と次のようになります試験に

public Stream<Object> query(String query) { 
    SearchRequestBuilder request = client.prepareSearch("index"); 
    request.setQuery(query); 

    Stream.Builder<Object> stream = Stream.builder(); 

    SearchResponse response = request.get(); 
    SearchHits hits = response.getHits(); 
    hits.forEach(object -> stream.accept(object); 

    return stream.build(); 
} 

clientquery方法でクラスを指します。 2番目のコードスニペットのclientは、Elasticsearchノードクライアントを指します。ES Java docsを参照してください。

NoSuchElementException(「値はありません」)でテストが失敗します。時間を与えない限り、テストは失敗します。

ここでは正確に何が起こっていますが、どうすれば例外を回避できますか?

+1

'query'メソッドは非同期ですか? 「クライアント」とは何ですか? –

+0

'client'はデータベース(Elasticsearch)に接続し、オブジェクトを格納し検索する' query'のようなメソッドを提供します。 Elasticsearchの文書では、「実行された操作は本質的に非同期である」と述べています。私は 'query'メソッドを同期としてラベルしようとしましたが、それは役に立たなかった。 – Felix

+0

'client'はどんなタイプですか?私は普通の 'query'メソッドを公開しているドキュメントの型を見つけることができませんでした。私をドキュメントにリンクさせる心ですか? [序文](https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-api.html)は、「*リスナーを受け入れるか、将来を返すか」と述べています。クライアントにリスナーをアタッチするか、メソッドの引数としてコールバック関数を渡して、アクション(クエリ)が完了したら通知することができます。 –

答えて

1

問題は、elasticsearchでの更新後にのみドキュメントを検索できることです。

テストの場合は、強制的にrefreshとすることができます。

+0

ありがとうございました。問題は[elasticsearch java API:matchAll検索クエリが結果を返さないという質問]でも議論されました。(http://stackoverflow.com/questions/12692758/elasticsearch-java-api-matchall-search-query-doesnt-return -results)(作業コードの例を含む)。 – Felix

関連する問題