<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Answers to: Extend Task Json Query</title><link>https://answers.axonivy.com/questions/2629/extend-task-json-query</link><description>&lt;p&gt;I have a Task Query as json to filter tasks by states: SUSPENDED, RESUMED, PARKED and order by priority:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TaskQuery stateQuery = TaskQuery.create().where().state().isEqual(TaskState.SUSPENDED).or().state().isEqual(TaskState.RESUMED).or().state().isEqual(TaskState.PARKED).orderBy().priority();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After that, I would like to extend this query: filtering by ((suspended or resumed or parked states) and applicationId) order by priority but it is not as my expectation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Way 1: TaskQuery.fromJson(stateQueryJson).where().and().applicationId().isEqual(1);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result: SELECT * FROM IWA_Task WHERE (Column(IWA_TaskQuery.State) = 4 || Column(IWA_TaskQuery.State) = 5 || (Column(IWA_TaskQuery.State) = 8 &amp;amp;&amp;amp; Column(IWA_TaskQuery.ApplicationId) = 1)) ORDER BY Column(CurrentPriority) ASCENDING&lt;/p&gt;
&lt;p&gt;==&amp;gt; &lt;strong&gt;Tasks with Suspended state and Resumed state are not filtered by applicationId&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Way 2: TaskQuery.create().where().and(TaskQuery.fromJson(stateQuery.asJson())).and().applicationId().isEqual(1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result: SELECT * FROM IWA_Task WHERE ((Column(IWA_TaskQuery.State) = 4 || Column(IWA_TaskQuery.State) = 5 || Column(IWA_TaskQuery.State) = 8) &amp;amp;&amp;amp; Column(IWA_TaskQuery.ApplicationId) = 1) &lt;/p&gt;
&lt;p&gt;==&amp;gt; &lt;strong&gt;Priority order is lost&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Do you have any suggestions? Or is it a bug of task json query?&lt;/p&gt;</description><atom:link href="https://answers.axonivy.com/questions/2629/extend-task-json-query" rel="self"></atom:link><language>en</language><lastBuildDate>Mon, 22 May 2017 04:10:00 -0400</lastBuildDate><item><title>Comment by Flavio Sadeghi on lttung's answer</title><link>https://answers.axonivy.com/questions/2629/extend-task-json-query#2632</link><description>&lt;p&gt;Hi &lt;a href="http://answers.axonivy.com/users/558/lttung"&gt;&lt;a href="http://answers.axonivy.com/users/558/lttung"&gt;@lttung&lt;/a&gt;&lt;/a&gt;, thanks for pointing out the deserialization bug. We will analyze it. Here the link to the issue: &lt;a href="https://jira.axonivy.com/jira/browse/XIVY-1923:"&gt;https://jira.axonivy.com/jira/browse/XIVY-1923:&lt;/a&gt; CaseQuey / TaskQuery json deserialization removes AND-condition when it has only one condition&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Flavio Sadeghi</dc:creator><pubDate>Mon, 22 May 2017 04:10:00 -0400</pubDate><guid>https://answers.axonivy.com/questions/2629/extend-task-json-query#2632</guid></item><item><title>Answer by lttung</title><link>https://answers.axonivy.com/questions/2629/extend-task-json-query/2631</link><description>&lt;p&gt;Hi Flavio,&lt;/p&gt;
&lt;p&gt;The problem is from Json:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TaskQuery orConditions = TaskQuery.create()
  .where().state().isEqual(TaskState.SUSPENDED)
  .or().state().isEqual(TaskState.RESUMED)
  .or().state().isEqual(TaskState.PARKED);

TaskQuery query1 = TaskQuery.create()
  .where().and(orConditions)
  .orderBy().priority();

TaskQuery query2 = TaskQuery.fromJson(query1.asJson()); //The result queries of 1 and 2 are the same.

query1.where().applicationId().isEqual(1); // Correct as expected.
query2.where().applicationId().isEqual(1); // Wrong, the same as Way 1.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Why is query2 the same as query1 before filtering by app but different after that?&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">lttung</dc:creator><pubDate>Thu, 18 May 2017 23:31:08 -0400</pubDate><guid>https://answers.axonivy.com/questions/2629/extend-task-json-query/2631</guid></item><item><title>Answer by Flavio Sadeghi</title><link>https://answers.axonivy.com/questions/2629/extend-task-json-query/2630</link><description>&lt;p&gt;The following snipped creates your expected query:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TaskQuery orConditions = TaskQuery.create()
   .where().state().isEqual(TaskState.SUSPENDED)
      .or().state().isEqual(TaskState.RESUMED)
      .or().state().isEqual(TaskState.PARKED);

TaskQuery query = TaskQuery.create()
   .where().and(orConditions)
   .orderBy().priority();

query.where().applicationId().isEqual(1);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Resulting Query:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT *  
  FROM IWA_Task  
  WHERE
  (
      (  Column(IWA_TaskQuery.State) = 4 
      || Column(IWA_TaskQuery.State) = 5 
      || Column(IWA_TaskQuery.State) = 8
      ) 
      &amp;amp;&amp;amp; 
      Column(IWA_TaskQuery.ApplicationId) = 1
  ) 
  ORDER BY Column(CurrentPriority) ASCENDING
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Way 1: The first 'operator' is a OR-operator. As a result, the root-operator is a or-operator and therefore any further operators are attached to this root-(or-)operator, which results in your written condition.&lt;/p&gt;
&lt;p&gt;Way 2: The method &lt;code&gt;and(TaskQuery q)&lt;/code&gt; doesn only take the filter (the where-condition) from the passed query.&lt;/p&gt;
&lt;p&gt;I would say: the TaskQuery API is a perfect fluent API. When using it to combine multiple condition is is a bit tricky...&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Flavio Sadeghi</dc:creator><pubDate>Thu, 18 May 2017 09:33:34 -0400</pubDate><guid>https://answers.axonivy.com/questions/2629/extend-task-json-query/2630</guid></item></channel></rss>