Hi @vani1012,
This is correct behavior. Referring to official documentation, you can see that Property filter use OR for multiple values:
Comma delimited values are evaluated as OR’s.
Above can be easily confirmed checking implementation:
Now, if you have a look how predicate is evaluated into query you will get below values:
Query string:
http://localhost:4502/editor.html/content/asset-share-commons/en/light.html?1_group.propertyvalues.property=.%2Fjcr%3Acontent%2Fmetadata%2Fdc%3Aformat&1_group.propertyvalues.operation=unequals&1_group.propertyvalues.0_values=image%2Fjpeg%2Cimage%2Fgif%2Cimage%2Fpng%2Cimage%2Ftiff%2Cimage%2Fvnd.adobe.photoshop%2Capplication%2Fpostscript&1_group.propertyvalues.1_values=application%2Fvnd.openxmlformats-officedocument.wordprocessingml.document%2Capplication%2Fpdf%2Ctext%2Fplain&1_group.propertyvalues.3_values=application%2Fvnd.openxmlformats-officedocument.presentationml.presentation&orderby=%40jcr%3Acontent%2Fjcr%3AlastModified&orderby.sort=desc&layout=card&p.offset=0&p.limit=24
This evaluates to following predicate tree:
ROOT=group: limit=24, guessTotal=100, offset=0[
{orderby=orderby: orderby=@jcr:content/jcr:lastModified, sort=desc}
{type=type: type=dam:Asset}
{2_group=group: or=true[
{0_path=path: path=/content/dam/asset-share-commons/en/public}
{1_path=path: path=/content/dam/we-retail/en}
]}
{4_group=group: [
{mainasset=mainasset: mainasset=true}
]}
{5_group=group: [
{property=property: property=jcr:content/contentFragment, operation=not}
]}
{8_group=group: [
{1_propertyvalues=propertyvalues: property=./jcr:content/metadata/dc:format, operation=unequals, 0_values=image/jpeg,image/gif,image/png,image/tiff,image/vnd.adobe.photoshop,application/postscript, 1_values=application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/pdf,text/plain, 3_values=application/vnd.openxmlformats-officedocument.presentationml.presentation}
]}
]Finally you will get xPath like this:
(/jcr:root/content/dam/asset-share-commons/en/public//element(*, dam:Asset)[(not(jcr:content/@contentFragment)) and ((_x002e_/jcr:content/metadata/@dc:format != 'image/tiff' or _x002e_/jcr:content/metadata/@dc:format != 'image/png' or _x002e_/jcr:content/metadata/@dc:format != 'application/vnd.openxmlformats-officedocument.presentationml.presentation' or _x002e_/jcr:content/metadata/@dc:format != 'image/vnd.adobe.photoshop' or _x002e_/jcr:content/metadata/@dc:format != 'text/plain' or _x002e_/jcr:content/metadata/@dc:format != 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' or _x002e_/jcr:content/metadata/@dc:format != 'application/postscript' or _x002e_/jcr:content/metadata/@dc:format != 'image/jpeg' or _x002e_/jcr:content/metadata/@dc:format != 'application/pdf' or _x002e_/jcr:content/metadata/@dc:format != 'image/gif'))] | /jcr:root/content/dam/we-retail/en//element(*, dam:Asset)[(not(jcr:content/@contentFragment)) and ((_x002e_/jcr:content/metadata/@dc:format != 'image/tiff' or _x002e_/jcr:content/metadata/@dc:format != 'image/png' or _x002e_/jcr:content/metadata/@dc:format != 'application/vnd.openxmlformats-officedocument.presentationml.presentation' or _x002e_/jcr:content/metadata/@dc:format != 'image/vnd.adobe.photoshop' or _x002e_/jcr:content/metadata/@dc:format != 'text/plain' or _x002e_/jcr:content/metadata/@dc:format != 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' or _x002e_/jcr:content/metadata/@dc:format != 'application/postscript' or _x002e_/jcr:content/metadata/@dc:format != 'image/jpeg' or _x002e_/jcr:content/metadata/@dc:format != 'application/pdf' or _x002e_/jcr:content/metadata/@dc:format != 'image/gif'))]) order by jcr:content/@jcr:lastModified descending
Analyzing above information you can clearly see how query has been build. What is key, is a fact that OR condition is used instead of AND - this is of course aligned with information from documentation. To achieve your case you will need AND in your condition.
You can do a simple test running SQL2 query from crx, just compere results of below two queries.
- query #1
SELECT * FROM [dam:Asset] AS s WHERE (s.[jcr:content/metadata/dc:format] <> "image/png" OR s.[jcr:content/metadata/dc:format] <> "image/jpeg")
- query #2
SELECT * FROM [dam:Asset] AS s WHERE (s.[jcr:content/metadata/dc:format] <> "image/png" AND s.[jcr:content/metadata/dc:format] <> "image/jpeg")
Due to the fact Asset Share Commons does not provide Property filter with AND option, you will need to build your own component and predicate evaluator that will use AND condition. In general you could use exactly the same implementation like the one in Asset Share Commons but changing OR to AND.
Here are some references to Asset Share Commons code: