1

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

这是我当前的错误逻辑:

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”属性是唯一的,但“path”属性不是。因此,所有子目录都将从查询结果中排除。

4

1 回答 1

0

是的。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/*" } }
      ]
    }
  ]
}
于 2021-09-22T04:29:48.823 回答