如何使用 Artifactory 查询语言进行逆向查询?

How to inverse query using Artifactory Query Language?

在 Artfactory 中,我有一个“回购”属性列表,其中一些带有“路径”属性。我需要找到所有与这些属性不匹配的项目。我想知道是否有一种方法可以构建我的逻辑,以便可以在一个查询中完成。

这是我目前的错误逻辑:

curl -u $credentials \
-X POST https://my-artifactory-server.com/artifactory/api/search/aql \
-H content-type:text/plain -d 'items.find({ 
    "$and": [
        {"repo" : {"$neq" : "top_level_directory"}},
        { 
            "$and": [ 
                {"repo" : {"$neq" : "other_top_level_directory"}},
                {"path" : {"$nmatch" : "sub_directory/*"}}
            ]
        }
    ]
}).include("repo","path","name","size","modified")'

问题在于,虽然“repo”属性 是唯一的,但“路径”属性 不是。因此,所有子目录都将从查询结果中排除。

是的。 AQL 就像一个逻辑子句,因此我们可以将其结构化。 我假设以下是原始查询:

{
  "$or": [
    { "repo": { "$eq": "top_level_directory" } },
    {
      "$and": [
        { "repo": { "$eq": "other_top_level_directory" } },
        { "path": { "$match": "sub_directory/*" } }
      ]
    }
  ]
}
A - repo == top_level_directory
B - repo == other_top_level_directory
C - path =~ sub_directory/*
Original query:
A ∨ (B ∧ C)

Inversion:
¬(A ∨ (B ∧ C))
<=> (De Morgan)
¬A ∧ ¬(B ∧ C))
<=> (De Morgan)
¬A ∧ (¬B ∨ ¬C)) 

并推导出以下查询:

{
  "$and": [
    { "repo": { "$neq": "top_level_directory" } },
    {
      "$or": [
        { "repo": { "$neq": "other_top_level_directory" } },
        { "path": { "$nmatch": "sub_directory/*" } }
      ]
    }
  ]
}