2015-02-12 96 views
0

Parse的文檔解釋瞭如何使用OR運算符添加多個約束,本例。如何在解析中添加複雜的約束?

ParseQuery<ParseObject> lotsOfWins = ParseQuery.getQuery("Player"); 
    lotsOfWins.whereGreaterThan(150); 

    ParseQuery<ParseObject> fewWins = ParseQuery.getQuery("Player"); 
    fewWins.whereLessThan(5); 

    List<ParseQuery<ParseObject>> queries = new ArrayList<ParseQuery<ParseObject>>(); 
    queries.add(lotsOfWins); 
    queries.add(fewWins); 

    ParseQuery<ParseObject> mainQuery = ParseQuery.or(queries); 
    mainQuery.findInBackground(new FindCallback<ParseObject>() { 
     public void done(List<ParseObject> results, ParseException e) { 
     // results has the list of players that win a lot or haven't won much. 
     } 
    }); 

但我想補充的倍數OR's運營商,在Conjunctive normal form。要獲得財產以後這樣的:(A或B或C)和(d或E或F)和(G或H或I)

有沒有辦法做到這一點?

+0

ps - 注意到您的歷史記錄中沒有標記爲正確或最高的答案。可能是合法的原因,但如果您標記了正確和最新的正確內容,那麼您會更好地關注您的問題並幫助網站投票選擇有用的內容。 (兩者都是在答案左上方的大數字旁邊的小控件完成的) – danh 2015-02-12 01:11:15

回答

0

它不是SQL,肯定的,但與運算也支持在同一查詢複合條件,並使用Query.or方法手術室。換句話說,在過於籠統的風險,轉換你的邏輯析取形式:

(a OR b) AND (c OR d) = (a AND c) OR (b AND c) OR (a AND d) OR (b AND d) 

,並建立查詢每個脫節操作,每個應用到它的多個一起操作數。

編輯 - 關於一個非常大的脫節,我沒有在文檔找到任何地方的限制,以通過或允許的查詢操作數的數量,但它是有道理的,會有一個限額和解析會繼續它很小。

當你用盡query.or限制,您可以通過連續運行批次,結果總結實施脫節。換句話說,將查詢分組到10個或其他內容中,使用OR連續運行它們,將每個結果添加到不包含重複項的累積集。

但是不管你怎麼樣分割,非常複雜的條件將導致會在某個時刻對資源限制跑起來(一些人爲的基於你在做什麼的薪酬層級上)在分析計算代價。

例如,假設你開始與上面的謂詞和你它轉化爲析取的形式,因爲我有。再說,Query.or也僅限於2個查詢。你仍然可以執行兩個或連續的,總結的結果是這樣的(在JS):

var queryAC = new Parse.Query("MyClass"); 
// set queryAC.whereEqualTo(), where... for constraint a 
// set queryAC.whereEqualTo(), where... for constraint c 

var queryBC = new Parse.Query("MyClass"); 
// set queryAC.whereEqualTo(), where... for constraint b 
// set queryAC.whereEqualTo(), where... for constraint c 

var queryAD = new Parse.Query("MyClass"); 
// set queryAC.whereEqualTo(), where... for constraint a 
// set queryAC.whereEqualTo(), where... for constraint d 

var queryBD = new Parse.Query("MyClass"); 
// set queryAC.whereEqualTo(), where... for constraint b 
// set queryAC.whereEqualTo(), where... for constraint d 

// now, run them as or, serially. in JS using promises... 
var cumulativeResults = []; 
Parse.Query.or(queryAC, queryBC).then(function(results) { 
    cumulativeResults = cumulativeResults.concat(results); 
    return Parse.Query.or(queryAD, queryBD); 

    // this is how to do it in js with promises, in Java, the 
    // equivalent idea is to run the next or in the completion 
    // callback of the first one 
}).then(function (results) { 
    cumulativeResults = cumulativeResults.concat(results); 
    // remove dups here based on objectId, or do it in the line 
    // above when adding results. 
    // now cumulativeResults contains the OR sum of the original expression 
}); 

關於應用德摩根的規則,解析處理底片象徵,通過提供負同行,例如可以用whereNotEqualTo來抵消whereEqualTo。我很確定這些功能並不完整......我偶爾遇到無法表達我需要的情況。我在那個時候的做法是儘可能少地讀入內存,並使用應用邏輯從那裏應用邏輯測試。

+0

這個想法很好,但有一個奇怪的問題:我不能添加超過10個查詢來應用它們或運算符。例如:for(int i = 0; i <12; i ++){ParseQuery query = ParseQuery.getQuery(「ParseObject」); try {query.whereContains(「country」,「france」); ListQueries.add(query); (例外e){ e.printStackTrace(); } }'如果我申請'mainQuery.or(ListQueries)'不工作 – Sergiohernandez 2015-02-12 16:58:28

+0

有趣。請參閱編輯。下一個技巧是連續運行批次,但您可能會遇到資源限制。 – danh 2015-02-12 17:11:21

+0

我不明白你的意思。解析並沒有說明OR限制。 – Sergiohernandez 2015-02-12 17:44:44