Query time increases abnormally with too many sub-queries

My Environment

ArangoDB Version:       3.8.7, also tested on 3.11.4
Deployment Mode:       Single Server
Deployment Strategy:  systemd
Infrastructure:               own
Operating System:        Ubuntu 20.04
Total RAM in your machine:        256G
Disks in use:        SSD
Used Package:             Ubuntu .deb

Component, Query & Data
Affected feature:
AQL query
AQL query (if applicable):
LET project_pn_key = "bdtgf_jfm_sync_v1"
    LET r = []

    FOR o IN observations
        FILTER o._key == '1003316854'

        LET taxo = (
            FOR t IN taxa
                FILTER t.name == o.computed.current_name
                FILTER project_pn_key IN t.sources
                FOR sp IN t.species_list
                    FILTER sp.nameAccordingTo == project_pn_key
                    RETURN {
                        users_common_names: (
                            for ve in vernaculars
                                filter ve.species == t.name
                                filter ve.lang == 'fr'
                                collect term = ve.term with count into c
                                filter c > 1
                                sort c desc
                                return {term, c}
                        )
                    }
        )
        LET syno = (LENGTH(taxo)) ? [] : (
            FOR t in taxa
                FILTER o.computed.current_name IN t.synonyms
                FILTER project_pn_key IN t.sources
                FOR sp IN t.species_list
                    FILTER sp.nameAccordingTo == project_pn_key
                    FILTER o.computed.current_name IN sp.synonyms
                    RETURN {
                        users_common_names: (
                            for ve in vernaculars
                                filter ve.species == t.name
                                filter ve.lang == 'fr'
                                collect term = ve.term with count into c
                                filter c > 1
                                sort c desc
                                return {term, c}
                        )
                    }
        )
        LET taxodata = (LENGTH(taxo) ? taxo[0] : syno[0])

        LET obs_votes = (
            FOR v IN votes
                FILTER v.observation_id == o._key
                LET sp = (
                    v.type == 'determination' ? (
                        FOR t IN taxa
                            FILTER t.name == v.value
                            let prefered_ck = (
                                for i in 0..(length(t.species_list))
                                    FILTER t.species_list[i].nameAccordingTo == project_pn_key
                                    return i
                            )[0]
                            RETURN {
                                species: {
                                    project: (
                                        for s in t.sources
                                            for p in projects
                                                filter p._pn_key == s
                                                LET arr = (
                                                    p.roles[* FILTER CURRENT IN r RETURN CURRENT]
                                                )
                                                FILTER (LENGTH(p.roles) == 0 OR LENGTH(arr) > 0)
                                                let order = p._key == 'guyane' ? 0 : 1
                                                sort order
                                                limit 1
                                                return p._key
                                    )[0]
                                },
                                users_common_names: (
                                    for ve in vernaculars
                                        filter ve.species == t.name
                                        filter ve.lang == 'fr'
                                        collect term = ve.term with count into c
                                        filter c > 1
                                        sort c desc
                                        return {term, c}
                                )
                            }
                    ) : null
                )
                RETURN {
                    obs_id: v.observation_id,
                    img_id: v.image_id,
                    user_id: v.user_id,
                    user: (
                        for u in users
                            filter u._key == v.user_id
                            return {
                                email: u.email
                            }
                    )[0],
                    type: v.type,
                    val: v.value,
                    sp: sp[0]
                }
        )

        LET partners_votes = (
            FOR v IN o.computed.votes
                LET sp = (
                    FOR t IN taxa
                        FILTER t.name == v.name
                        RETURN {
                            species: {
                                project: (
                                    for s in t.sources
                                        for p in projects
                                            filter p._pn_key == s
                                            limit 1
                                            return p._key
                                )[0]
                            },
                            users_common_names: (
                                for ve in vernaculars
                                    filter ve.species == t.name
                                    filter ve.lang == 'fr'
                                    collect term = ve.term with count into c
                                    filter c > 1
                                    sort c desc
                                    return {term, c}
                            )
                        }
                )
                RETURN {
                    obs_id: o._key,
                    val: v.name,
                    sp: sp[0],
                    plus: v.plus
                }
        )

        let obs_tags = (
            for tag in o.computed.tags
                for tc in tags_catalog
                    filter tc.name == tag.name
                    filter tc.target == 'observation'
                    filter tc.public_display == true
                    return {
                        value: (
                            filter tc.values
                            for tv in tc.values
                                filter tv.name == tag.value
                                return {
                                    key: tv.name,
                                    label: tv.description['fr'] || tv.description['en']
                                }
                        )[0]
                    }
        )

        RETURN {
            taxo: taxodata,
            votes: obs_votes,
            partners_votes: partners_votes,
            obs_tags: obs_tags
        }

AQL explain and/or profile (if applicable):
Query String (6747 chars - truncated..., cacheable: true):
 LET project_pn_key = "bdtgf_jfm_sync_v1"
     LET r = []

     FOR o IN observations
         FILTER o._key == '1003316854'
         LET taxo = (
             FOR t IN taxa
                 FILTER t.name == o.computed.current_name
                 FILTER project_pn_key IN t.sources
                 FOR sp IN t.species_list
                     FILTER sp.nameAccordingTo == project_pn_key
                     RETURN {
                         users_common_names: (
                             for ve in vernaculars
                                 filter ve.species == t.name
                                 filter ve.lang == 'fr'
                                 collect term = ve.term with count into c
                                 filter c > 1
                                 sort c desc
                                 return {term, c}
                         )
                     }
         )
         LET syno = (LENGTH(taxo)) ? [] : (
             FOR t in taxa
                 FILTER o.computed.cu...

Execution plan:
  Id   NodeType                 Est.   Comment
   1   SingletonNode               1   * ROOT
 195   IndexNode                   1     - FOR o IN observations   /* primary index scan */
 125   CalculationNode             1       - LET #155 = o.`computed`.`votes`   /* attribute expression */   /* collections used: o : observations */
 231   SubqueryStartNode           1       - LET partners_votes = ( /* subquery begin */
 126   EnumerateListNode         100         - FOR v IN #155   /* list iteration */
 233   SubqueryStartNode         100           - LET sp = ( /* subquery begin */
 206   IndexNode                 100             - FOR t IN taxa   /* hash index scan */
 190   LimitNode                   1               - LIMIT 0, 1
 132   CalculationNode             1               - LET #159 = t.`sources`   /* attribute expression */   /* collections used: t : taxa */
 237   SubqueryStartNode           1               - LET #56 = ( /* subquery begin */
 133   EnumerateListNode         100                 - FOR s IN #159   /* list iteration */
 208   IndexNode                 100                   - FOR p IN projects   /* hash index scan, projections: `_key` */
 137   LimitNode                   1                     - LIMIT 0, 1
 192   LimitNode                   1                     - LIMIT 0, 1
 138   CalculationNode             1                     - LET #163 = p.`_key`   /* attribute expression */   /* collections used: p : projects */
 238   SubqueryEndNode             1                     - RETURN  #163 ) /* subquery end */
 235   SubqueryStartNode           1               - LET #61 = ( /* subquery begin */
 207   IndexNode                   2                 - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
 147   CalculationNode             2                   - LET #169 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
 148   CollectNode                 2                   - COLLECT term = #169 AGGREGATE c = LENGTH()   /* hash */
 149   CalculationNode             2                   - LET #171 = (c > 1)   /* simple expression */
 150   FilterNode                  2                   - FILTER #171
 151   SortNode                    2                   - SORT c DESC   /* sorting strategy: standard */
 152   CalculationNode             2                   - LET #173 = { "term" : term, "c" : c }   /* simple expression */
 236   SubqueryEndNode             1                   - RETURN  #173 ) /* subquery end */
 155   CalculationNode             1               - LET #175 = { "species" : { "project" : #56[0] }, "users_common_names" : #61 }   /* simple expression */
 234   SubqueryEndNode           100               - RETURN  #175 ) /* subquery end */
 158   CalculationNode           100           - LET #177 = { "obs_id" : o.`_key`, "val" : v.`name`, "sp" : sp[0], "plus" : v.`plus` }   /* simple expression */   /* collections used: o : observations */
 232   SubqueryEndNode             1           - RETURN  #177 ) /* subquery end */
 162   CalculationNode             1       - LET #179 = o.`computed`.`tags`   /* attribute expression */   /* collections used: o : observations */
 227   SubqueryStartNode           1       - LET obs_tags = ( /* subquery begin */
 163   EnumerateListNode         100         - FOR tag IN #179   /* list iteration */
 205   IndexNode                 100           - FOR tc IN tags_catalog   /* persistent index scan, projections: `public_display`, `target`, `values` */    FILTER ((tc.`target` == "observation") && (tc.`public_display` == true))   /* early pruning */
 172   CalculationNode           100             - LET #187 = tc.`values`   /* attribute expression */   /* collections used: tc : tags_catalog */
 229   SubqueryStartNode         100             - LET #72 = ( /* subquery begin */
 173   FilterNode                100               - FILTER #187
 175   EnumerateListNode       10000               - FOR tv IN #187   /* list iteration */
 176   CalculationNode         10000                 - LET #191 = (tv.`name` == tag.`value`)   /* simple expression */
 177   FilterNode              10000                 - FILTER #191
 191   LimitNode                   1                 - LIMIT 0, 1
 178   CalculationNode             1                 - LET #193 = { "key" : tv.`name`, "label" : (tv.`description`.`fr` || tv.`description`.`en`) }   /* simple expression */
 230   SubqueryEndNode           100                 - RETURN  #193 ) /* subquery end */
 181   CalculationNode           100             - LET #195 = { "value" : #72[0] }   /* simple expression */
 228   SubqueryEndNode             1             - RETURN  #195 ) /* subquery end */
 217   SubqueryStartNode           1       - LET obs_votes = ( /* subquery begin */
 200   IndexNode             4289149         - FOR v IN votes   /* persistent index scan */
 225   SubqueryStartNode     4289149           - LET #47 = ( /* subquery begin */
 204   IndexNode             4289149             - FOR u IN users   /* primary index scan, projections: `email` */
 193   LimitNode                   1               - LIMIT 0, 1
 118   CalculationNode             1               - LET #151 = { "email" : u.`email` }   /* simple expression */   /* collections used: u : users */
 226   SubqueryEndNode       4289149               - RETURN  #151 ) /* subquery end */
 219   SubqueryStartNode     4289149           - LET #43 = ( /* subquery begin */
 201   IndexNode             4289149             - FOR t IN taxa   /* hash index scan */
  82   CalculationNode       4289149               - LET #129 = t.`sources`   /* attribute expression */   /* collections used: t : taxa */
 223   SubqueryStartNode     4289149               - LET #36 = ( /* subquery begin */
  83   EnumerateListNode   428914900                 - FOR s IN #129   /* list iteration */
 203   IndexNode           857829800                   - FOR p IN projects   /* hash index scan, projections: `_key`, `_pn_key`, `roles` */
  85   CalculationNode     857829800                     - LET #131 = ((p.`_pn_key` == s) && ((LENGTH(p.`roles`) == 0) || (LENGTH(p.`roles`[* FILTER false RETURN  #32_]) > 0)))   /* simple expression */   /* collections used: p : projects */
  86   FilterNode          857829800                     - FILTER #131
  90   CalculationNode     857829800                     - LET order = ((p.`_key` == "guyane") ? 0 : 1)   /* simple expression */   /* collections used: p : projects */
  91   SortNode            857829800                     - SORT order ASC   /* sorting strategy: constrained heap */
  92   LimitNode                   1                     - LIMIT 0, 1
 194   LimitNode                   1                     - LIMIT 0, 1
  93   CalculationNode             1                     - LET #135 = p.`_key`   /* attribute expression */   /* collections used: p : projects */
 224   SubqueryEndNode       4289149                     - RETURN  #135 ) /* subquery end */
 221   SubqueryStartNode     4289149               - LET #41 = ( /* subquery begin */
 202   IndexNode             8578298                 - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
 102   CalculationNode       8578298                   - LET #141 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
 103   CollectNode           6862638                   - COLLECT term = #141 AGGREGATE c = LENGTH()   /* hash */
 104   CalculationNode       6862638                   - LET #143 = (c > 1)   /* simple expression */
 105   FilterNode            6862638                   - FILTER #143
 106   SortNode              6862638                   - SORT c DESC   /* sorting strategy: standard */
 107   CalculationNode       6862638                   - LET #145 = { "term" : term, "c" : c }   /* simple expression */
 222   SubqueryEndNode       4289149                   - RETURN  #145 ) /* subquery end */
 110   CalculationNode       4289149               - LET #147 = { "species" : { "project" : #36[0] }, "users_common_names" : #41 }   /* simple expression */
 220   SubqueryEndNode       4289149               - RETURN  #147 ) /* subquery end */
 121   CalculationNode       4289149           - LET #153 = { "obs_id" : v.`observation_id`, "img_id" : v.`image_id`, "user_id" : v.`user_id`, "user" : #47[0], "type" : v.`type`, "val" : v.`value`, "sp" : ((v.`type` == "determination") ? #43 : null)[0] }   /* simple expression */   /* collections used: v : votes */
 218   SubqueryEndNode             1           - RETURN  #153 ) /* subquery end */
 213   SubqueryStartNode           1       - LET #20 = ( /* subquery begin */
 198   IndexNode                   1         - FOR t IN taxa   /* hash index scan */    FILTER ("bdtgf_jfm_sync_v1" IN t.`sources`)   /* early pruning */
 215   SubqueryStartNode           1           - LET #18 = ( /* subquery begin */
 199   IndexNode                   2             - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
  52   CalculationNode             2               - LET #113 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
  53   CollectNode                 2               - COLLECT term = #113 AGGREGATE c = LENGTH()   /* hash */
  54   CalculationNode             2               - LET #115 = (c > 1)   /* simple expression */
  55   FilterNode                  2               - FILTER #115
  56   SortNode                    2               - SORT c DESC   /* sorting strategy: standard */
  57   CalculationNode             2               - LET #117 = { "term" : term, "c" : c }   /* simple expression */
 216   SubqueryEndNode             1               - RETURN  #117 ) /* subquery end */
  40   CalculationNode             1           - LET #103 = t.`species_list`   /* attribute expression */   /* collections used: t : taxa */
  60   CalculationNode             1           - LET #119 = { "users_common_names" : #18 }   /* simple expression */
  41   EnumerateListNode         100           - FOR sp IN #103   /* list iteration */
  42   CalculationNode           100             - LET #105 = ((sp.`nameAccordingTo` == "bdtgf_jfm_sync_v1") && (o.`computed`.`current_name` IN sp.`synonyms`))   /* simple expression */   /* collections used: o : observations */
  43   FilterNode                100             - FILTER #105
 214   SubqueryEndNode             1             - RETURN  #119 ) /* subquery end */
 209   SubqueryStartNode           1       - LET taxo = ( /* subquery begin */
 196   IndexNode                   1         - FOR t IN taxa   /* hash index scan */    FILTER ("bdtgf_jfm_sync_v1" IN t.`sources`)   /* early pruning */
 211   SubqueryStartNode           1           - LET #8 = ( /* subquery begin */
 197   IndexNode                   2             - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
  23   CalculationNode             2               - LET #91 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
  24   CollectNode                 2               - COLLECT term = #91 AGGREGATE c = LENGTH()   /* hash */
  25   CalculationNode             2               - LET #93 = (c > 1)   /* simple expression */
  26   FilterNode                  2               - FILTER #93
  27   SortNode                    2               - SORT c DESC   /* sorting strategy: standard */
  28   CalculationNode             2               - LET #95 = { "term" : term, "c" : c }   /* simple expression */
 212   SubqueryEndNode             1               - RETURN  #95 ) /* subquery end */
  13   CalculationNode             1           - LET #83 = t.`species_list`   /* attribute expression */   /* collections used: t : taxa */
  31   CalculationNode             1           - LET #97 = { "users_common_names" : #8 }   /* simple expression */
  14   EnumerateListNode         100           - FOR sp IN #83   /* list iteration */
  15   CalculationNode           100             - LET #85 = (sp.`nameAccordingTo` == "bdtgf_jfm_sync_v1")   /* simple expression */
  16   FilterNode                100             - FILTER #85
 210   SubqueryEndNode             1             - RETURN  #97 ) /* subquery end */
  63   CalculationNode             1       - LET syno = (LENGTH(taxo) ?  Executing any 3 of the 4 sub-queries gives a much faster execution. Executing any single sub-query among the 4 is almost instantaneous.
One could expect that the sub-queries are run in parallel and the total execution time should not exceed the execution time of the slowest of the 4 sub-queries. Even if executed sequentially, the total execution time should not exceed the sum of execution times.
Is it a matter of concurrency ? I/Os ? Multi-threading ? Memory used ?
Expected result:
Total execution time should be way lower, around 50ms.
Thank you very much,
Mathias

Hi,
the Est column of the table shows the number of documents the optimizer estimates to move from one node to the other, 857829800 at peak in your example.
If you use the later version, query profiling allows you to browse the actual figures of your query.
Resulting performance is a question of keeping these figures in range, and maybe optimize them by working with the query.  Some of that may be available through the optimizer, some not.

Hi @dothebart , what do you mean by "node"?
We are using a single node instance.

@matcho : It's a bit hard to tell from just the execution plan where the query spends most of its time.
Can you also attach the profile output of the query? The profile can be retrieved from the web UI or from the arangosh by running the command db._profileQuery({ query, bindVars }); in the respective database.
One thing that is striking from the explain output already is that the optimizer created 128 different query execution plans. This is the default maximum number of plans. So the optimizer may spend a lot of time trying to work through all the different execution plans, but this is currently a guess, because I don't know how much time was spent for query optimization and how much was spent for query execution. These numbers should also be included in the query profile, so hopefully it can shed at least a bit of light on the issue.

Thank you very much Wilfried and Jan for your quick answers. @jsteemann here's the profile output. It seems that you're right : most of the execution time is consumed by "optimizing plan". Is there a workaround you could think of?
Query String (6748 chars - truncated..., cacheable: false):
 LET project_pn_key = "bdtgf_jfm_sync_v1"
     LET r = []

     FOR o IN observations
         FILTER o._key == '1003316854'
         LET taxo = (
             FOR t IN taxa
                 FILTER t.name == o.computed.current_name
                 FILTER project_pn_key IN t.sources
                 FOR sp IN t.species_list
                     FILTER sp.nameAccordingTo == project_pn_key
                     RETURN {
                         users_common_names: (
                             for ve in vernaculars
                                 filter ve.species == t.name
                                 filter ve.lang == 'fr'
                                 collect term = ve.term with count into c
                                 filter c > 1
                                 sort c desc
                                 return {term, c}
                         )
                     }
         )
         LET syno = (LENGTH(taxo)) ? [] : (
             FOR t in taxa
                 FILTER o.computed.cu...

Execution plan:
  Id   NodeType            Calls   Items   Runtime [s]   Comment
   1   SingletonNode           1       1       0.00001   * ROOT
 195   IndexNode               1       1       0.00019     - FOR o IN observations   /* primary index scan */
 125   CalculationNode         1       1       0.00001       - LET #155 = o.`computed`.`votes`   /* attribute expression */   /* collections used: o : observations */
 231   SubqueryStartNode       1       2       0.00002       - LET partners_votes = ( /* subquery begin */
 126   EnumerateListNode       1       2       0.00002         - FOR v IN #155   /* list iteration */
 233   SubqueryStartNode       1       3       0.00001           - LET sp = ( /* subquery begin */
 206   IndexNode               1       3       0.00048             - FOR t IN taxa   /* hash index scan */
 194   LimitNode               1       3       0.00001               - LIMIT 0, 1
 132   CalculationNode         1       3       0.00001               - LET #159 = t.`sources`   /* attribute expression */   /* collections used: t : taxa */
 237   SubqueryStartNode       1       4       0.00025               - LET #56 = ( /* subquery begin */
 133   EnumerateListNode       1      40       0.00004                 - FOR s IN #159   /* list iteration */
 208   IndexNode               1       4       0.00021                   - FOR p IN projects   /* hash index scan, projections: `_key` */
 137   LimitNode               1       4       0.00000                     - LIMIT 0, 1
 193   LimitNode               1       4       0.00000                     - LIMIT 0, 1
 138   CalculationNode         1       4       0.00001                     - LET #163 = p.`_key`   /* attribute expression */   /* collections used: p : projects */
 238   SubqueryEndNode         1       3       0.00001                     - RETURN  #163 ) /* subquery end */
 235   SubqueryStartNode       1       4       0.00023               - LET #61 = ( /* subquery begin */
 207   IndexNode               1     100       0.00111                 - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
 147   CalculationNode         1     100       0.00004                   - LET #169 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
 148   CollectNode             1      13       0.00003                   - COLLECT term = #169 AGGREGATE c = LENGTH()   /* hash */
 149   CalculationNode         1      13       0.00001                   - LET #171 = (c > 1)   /* simple expression */
 150   FilterNode              1      11       0.00001                   - FILTER #171
 151   SortNode                1      11       0.00001                   - SORT c DESC   /* sorting strategy: standard */
 152   CalculationNode         1      11       0.00001                   - LET #173 = { "term" : term, "c" : c }   /* simple expression */
 236   SubqueryEndNode         1       3       0.00001                   - RETURN  #173 ) /* subquery end */
 155   CalculationNode         1       3       0.00001               - LET #175 = { "species" : { "project" : #56[0] }, "users_common_names" : #61 }   /* simple expression */
 234   SubqueryEndNode         1       2       0.00000               - RETURN  #175 ) /* subquery end */
 158   CalculationNode         1       2       0.00001           - LET #177 = { "obs_id" : o.`_key`, "val" : v.`name`, "sp" : sp[0], "plus" : v.`plus` }   /* simple expression */   /* collections used: o : observations */
 232   SubqueryEndNode         1       1       0.00001           - RETURN  #177 ) /* subquery end */
 162   CalculationNode         1       1       0.00000       - LET #179 = o.`computed`.`tags`   /* attribute expression */   /* collections used: o : observations */
 227   SubqueryStartNode       1       2       0.00000       - LET obs_tags = ( /* subquery begin */
 163   EnumerateListNode       1       1       0.00004         - FOR tag IN #179   /* list iteration */
 205   IndexNode               1       1       0.00005           - FOR tc IN tags_catalog   /* persistent index scan, projections: `public_display`, `target`, `values` */    FILTER ((tc.`target` == "observation") && (tc.`public_display` == true))   /* early pruning */
 172   CalculationNode         1       1       0.00000             - LET #187 = tc.`values`   /* attribute expression */   /* collections used: tc : tags_catalog */
 229   SubqueryStartNode       1       1       0.00000             - LET #72 = ( /* subquery begin */
 173   FilterNode              1       1       0.00000               - FILTER #187
 175   EnumerateListNode       1       1       0.00006               - FOR tv IN #187   /* list iteration */
 176   CalculationNode         1       1       0.00001                 - LET #191 = (tv.`name` == tag.`value`)   /* simple expression */
 177   FilterNode              1       1       0.00000                 - FILTER #191
 190   LimitNode               1       1       0.00000                 - LIMIT 0, 1
 178   CalculationNode         1       1       0.00000                 - LET #193 = { "key" : tv.`name`, "label" : (tv.`description`.`fr` || tv.`description`.`en`) }   /* simple expression */
 230   SubqueryEndNode         1       1       0.00000                 - RETURN  #193 ) /* subquery end */
 181   CalculationNode         1       1       0.00000             - LET #195 = { "value" : #72[0] }   /* simple expression */
 228   SubqueryEndNode         1       1       0.00000             - RETURN  #195 ) /* subquery end */
 217   SubqueryStartNode       1       2       0.00000       - LET obs_votes = ( /* subquery begin */
 200   IndexNode               1       4       0.00018         - FOR v IN votes   /* persistent index scan */
 225   SubqueryStartNode       1       7       0.00001           - LET #47 = ( /* subquery begin */
 204   IndexNode               2       7       0.00010             - FOR u IN users   /* primary index scan, projections: `email` */
 191   LimitNode               2       7       0.00001               - LIMIT 0, 1
 118   CalculationNode         2       7       0.00001               - LET #151 = { "email" : u.`email` }   /* simple expression */   /* collections used: u : users */
 226   SubqueryEndNode         1       4       0.00005               - RETURN  #151 ) /* subquery end */
 219   SubqueryStartNode       1       7       0.00001           - LET #43 = ( /* subquery begin */
 201   IndexNode               1       5       0.00041             - FOR t IN taxa   /* hash index scan */
  82   CalculationNode         1       5       0.00001               - LET #129 = t.`sources`   /* attribute expression */   /* collections used: t : taxa */
 223   SubqueryStartNode       1       6       0.00020               - LET #36 = ( /* subquery begin */
  83   EnumerateListNode       1      42       0.00005                 - FOR s IN #129   /* list iteration */
 203   IndexNode               1      43       0.00161                   - FOR p IN projects   /* hash index scan, projections: `_key`, `_pn_key`, `roles` */
  85   CalculationNode         1      43       0.00003                     - LET #131 = ((p.`_pn_key` == s) && ((LENGTH(p.`roles`) == 0) || (LENGTH(p.`roles`[* FILTER false RETURN  #32_]) > 0)))   /* simple expression */   /* collections used: p : projects */
  86   FilterNode              1      41       0.00002                     - FILTER #131
  90   CalculationNode         1      41       0.00001                     - LET order = ((p.`_key` == "guyane") ? 0 : 1)   /* simple expression */   /* collections used: p : projects */
  91   SortNode                1       6       0.00002                     - SORT order ASC   /* sorting strategy: constrained heap */
  92   LimitNode               1       6       0.00001                     - LIMIT 0, 1
 192   LimitNode               1       6       0.00001                     - LIMIT 0, 1
  93   CalculationNode         1       6       0.00001                     - LET #135 = p.`_key`   /* attribute expression */   /* collections used: p : projects */
 224   SubqueryEndNode         1       5       0.00001                     - RETURN  #135 ) /* subquery end */
 221   SubqueryStartNode       1       6       0.00021               - LET #41 = ( /* subquery begin */
 202   IndexNode               1     102       0.00087                 - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
 102   CalculationNode         1     102       0.00003                   - LET #141 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
 103   CollectNode             1      15       0.00003                   - COLLECT term = #141 AGGREGATE c = LENGTH()   /* hash */
 104   CalculationNode         1      15       0.00001                   - LET #143 = (c > 1)   /* simple expression */
 105   FilterNode              1      13       0.00001                   - FILTER #143
 106   SortNode                1      13       0.00001                   - SORT c DESC   /* sorting strategy: standard */
 107   CalculationNode         1      13       0.00001                   - LET #145 = { "term" : term, "c" : c }   /* simple expression */
 222   SubqueryEndNode         1       5       0.00001                   - RETURN  #145 ) /* subquery end */
 110   CalculationNode         1       5       0.00001               - LET #147 = { "species" : { "project" : #36[0] }, "users_common_names" : #41 }   /* simple expression */
 220   SubqueryEndNode         1       4       0.00001               - RETURN  #147 ) /* subquery end */
 121   CalculationNode         1       4       0.00002           - LET #153 = { "obs_id" : v.`observation_id`, "img_id" : v.`image_id`, "user_id" : v.`user_id`, "user" : #47[0], "type" : v.`type`, "val" : v.`value`, "sp" : ((v.`type` == "determination") ? #43 : null)[0] }   /* simple expression */   /* collections used: v : votes */
 218   SubqueryEndNode         1       1       0.00001           - RETURN  #153 ) /* subquery end */
 213   SubqueryStartNode       1       2       0.00001       - LET #20 = ( /* subquery begin */
 198   IndexNode               1       1       0.00012         - FOR t IN taxa   /* hash index scan */    FILTER ("bdtgf_jfm_sync_v1" IN t.`sources`)   /* early pruning */
 215   SubqueryStartNode       1       1       0.00001           - LET #18 = ( /* subquery begin */
 199   IndexNode               1       1       0.00005             - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
  52   CalculationNode         1       1       0.00000               - LET #113 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
  53   CollectNode             1       1       0.00001               - COLLECT term = #113 AGGREGATE c = LENGTH()   /* hash */
  54   CalculationNode         1       1       0.00001               - LET #115 = (c > 1)   /* simple expression */
  55   FilterNode              1       1       0.00000               - FILTER #115
  56   SortNode                1       1       0.00001               - SORT c DESC   /* sorting strategy: standard */
  57   CalculationNode         1       1       0.00000               - LET #117 = { "term" : term, "c" : c }   /* simple expression */
 216   SubqueryEndNode         1       1       0.00000               - RETURN  #117 ) /* subquery end */
  40   CalculationNode         1       1       0.00000           - LET #103 = t.`species_list`   /* attribute expression */   /* collections used: t : taxa */
  60   CalculationNode         1       1       0.00000           - LET #119 = { "users_common_names" : #18 }   /* simple expression */
  41   EnumerateListNode       1       1       0.00005           - FOR sp IN #103   /* list iteration */
  42   CalculationNode         1       1       0.00000             - LET #105 = ((sp.`nameAccordingTo` == "bdtgf_jfm_sync_v1") && (o.`computed`.`current_name` IN sp.`synonyms`))   /* simple expression */   /* collections used: o : observations */
  43   FilterNode              1       1       0.00000             - FILTER #105
 214   SubqueryEndNode         1       1       0.00000             - RETURN  #119 ) /* subquery end */
 209   SubqueryStartNode       1       2       0.00001       - LET taxo = ( /* subquery begin */
 196   IndexNode               1       1       0.00010         - FOR t IN taxa   /* hash index scan */    FILTER ("bdtgf_jfm_sync_v1" IN t.`sources`)   /* early pruning */
 211   SubqueryStartNode       1       1       0.00000           - LET #8 = ( /* subquery begin */
 197   IndexNode               1       1       0.00006             - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
  23   CalculationNode         1       1       0.00000               - LET #91 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
  24   CollectNode             1       1       0.00001               - COLLECT term = #91 AGGREGATE c = LENGTH()   /* hash */
  25   CalculationNode         1       1       0.00000               - LET #93 = (c > 1)   /* simple expression */
  26   FilterNode              1       1       0.00000               - FILTER #93
  27   SortNode                1       1       0.00001               - SORT c DESC   /* sorting strategy: standard */
  28   CalculationNode         1       1       0.00000               - LET #95 = { "term" : term, "c" : c }   /* simple expression */
 212   SubqueryEndNode         1       1       0.00000               - RETURN  #95 ) /* subquery end */
  13   CalculationNode         1       1       0.00000           - LET #83 = t.`species_list`   /* attribute expression */   /* collections used: t : taxa */
  31   CalculationNode         1       1       0.00000           - LET #97 = { "users_common_names" : #8 }   /* simple expression */
  14   EnumerateListNode       1       1       0.00007           - FOR sp IN #83   /* list iteration */
  15   CalculationNode         1       1       0.00000             - LET #85 = (sp.`nameAccordingTo` == "bdtgf_jfm_sync_v1")   /* simple expression */
  16   FilterNode              1       1       0.00001             - FILTER #85
 210   SubqueryEndNode         1       1       0.00001             - RETURN  #97 ) /* subquery end */
  63   CalculationNode         1       1       0.00000       - LET syno = (LENGTH(taxo) ? [ ] : #20)   /* simple expression */
  64   CalculationNode         1       1       0.00001       - LET taxodata = (LENGTH(taxo) ? taxo[0] : syno[0])   /* simple expression */
 184   CalculationNode         1       1       0.00001       - LET #197 = { "taxo" : taxodata, "votes" : obs_votes, "partners_votes" : partners_votes, "obs_tags" : obs_tags }   /* simple expression */
 185   ReturnNode              1       1       0.00001       - RETURN #197

Indexes used:
  By   Name                      Type         Collection     Unique   Sparse   Selectivity   Fields                                                       Ranges
 195   primary                   primary      observations   true     false       100.00 %   [ `_key` ]                                                   (o.`_key` == "1003316854")
 206   idx_10219655942           hash         taxa           true     false       100.00 %   [ `name` ]                                                   (t.`name` == v.`name`)
 208   idx_49132                 hash         projects       false    false        97.06 %   [ `_pn_key` ]                                                (p.`_pn_key` == s)
 207   idx_10856933578           hash         vernaculars    false    false        46.39 %   [ `species`, `lang` ]                                        ((ve.`species` == t.`name`) && (ve.`lang` == "fr"))
 205   idx_1722945121587036160   persistent   tags_catalog   true     false       100.00 %   [ `name` ]                                                   (tc.`name` == tag.`name`)
 200   idx_1723108440400723968   persistent   votes          true     false       100.00 %   [ `observation_id`, `user_id`, `image_id`, `type`, `tag` ]   (v.`observation_id` == "1003316854")
 204   primary                   primary      users          true     false       100.00 %   [ `_key` ]                                                   (u.`_key` == v.`user_id`)
 201   idx_10219655942           hash         taxa           true     false       100.00 %   [ `name` ]                                                   (t.`name` == v.`value`)
 203   idx_49132                 hash         projects       false    false        97.06 %   [ `_pn_key` ]                                                (p.`_pn_key` == s)
 203   idx_49132                 hash         projects       false    false        97.06 %   [ `_pn_key` ]                                                (p.`_pn_key` == s)
 202   idx_10856933578           hash         vernaculars    false    false        46.39 %   [ `species`, `lang` ]                                        ((ve.`species` == t.`name`) && (ve.`lang` == "fr"))
 198   idx_49216                 hash         taxa           false    false       100.00 %   [ `synonyms[*]` ]                                            (o.`computed`.`current_name` IN t.`synonyms`)
 199   idx_10856933578           hash         vernaculars    false    false        46.39 %   [ `species`, `lang` ]                                        ((ve.`species` == t.`name`) && (ve.`lang` == "fr"))
 196   idx_10219655942           hash         taxa           true     false       100.00 %   [ `name` ]                                                   (t.`name` == o.`computed`.`current_name`)
 197   idx_10856933578           hash         vernaculars    false    false        46.39 %   [ `species`, `lang` ]                                        ((ve.`species` == t.`name`) && (ve.`lang` == "fr"))

Optimization rules applied:
 Id   RuleName
  1   move-calculations-up
  2   move-filters-up
  3   remove-redundant-calculations
  4   remove-unnecessary-calculations
  5   remove-redundant-sorts
  6   optimize-subqueries
  7   move-calculations-up-2
  8   move-filters-up-2
  9   propagate-constant-attributes
 10   use-indexes
 11   remove-filter-covered-by-index
 12   remove-unnecessary-calculations-2
 13   move-calculations-down
 14   fuse-filters
 15   sort-limit
 16   reduce-extraction-to-projection
 17   move-filters-into-enumerate
 18   splice-subqueries

Query Statistics:
 Writes Exec   Writes Ign   Scan Full   Scan Index   Filtered   Peak Mem [b]   Exec Time [s]
           0            0           0          243          7       19365888         0.51132

Query Profile:
 Query Stage           Duration [s]
 initializing               0.00000
 parsing                    0.00035
 optimizing ast             0.00005
 loading collections        0.00002
 instantiating plan         0.00045
 optimizing plan            0.50284
 executing                  0.00760
 finalizing                 0.00017

you can use i.e. index hints if you didn't already?

@matcho : the number of execution plans can be limited globally by adjusting the server startup option --query.optimizer-max-plans. That startup option defaults to 128, which means that the optimizer is allowed to generated up to 128 query execution plans for each AQL query.
Adjusting the value of this option will affect all AQL queries.
Then there is also the option to override the maximum number of plans per query.
This can be done by passing the maxNumberOfPlans attribute when executing the query. In the arangosh, it would look like this (https://docs.arangodb.com/3.11/aql/how-to-invoke-aql/with-arangosh/#maxnumberofplans):
maxNumberOfPlans = 64; /* whatever value */
db._query(query, bindVars, { maxNumberOfPlans });

The option can also be passed via the HTTP API (https://docs.arangodb.com/3.11/develop/http-api/queries/aql-queries/#create-a-cursor_body_options_maxNumberOfPlans).
Potentially this option is also supported by client drivers, but I don't know which one is in use.
While adjusting the maximum number of plans option will at least lead to less plans being generated, the question remains why the optimizer creates that many plans in the first place.
The plan explosion must be caused by one or many of the applied optimizer rules
  1   move-calculations-up
  2   move-filters-up
  3   remove-redundant-calculations
  4   remove-unnecessary-calculations
  5   remove-redundant-sorts
  6   optimize-subqueries
  7   move-calculations-up-2
  8   move-filters-up-2
  9   propagate-constant-attributes
 10   use-indexes
 11   remove-filter-covered-by-index
 12   remove-unnecessary-calculations-2
 13   move-calculations-down
 14   fuse-filters
 15   sort-limit
 16   reduce-extraction-to-projection
 17   move-filters-into-enumerate
 18   splice-subqueries

Would be interesting to know which one it is, because maybe it can be tuned to generate less plans.
If you want to investigate, you can run the query with specific optimizer rules turned off, just to check if the number of plans goes down then.
With the arangosh, the way to do this would be:
ruleName = "fuse-filters"; /* whatever rule to exclude */
db._explain(query, bindVars, { optimizer: { rules: ["-" + ruleName] } });

Running that will explain the query with the specific rule turned off. It turning off any of the rules leads to substantially fewer plans being generated, then this is a good indicator. Note that turned off some of the rules will still be unwanted, e.g. "use-indexes". While turning off that rule may lead to fewer execution plans, it may also mean that indexes will be used in fewer cases, which can have detrimental effcets on the query runtime later.
So I suggest to turn off optimizer rules only for finding out which rules lead to the plan explosion.

@dothebart do you mean that unsing indexHints could help the optimizer generate less plans? I tried to add an indexHint to every collection in the query, but the execution time did not change. Also tried adding forceIndexHint and it changes nothing. By the way, the indexHint was refused for 2 collections in the query (projects line 62 and tags_catalog  line 139), although when running explain it clearly shows that those 2 indexes will be used anyway… strange.

@matcho : I remember there were issues with index hints in some specific situations, which were fixed a while ago. I guess if you are running the queries on ArangoDB version 3.8, that the issues are still present. If the index hint issues still remain in recent versions of ArangoDB, they should be reported so we can fix them.
I think at least in theory an index hint could lead to the optimizer producing less plans, for example if multiple indexes could be used to execute the query, and the optimizer creates different plans for each candidate index.
I say "in theory" here because I don't know from the top of my head if this is what is actually happening. I think at least in some cases the optimizer will pick the index it finds most appropriate, and then goes ahead with it, without creating additional plans for other indexes. But this may be different in different optimizer rules.
It may also be that a different optimizer rules creates the additional plans here. That is not necessarily related to indexes and thus index hints.

@jsteemann
First, limiting the number of plans indeed works:
db._query(q1, {}, { maxNumberOfPlans: 64 }) → 297ms
db._query(q1, {}, { maxNumberOfPlans: 32 }) → 123ms
db._query(q1, {}, { maxNumberOfPlans: 16 }) → 88ms
db._query(q1, {}, { maxNumberOfPlans: 1 }) → 20ms
Query result is valid in all cases above, even with 1 plan max.
Second, after investigating as you suggested, it appears that the rule that leads to a huge number of plans is interchange-adjacent-enumerations (found it in "Optimization rules with highest execution times" section of explain output). After disabling it, number of plans drops to 16 and query execution time to 70ms (explain below).
From the documentation :

interchange-adjacent-enumerations: Try out permutations of FOR statements in queries that contain multiple loops, which may enable further optimizations by other rules.

Makes sense that a higher number of loops leads to an exploding combination of permutations.
This is great  :partying_face: thank you very much !
Do you think that disabling interchange-adjacent-enumerations server-wide could have a negative impact on certain queries ?
PS: indexHint issue is still present in 3.11.4, will try to report it properly soon.
<IP_ADDRESS>:8529@plantnetv2> db._explain(q1, {}, { optimizer: { rules: [ "-interchange-adjacent-enumerations" ] } });
Query String (2797 chars, cacheable: true):
 LET project_pn_key = 'bdtgf_jfm_sync_v1' LET r = [] FOR o IN observations FILTER o._key ==
 '1003316854' LET taxo = ( FOR t IN taxa FILTER t.name == o.computed.current_name FILTER
 project_pn_key IN t.sources FOR sp IN t.species_list FILTER sp.nameAccordingTo == project_pn_key
 RETURN { users_common_names: ( for ve in vernaculars filter ve.species == t.name filter ve.lang ==
 'fr' collect term = ve.term with count into c filter c > 1 sort c desc return {term, c} ) } ) LET
 syno = (LENGTH(taxo)) ? [] : ( FOR t in taxa FILTER o.computed.current_name IN t.synonyms FILTER
 project_pn_key IN t.sources FOR sp IN t.species_list FILTER sp.nameAccordingTo == project_pn_key
 FILTER o.computed.current_name IN sp.synonyms RETURN { users_common_names: ( for ve in vernaculars
 filter ve.species == t.name filter ve.lang == 'fr' collect term = ve.term with count into c filter c
 > 1 sort c desc return {term, c} ) } ) LET taxodata = (LENGTH(taxo) ? taxo[0] : syno[0]) LET
 obs_votes = ( FOR v IN votes FILTER v.observ...

Execution plan:
  Id   NodeType                 Est.   Comment
   1   SingletonNode               1   * ROOT
 195   IndexNode                   1     - FOR o IN observations   /* primary index scan */
 125   CalculationNode             1       - LET #155 = o.`computed`.`votes`   /* attribute expression */   /* collections used: o : observations */
 231   SubqueryStartNode           1       - LET partners_votes = ( /* subquery begin */
 126   EnumerateListNode         100         - FOR v IN #155   /* list iteration */
 233   SubqueryStartNode         100           - LET sp = ( /* subquery begin */
 206   IndexNode                 100             - FOR t IN taxa   /* hash index scan */
 191   LimitNode                   1               - LIMIT 0, 1
 132   CalculationNode             1               - LET #159 = t.`sources`   /* attribute expression */   /* collections used: t : taxa */
 237   SubqueryStartNode           1               - LET #56 = ( /* subquery begin */
 133   EnumerateListNode         100                 - FOR s IN #159   /* list iteration */
 208   IndexNode                 100                   - FOR p IN projects   /* hash index scan, projections: `_key` */
 137   LimitNode                   1                     - LIMIT 0, 1
 190   LimitNode                   1                     - LIMIT 0, 1
 138   CalculationNode             1                     - LET #163 = p.`_key`   /* attribute expression */   /* collections used: p : projects */
 238   SubqueryEndNode             1                     - RETURN  #163 ) /* subquery end */
 235   SubqueryStartNode           1               - LET #61 = ( /* subquery begin */
 207   IndexNode                   2                 - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
 147   CalculationNode             2                   - LET #169 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
 148   CollectNode                 2                   - COLLECT term = #169 AGGREGATE c = LENGTH()   /* hash */
 149   CalculationNode             2                   - LET #171 = (c > 1)   /* simple expression */
 150   FilterNode                  2                   - FILTER #171
 151   SortNode                    2                   - SORT c DESC   /* sorting strategy: standard */
 152   CalculationNode             2                   - LET #173 = { "term" : term, "c" : c }   /* simple expression */
 236   SubqueryEndNode             1                   - RETURN  #173 ) /* subquery end */
 155   CalculationNode             1               - LET #175 = { "species" : { "project" : #56[0] }, "users_common_names" : #61 }   /* simple expression */
 234   SubqueryEndNode           100               - RETURN  #175 ) /* subquery end */
 158   CalculationNode           100           - LET #177 = { "obs_id" : o.`_key`, "val" : v.`name`, "sp" : sp[0], "plus" : v.`plus` }   /* simple expression */   /* collections used: o : observations */
 232   SubqueryEndNode             1           - RETURN  #177 ) /* subquery end */
 162   CalculationNode             1       - LET #179 = o.`computed`.`tags`   /* attribute expression */   /* collections used: o : observations */
 227   SubqueryStartNode           1       - LET obs_tags = ( /* subquery begin */
 163   EnumerateListNode         100         - FOR tag IN #179   /* list iteration */
 205   IndexNode                 100           - FOR tc IN tags_catalog   /* persistent index scan, projections: `public_display`, `target`, `values` */    FILTER ((tc.`target` == "observation") && (tc.`public_display` == true))   /* early pruning */
 172   CalculationNode           100             - LET #187 = tc.`values`   /* attribute expression */   /* collections used: tc : tags_catalog */
 229   SubqueryStartNode         100             - LET #72 = ( /* subquery begin */
 173   FilterNode                100               - FILTER #187
 175   EnumerateListNode       10000               - FOR tv IN #187   /* list iteration */
 176   CalculationNode         10000                 - LET #191 = (tv.`name` == tag.`value`)   /* simple expression */
 177   FilterNode              10000                 - FILTER #191
 192   LimitNode                   1                 - LIMIT 0, 1
 178   CalculationNode             1                 - LET #193 = { "key" : tv.`name`, "label" : (tv.`description`.`fr` || tv.`description`.`en`) }   /* simple expression */
 230   SubqueryEndNode           100                 - RETURN  #193 ) /* subquery end */
 181   CalculationNode           100             - LET #195 = { "value" : #72[0] }   /* simple expression */
 228   SubqueryEndNode             1             - RETURN  #195 ) /* subquery end */
 217   SubqueryStartNode           1       - LET obs_votes = ( /* subquery begin */
 200   IndexNode             4291240         - FOR v IN votes   /* persistent index scan */
 225   SubqueryStartNode     4291240           - LET #47 = ( /* subquery begin */
 204   IndexNode             4291240             - FOR u IN users   /* primary index scan, projections: `email` */
 193   LimitNode                   1               - LIMIT 0, 1
 118   CalculationNode             1               - LET #151 = { "email" : u.`email` }   /* simple expression */   /* collections used: u : users */
 226   SubqueryEndNode       4291240               - RETURN  #151 ) /* subquery end */
 219   SubqueryStartNode     4291240           - LET #43 = ( /* subquery begin */
 201   IndexNode             4291240             - FOR t IN taxa   /* hash index scan */
  82   CalculationNode       4291240               - LET #129 = t.`sources`   /* attribute expression */   /* collections used: t : taxa */
 223   SubqueryStartNode     4291240               - LET #36 = ( /* subquery begin */
  83   EnumerateListNode   429124000                 - FOR s IN #129   /* list iteration */
 203   IndexNode           858248000                   - FOR p IN projects   /* hash index scan, projections: `_key`, `_pn_key`, `roles` */
  85   CalculationNode     858248000                     - LET #131 = ((p.`_pn_key` == s) && ((LENGTH(p.`roles`) == 0) || (LENGTH(p.`roles`[* FILTER false RETURN  #32_]) > 0)))   /* simple expression */   /* collections used: p : projects */
  86   FilterNode          858248000                     - FILTER #131
  90   CalculationNode     858248000                     - LET order = ((p.`_key` == "guyane") ? 0 : 1)   /* simple expression */   /* collections used: p : projects */
  91   SortNode            858248000                     - SORT order ASC   /* sorting strategy: constrained heap */
  92   LimitNode                   1                     - LIMIT 0, 1
 194   LimitNode                   1                     - LIMIT 0, 1
  93   CalculationNode             1                     - LET #135 = p.`_key`   /* attribute expression */   /* collections used: p : projects */
 224   SubqueryEndNode       4291240                     - RETURN  #135 ) /* subquery end */
 221   SubqueryStartNode     4291240               - LET #41 = ( /* subquery begin */
 202   IndexNode             8582480                 - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
 102   CalculationNode       8582480                   - LET #141 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
 103   CollectNode           6865984                   - COLLECT term = #141 AGGREGATE c = LENGTH()   /* hash */
 104   CalculationNode       6865984                   - LET #143 = (c > 1)   /* simple expression */
 105   FilterNode            6865984                   - FILTER #143
 106   SortNode              6865984                   - SORT c DESC   /* sorting strategy: standard */
 107   CalculationNode       6865984                   - LET #145 = { "term" : term, "c" : c }   /* simple expression */
 222   SubqueryEndNode       4291240                   - RETURN  #145 ) /* subquery end */
 110   CalculationNode       4291240               - LET #147 = { "species" : { "project" : #36[0] }, "users_common_names" : #41 }   /* simple expression */
 220   SubqueryEndNode       4291240               - RETURN  #147 ) /* subquery end */
 121   CalculationNode       4291240           - LET #153 = { "obs_id" : v.`observation_id`, "img_id" : v.`image_id`, "user_id" : v.`user_id`, "user" : #47[0], "type" : v.`type`, "val" : v.`value`, "sp" : ((v.`type` == "determination") ? #43 : null)[0] }   /* simple expression */   /* collections used: v : votes */
 218   SubqueryEndNode             1           - RETURN  #153 ) /* subquery end */
 213   SubqueryStartNode           1       - LET #20 = ( /* subquery begin */
 198   IndexNode                   1         - FOR t IN taxa   /* hash index scan */    FILTER ("bdtgf_jfm_sync_v1" IN t.`sources`)   /* early pruning */
 215   SubqueryStartNode           1           - LET #18 = ( /* subquery begin */
 199   IndexNode                   2             - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
  52   CalculationNode             2               - LET #113 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
  53   CollectNode                 2               - COLLECT term = #113 AGGREGATE c = LENGTH()   /* hash */
  54   CalculationNode             2               - LET #115 = (c > 1)   /* simple expression */
  55   FilterNode                  2               - FILTER #115
  56   SortNode                    2               - SORT c DESC   /* sorting strategy: standard */
  57   CalculationNode             2               - LET #117 = { "term" : term, "c" : c }   /* simple expression */
 216   SubqueryEndNode             1               - RETURN  #117 ) /* subquery end */
  40   CalculationNode             1           - LET #103 = t.`species_list`   /* attribute expression */   /* collections used: t : taxa */
  60   CalculationNode             1           - LET #119 = { "users_common_names" : #18 }   /* simple expression */
  41   EnumerateListNode         100           - FOR sp IN #103   /* list iteration */
  42   CalculationNode           100             - LET #105 = ((sp.`nameAccordingTo` == "bdtgf_jfm_sync_v1") && (o.`computed`.`current_name` IN sp.`synonyms`))   /* simple expression */   /* collections used: o : observations */
  43   FilterNode                100             - FILTER #105
 214   SubqueryEndNode             1             - RETURN  #119 ) /* subquery end */
 209   SubqueryStartNode           1       - LET taxo = ( /* subquery begin */
 196   IndexNode                   1         - FOR t IN taxa   /* hash index scan */    FILTER ("bdtgf_jfm_sync_v1" IN t.`sources`)   /* early pruning */
 211   SubqueryStartNode           1           - LET #8 = ( /* subquery begin */
 197   IndexNode                   2             - FOR ve IN vernaculars   /* hash index scan, projections: `term` */
  23   CalculationNode             2               - LET #91 = ve.`term`   /* attribute expression */   /* collections used: ve : vernaculars */
  24   CollectNode                 2               - COLLECT term = #91 AGGREGATE c = LENGTH()   /* hash */
  25   CalculationNode             2               - LET #93 = (c > 1)   /* simple expression */
  26   FilterNode                  2               - FILTER #93
  27   SortNode                    2               - SORT c DESC   /* sorting strategy: standard */
  28   CalculationNode             2               - LET #95 = { "term" : term, "c" : c }   /* simple expression */
 212   SubqueryEndNode             1               - RETURN  #95 ) /* subquery end */
  13   CalculationNode             1           - LET #83 = t.`species_list`   /* attribute expression */   /* collections used: t : taxa */
  31   CalculationNode             1           - LET #97 = { "users_common_names" : #8 }   /* simple expression */
  14   EnumerateListNode         100           - FOR sp IN #83   /* list iteration */
  15   CalculationNode           100             - LET #85 = (sp.`nameAccordingTo` == "bdtgf_jfm_sync_v1")   /* simple expression */
  16   FilterNode                100             - FILTER #85
 210   SubqueryEndNode             1             - RETURN  #97 ) /* subquery end */
  63   CalculationNode             1       - LET syno = (LENGTH(taxo) ?
I also checked our code and found that there are just 2 optimizer rules which will create additional plans: the one you mentioned and another one that can modify COLLECT statements (specialize-collect). The latter rule doesn't apply here.
I don't think that disabling the interchange-adjacent-enumerations optimizer rule globally is good, although it may help to limit the optimizer runtime of complex queries. There are at least some cases in which the rule can do good and can lead to better execution plans, although it is not guaranteed that it does. However, if it helps your specific case and you don't see any negative side effects of disabling the rule, why not. But this is not really future proof in case new queries are added or existing ones are changed. These may benefit from the optimizer rule running.
Maybe it would be a good idea to introduce additional limits or heuristics for plan creation. I need to look into it in more detail first though.

For info, I created a PR that can reduce the number of plans generated by the optimizer rule "interchange-adjacent-enumerations" in some cases:
https://github.com/arangodb/arangodb/pull/20201
For the example query provided in this issue, the change would reduce the number of generated plans from 128 to 32. That should make plan optimization considerably faster than it is right now for such types of queries.
Maybe even more can be achieved by adjusting the optimizer even further. Will need to check.

As we don't want to change the defaults or behavior for the 3.11 stable branch too much, we will go ahead with the above change (https://github.com/arangodb/arangodb/pull/20201) only from 3.12 onwards. That change should reduce the number of query execution plans for this particular case and a few others.
Until then, it is still possible to adjust the maximum number of plans the optimizer generates, either by setting the per-query option (maxPlans) or by adjusting it globally via the startup option --query.optimizer-max-plans. There is also the option to turn off the optimizer rule "interchange-adjacent-enumerations" for certains queries or globally.
Though I won't recommend doing either of these things without testing the effects on query runtimes first.

Hi. We can confirm that running this query on v3.12.0 leads to 32 plans instead of 128 which is a great improvement :+1:
This is still too many in our case and prevents this query to run with maximum performance, so we'll go on with optimizer: { rules: ['-interchange-adjacent-enumerations'] } but that's OK.
Thank you!


Post release automated changes for monitor releases

Post release automated changes for azure-arm-monitor

API change check
API changes are not detected in this pull request.


How to line two lines?

Multi-line charts are a priority for getting out of beta. I don't have an ETA at this time but probably in the next week or two.


Question about Differentiable OCR-Guided Finetuning in the paper

This paper is really excellent! But I have a small question
It is the first time I see someone think of CTC loss to make the model recover more accurate characters. However, in this paper, only Figure 6 and Table 4 have a slight reference to this. Is there only CER metrics in Table 4 because this loss may affect the results of PSNR of the model？
Because the input of the model is 128*128 resolution patch instead of the whole image, I think this may also lead to some words or letters being cut off, which may lead to false recognition and affect the training.

Our work is also based on https://arxiv.org/abs/2105.07983.
Experimental results showed that CTC Loss helps the performance of a commercial OCR in the character recognition task.
We noticed that such loss function introduces small artifacts in images in a few samples. This is reflected slightly on some pixel-level metrics (PSNR mainly). However, what we think is that such loss drives the model not to produce visually excellent images but rather better images for ocr, improving its recognition accuracy (slightly).
For completeness, we leave the full table that we did not include in the paper.
Thank you for your comment.

| PSNR | SSIM | LPIPS | DISTS | CER
-- | -- | -- | -- | -- | --
NAF-DPM w/o finetuning | 34,377 | 0.9944 | 0.004668 | 0.022891 | 1.55
NAF-DPM w finetuning | 34,066 | 0.9956 | 0.003934 | 0.013801 | 1.40

Thank you very much for your answer！


Fix spelling

Codecov Report

Merging #186 (8814cdb) into main (8719ca9) will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##             main     #186   +/-   ##
=======================================
  Coverage   94.89%   94.89%
=======================================
  Files          26       26
  Lines        4666     4666
=======================================
  Hits         4428     4428
  Misses        238      238

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 8719ca9...8814cdb. Read the comment docs.


Code splitting problem in 1.0.0-beta2

I use server side rendering with fluxible and react router.
I have some routes with code splitting like the following
exports.SearchResultPage = {
    path: '/search/:searchQuery',

    getComponents(cb) {
        require.ensure([], (require) => {
            cb(null, {
                navigationBar: require('./components/ReaderNavigationBar/ReaderNavigationBar'),
                content: require('./pages/SearchResultPage')
            });
        });
    }
};

As soon as I go to a route with code splitting in place I get the following warning in the browser
Warning: React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server:
 (client) <noscript data-reacti
 (server) <div class="c-app" da

React checks the server side generated markup against the following markup and says it can not be reused because it's differrent.

I am currently fighting this battle and I think it's related to the async patterns for loading components and routes.
What I think happens is that one of the async loops completes, presenting the routes to the Router but with null in place of components (as they are yet to fully load async). React then attempts to render, triggering it's EmptyComponent injection - a noscript element.
I've not worked out how to mitigate this problem yet, I would assume it will require some addtional async control flow to ensure that both getComponents and getChildRoutes are fully resolved before rendering

Just to add to this, the following is the console output when I was debugging the issue. It's exactly as I described above, the Router is mounted and starts the async process of resolving routes and getting the components for the route branch, however, this does not complete before an initial render of the router (which does not have components). I think this is where the noscript is output.
Then the async process of getting components returns, calling the callback passed to runTransition which ultimately causes another two render passes. The first of which should match the initial checksum from the server side render.
I guess the issue here is how to cancel the first render of the Router until the components are returned from getComponents
Router.js:264 - component will mount in router, update state using location
Router.js:151 - _updateState called
Router.js:69 - runTransition: transitionHooks completed
Router.js:73 - runTransition: getComponents
Router.js:266 - continuing to mount router
Router.js:313 - render router
Router.js:314 - router: transitioning - true
Router.js:343 - render does not have components
warning.js:48 - Warning: React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server:
 (client) <noscript data-reacti
 (server) <div data-reactid=".1
Router.js:78 - runtransition: getComponents returned
Router.js:80 - runtransition: call callback with nextState and transition
Router.js:164 - runTransition callback
Router.js:187 - runTransition callback: setState
Router.js:313 - render router
Router.js:314 - router: transitioning - true
Router.js:317 - render has components
Router.js:191 - runTransition callback: isTransitioning: false
Router.js:313 - render router
Router.js:314 - router: transitioning - false
Router.js:317 - render has components

After some further conversations on this in the React thread I've managed to workaround this issue. The key is to setup the routes ahead of the first render so I've essentially run the server-side rendering code again but then rendered the client-side version:
const history = new BrowserHistory();

if (typeof history.setup === "function") {
    history.setup();
}

Router.run(routes, history.location, (err, initialState, transition) => {
    React.render(<Provider redux={redux}>{() => <Router key="ta-app" history={history} children={routes} />}</Provider>, document.getElementById('ta-app'));
});

This appears to be working for me.

:+1:
You're the best.
I've tested it and it works.
Thanks very much for the Investigation!

thank you @anatomic. After few tries, I can't catch the point...
I think my client code is very close to yours (mine over Fluxible and yours over Redux)... however, the warning is still here... and React trigger the render again...
var history = new BrowserHistory();

if (typeof history.setup === "function") {
    history.setup();
}

var dehydratedState = window.App;
window.React = React;

app.rehydrate(dehydratedState, function (err, context) {
    if (err) {
        throw err;
    }
    window.context = context;
    var routes = app.getComponent();

    Router.run(routes, history, (err, initialState, transition) => {

	    React.render(
	        React.createElement(
	            FluxibleComponent,
	            { context: context.getComponentContext() },
	            <Router children={routes}  history={history} />
	        ),
	        document.getElementById('app'),
	        function () {
	            debug('React Rendered');
	        }
	    );

    });

});

Doing this causes the runTransition to happen twice. @anatomic or @heebtob Can you try out my PR here https://github.com/rackt/react-router/pull/1490 to see if you still get the odd behavior?
What this pr does is detect if the location object is actually a history object. Then extracts the location object, passing down the history object and routes object down with the initial state so Router run works client side.
Your code would then be reduced to:
const history = new BrowserHistory();

Router.run(routes, history, (err, initialState, transition) => {
    React.render(<Provider redux={redux}>{() => <Router key="ta-app" ...initialState />}</Provider>, document.getElementById('ta-app'));
});

this sounds like basic functionality that isn't working, so I'm closing since we're reworking the server rendering story a little bit right now, and we'll have tests around pretty basic functionality.

@ryanflorence Can you point me to the new server rendering stuff?

sorry for comment on a closed issue,
but I wish to know if this behaviour was solved on react-router v1.0.0
since I'm using it with react 0.14 and I'm having the same issue.
Regards.


Release 0.5.4 broke backward compatibility

Native scp tool and  Net::SCP gem are not 100% compatible.
For example they work with subdirectories in different ways.
In version 0.4 a command vagrant scp teamcity:/usr/local/teamcity/logs build/server-logs/ downloaded files right into server-logs/ directory.
Version 0.5 started creating a subdirectory, and put files into server-logs/logs/.
That change broke my build scripts, but that was fine - it was a feature release.
But version 0.5.4 turned the logic back, and my builds are broken again.
There is nothing to fix, and you can close this issue right away. But in future please do not introduce such changes in bugfix releases.

Sorry for the breakage, Michael. Unfortunately, whereas using Net::SCP is more elegant, it is considerably slower that scp. I'll stick with scp, and I'll make sure to use major releases.


How do I set up a Jupyter kernelspec for Xeus-SQL?

I want to try the Xeus-SQL kernel in my project's Mamba environment, but also use a centrally-installed Jupyter instance such as Jupyter Desktop.
However, I don't see any instructions for setting this up using jupyter kernelspec install or any other mechanism.
Is this a supported mode of operation? If so, what are the correct steps? Or if I need to set up the Kernel JSON manually, what should I put in it?

Thanks, but I'm a little confused by this advice.
I do not need or want Jupyter in my project environment. When I run jupyter kernelspec list using my system-wide Jupyter installation, I only see kernel specs that I have already installed.
I did install Jupyter in a test environment and I see that there is a kernelspec installed in <root>/share/jupyter/kernels/xsql. Is that location expected to be stable? If so, I can just hard-code it into my setup script, and maybe it can be documented as the standard location. I'm happy to make that change myself if I can figure out the docs contribution process.

I do not need or want Jupyter in my project environment. When I run jupyter kernelspec list using my system-wide Jupyter installation, I only see kernel specs that I have already installed.

jupyter kernelspec is provided by the jupyter_client package, which is not the jupyterlab server. You would need to install it in your project's mamba environment prior to running the commands mentionned in my previous comment, sorry for the omission.


Feat/batch market instructions

Transaction reciept view for batchMarketInstructions
Related to #481

Rendering a list of the same views as for each of the existing transactions.
All sections are closed to begin with
Numbered by order in the transaction
Does not render sections where no transacations are present e.g. stopOrdersCancellation in this view
Shows a warning message if there are no transactions within a batch market instruction currently

As per the slack thread, could we potentially consider some more friendly wording? I think the below is a little simpler. What do you think?
"Batch market instructions did not contain any transactions. Please view the raw transaction and check this is the transaction you wish to send"

As per the slack thread, could we potentially consider some more friendly wording? I think the below is a little simpler. What do you think?
"Batch market instructions did not contain any transactions. Please view the raw transaction and check this is the transaction you wish to send"

maybe if you want to avoid the repetition of the word transactions over and over you could say
"Batch market instructions did not contain any transactions. Please view the raw transaction and check this is what you want to send"

Also what did we think about this feedback? Also in the slack thread...
"I have a small request, can we expand/collapse the instructions? so 1,2,3 would be expand/collapsable. I do not know enough about these orders to know just how irritating it would be in the real world but even with three you have to scroll"
Idea being the list is totally expanded, but for larger transactions if a user wants to inspect it they can collapse sections as they go, this is more handy the larger this request is of course.

from a UX point of view I find it strange that the main heading for these is less prominent than the numbering. Should the headers also be plural when there are more? That feels like a small point but worth considering.
this part of the transaction in particular feels strange

mainly because I think the thing that should stand out most here is that it is a 'Stop order submission', but the heading is in the shadow of 'rises above' and the number 1, does that make sense? I am spitballing :D

this looks good now but there is a small test that I would quite like to have in there please, I will approve after that


fix: update alm-examples in CSV to reflect new sso structure

What type of PR is this?

Uncomment only one  /kind line, and delete the rest.
For example, > /kind bug would simply become: /kind bug

/kind bug

/kind cleanup
/kind failing-test
/kind enhancement
/kind documentation
/kind code-refactoring

What does this PR do / why we need it:
Updates CSV alm-examples with new SSO structure for dex, so that dex pod comes up after creation of new Argo CD instance
Have you updated the necessary documentation?

[ ] Documentation update is required by this PR.
[ ] Documentation has been updated.

Which issue(s) this PR fixes:
Fixes #?
How to test changes / Special notes to the reviewer:

@jaideepr97 please run make manifests generate bundle

Closing this PR since we agreed to move this feature out for now


[manila-csi-plugin] Helm chart backport push failed

We backported a fix for manila-csi Helm chart into v1.19 branch (PR https://github.com/kubernetes/cloud-provider-openstack/pull/1255), but git push failed. See https://github.com/kubernetes/cloud-provider-openstack/runs/1207267400?check_suite_focus=true
Run helm/chart-releaser-action@06d81fa7f63ab865cf0ed2045bde38529c392845
cloud-provider-openstack
Looking up latest tag...
Discovering changed charts since 'openstack-cinder-csi-1.2.2'...
Installing chart-releaser...
Packaging chart 'charts/manila-csi-plugin'...
Successfully packaged chart and saved it to: .cr-release-packages/openstack-manila-csi-1.0.0.tgz
Releasing charts...
+ cr index -o kubernetes -r cloud-provider-openstack -c https://kubernetes.github.io/cloud-provider-openstack
Updating charts repo index...
====> Using existing index at .cr-index/index.yaml
====> Found openstack-manila-csi-1.0.0.tgz
====> Extracting chart metadata from .cr-release-packages/openstack-manila-csi-1.0.0.tgz
====> Calculating Hash for .cr-release-packages/openstack-manila-csi-1.0.0.tgz
--> Updating index .cr-index/index.yaml
++ mktemp -d
+ gh_pages_worktree=/tmp/tmp.oR799YRwDL
+ git worktree add /tmp/tmp.oR799YRwDL gh-pages
Preparing worktree (new branch 'gh-pages')
Branch 'gh-pages' set up to track remote branch 'gh-pages' from 'origin'.
HEAD is now at 9c7b121 Update index.yaml
+ cp --force .cr-index/index.yaml /tmp/tmp.oR799YRwDL/index.yaml
+ pushd /tmp/tmp.oR799YRwDL
+ git add index.yaml
+ git commit '--message=Update index.yaml' --signoff
[gh-pages 8cf1ffa] Update index.yaml
 1 file changed, 14 insertions(+)
+ local repo_url=***github.com/kubernetes/cloud-provider-openstack
+ git push ***github.com/kubernetes/cloud-provider-openstack gh-pages
remote: error: GH006: Protected branch update failed for refs/heads/gh-pages.
remote: error: Required status check "cla/linuxfoundation" is expected.
To https://github.com/kubernetes/cloud-provider-openstack
 ! [remote rejected] gh-pages -> gh-pages (protected branch hook declined)
error: failed to push some refs to 'https://github.com/kubernetes/cloud-provider-openstack'

Is there anything we could do about this?
cc @brtknr @ramineni
/kind bug

@brtknr could you have a look at this ?

Hi, could you please generate another chart release with the last updates of manila-csi-plugin?, as @gman0 earlier mentioned, https://github.com/kubernetes/cloud-provider-openstack/actions/runs/288699273 failed. Thanks.

Hi, could you please generate another chart release with the last updates of manila-csi-plugin?, as @gman0 earlier mentioned, https://github.com/kubernetes/cloud-provider-openstack/actions/runs/288699273 failed. Thanks.

@isantospardo we do have latest release of plugin , https://github.com/kubernetes/cloud-provider-openstack/releases/tag/openstack-manila-csi-1.0.4 which is of 1.20 release which should include that fix.

@isantospardo we do have latest release of plugin , https://github.com/kubernetes/cloud-provider-openstack/releases/tag/openstack-manila-csi-1.0.4 which is of 1.20 release which should include that fix.


Moved cat "header" to stderr for easier piping

Fixes Issue #20 by moving the cat "header" to stderr instead of stdout to allow for piping.
Feel free to reject this if you think that a --quiet flag might be a better option.

Thanks @juan-riveros - this looks great! I think it's okay to move the header to stderr. The tests seem to be failing though, would you be able to take a look?

There that should do it. Had to change two tests since they assumed that the header existed in stdout. One assumed the output would be surrounded by newlines so just removed the newlines from the predicate and the other checked for filenames in stdout so changed it checking against stderr instead.

Awesome. Thanks a lot for contributing!


Fix all deprecation warning

Such as:
Instructions for updating:
Use tf.initializers.variance_scaling instead with distribution=uniform to get equivalent behavior.

@okuchaiev : I would like to start contributing to this project . can this issue be picked up at this stage of development ? Thanks.

Absolutely! Please work based on this branch: 18.09-dev


Bug Bounty: BDI Permission Checks

Critical Changes
Changes

Improved permission checking around deleting Data Import rows

Issues Closed
Community Ideas Delivered
New Metadata
Deleted Metadata
**lurch: attach W-039641

Tracking W-039641


Run update_crates only after patching

Should take care of the problems in https://github.com/paritytech/substrate/pull/11183
Please read the comments to understand why this fix should be proper

As showcased in https://gitlab.parity.io/parity/mirrors/substrate/-/jobs/1492206 (from https://github.com/paritytech/substrate/pull/11199), those changes made the script go past that point, so I suppose it's fixed


New version

Support of spring 2.0.
Refactor to following the spring boot starter style guide.

Codecov Report

Merging #19 into master will decrease coverage by 4.18%.
The diff coverage is n/a.

@@            Coverage Diff             @@
##           master      #19      +/-   ##
==========================================
- Coverage   89.65%   85.47%   -4.19%
==========================================
  Files           5        5
  Lines         116      117       +1
  Branches       41       41
==========================================
- Hits          104      100       -4
- Misses          1        3       +2
- Partials       11       14       +3

Impacted Files
Coverage Δ

...sioning/configuration/VersionRequestCondition.java
79.24% <ø> (ø)

...com/fintonic/versioning/domain/PathVersionMap.java
69.23% <ø> (ø)

...versioning/configuration/WebVersionAutoConfig.java
100% <ø> (ø)

...n/java/com/fintonic/versioning/domain/Version.java
96.15% <ø> (ø)

...a/com/fintonic/versioning/domain/VersionRange.java
95.23% <ø> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update cd3affa...2e3ec43. Read the comment docs.


Focus becomes trapped within iframe in GridListItem

Discussed in https://github.com/adobe/react-spectrum/discussions/4760

Originally posted by AlexGalays July 12, 2023
It doesn't seem possible as this hook uses getFocusableTreeWalker internally, which has a hardcoded list of focusable elements to cycle.
My use case: In my grid row cell, there is an iframe for read only but important purposes, so it can not be hidden. I want to skip it entirely and just go to the next item. Also currently, once the iframe has focus, it then eats all subsequent left/right arrow keyboard events, ending the navigation.
Being able to pass some accept(node: Element) => boolean function like in FocusManager might be nice?

To the team: we may want to revisit what elements should be considered focusable when using the left/right arrows to navigate through a GridListItem or a GridCell.


[draft] add d3-based auto-layout

This is an ongoing draft of adding d3-based auto-layout. There're still many details to be figured out.
An "auto-layout" button is added to the scope's toolbar. Once clicked, the pods inside the scope shall be auto-layouted. A global auto-layout button shall auto-layout the entire canvas.
Before auto-layout:

After auto-layout:

Known issues:

The layout position didn't consider the scope's position, thus the layout is not inside the scope.

This PR has three layout algorithms:

d3-force: this is not ideal, as the layout results are dependent on the original position of the nodes. Our layout engine should be purely functional w.r.t. the edge and parent relations among the pods.
d3-hierarchy: this does not support nodes with variable width and height.
d3-flextree: this should be the most promising one.

Details of how to use d3 to auto-layout our pods:

create a d3 compatible graph data structure from our nodes
call d3's auto-layout algorithm on the newly created data structure. We need to choose what kind of force to use
get the updated positions of the d3 data structure and set the corresponding reactflow node positions.

Related issues:
#204
#49
#176

merged #245


Added attach protocol field in volume attachment schema.

US60196: Added attach protocol field in volume attachment schema so that it can be used in decision making in host resources.

LGTM.

Hi @mchuang3, if you have no concerns shall I merge this PR?

Hi @mchuang3, if you have no concerns shall I merge this PR?

Looks good. Go for it. Thanks.


Update mapper.rb : merge defaults options

Merge defaults options instead of creating a new hash

Hi @voondo I just released a new version 1.4.0, I didn't use the exact code of the pull request because was not passing the tests but I fixed the problem you suggested in a very similar way.
Thanks for sharing.


MangaGezgini

Source name
Manga Gezgini Net
Source link
https://mangagezgini.net
Source language
turkish
Other details
No response
Acknowledgements

[X] I have checked that the extension does not already exist by searching the extension listing and verified it does not appear there.
[X] I have searched the existing issues and this is a new ticket, NOT a duplicate or related to another open or closed issue.
[X] I have written a meaningful title with the source name.
[X] I will fill out all of the requested information in this form.

Site has some captcha before you can read the chapters, not sure when it resets, but has to be accounted for.

The site's URL has changed

New URL: https://noxscans.com/

Closing in favor of #4699


(Feature) Automate dkim records

hi @Stretch96 thank you for this contribution. Could you give a small description in the PR on what your goal is and also update the documentation accordingly so it matches the code?


Script08_CreateSiteCollections warning :The port specified for the new host header...

Hi, while executing the Script08, I am getting
WARNING: The port specified for the new host header site does not match any known bindings in the specified Web Application.  The new si
te will not be accessible if the Web Application is not extended to an IIS Web Site serving this port.
I can see that the collection is created in the web http://myserver and IE opens and the site for example, search.myserver.com is dispalyed correctly.
So what is wrong, should I care?
Thanks

hi, same problem for me, did have any resolution to the problem?

You do not have to care. SharePoint dos this whenever you create a Host Named Site Collection (HNSC). That is always the case when passing the web application as a parameter to New-SPSite.
As they say in the mafia, "don't worry 'bout it"


vim-ruby-conque commit does not exist

Maybe you need to push to the vim-ruby-conque repo? git submodule update is broken.
https://github.com/skwp/vim-ruby-conque/tree/65d3da5b34a24f536dd611be8bdddba2785cb287
Kyle

Here is the commit in this repo: https://github.com/skwp/dotfiles/commit/e3961f2c19444d30f8142fa954e049a70c500a42

weird mine locally is pointing to cd3273e on skwp-vim-ruby-conque. will try to clone again and see

Fixed

Thanks. I will get back to work.


[l10n] Improve tr-TR locale

[X] I have followed (at least) the PR section of the contributing guide.

Ref #20656

@yunusemredilber Thanks


error with a final bundle!

Thank you for the last fix, but I found another error.
If i  start with module import https://deno.land/x/deno_image/mod.ts, everything works, but if i get bundle 'deno_image.js' i see the error.
Screenshot: https://user-images.githubusercontent.com/75129392/101872963-7d34a700-3bc9-11eb-9d09-fb2ea1359eb6.jpg

Opened https://github.com/denoland/deno/issues/8770.


My ryzen 5 3600x restart random

Hello, I have gigabyte x470 aorus ultra gaming with rtx 2060 super disabled and Rx 550 Lexa working fine, but when I have been using it for a while without cause it restarts.  can you help?
use the translator I speak Spanish

I am busy with other projects now. Will ping u when I am free. In the meantime, send me your efi

thank you!
EFI DRIVE LINK: https://drive.google.com/file/d/16O-7vMg0tfBog5accRPFqEE6ptC3YOGO/view?usp=sharing


Reference.referenceDetails - update examples

See meeting notes: 2nd March 23
Original def: https://github.com/tdwg/cd/issues/326
Current master def: https://github.com/tdwg/cd/blob/review/standard/terms/ltc_standard_terms_draft.csv#L190

[ ] Add a full bibliographic citation string or two to the list of examples.

de Mestier A, Mulcahy D, Harris DJ, et al. (2023) Policies Handbook on Using Molecular Collections. Research Ideas and Outcomes 9: e102908. https://doi.org/10.3897/rio.9.e102908 Suggested citation: USDA-ARS US National Fungus Collection (2023). USDA United States National Fungus Collections. Occurrence dataset https://doi.org/10.15468/w78rwb accessed via GBIF.org on 2023-04-27.


RFP - Quaternion

Quaternion is a cross-platform desktop IM client for the Matrix protocol in development.
https://github.com/Fxrh/Quaternion

https://chocolatey.org/packages/quaternion


enclave - migrate tests from Junit4 to Junit5

EnclaveFactoryTest

Add dependency for junit.jupiter (junit5)
Migrate per https://blogs.oracle.com/javamagazine/post/migrating-from-junit-4-to-junit-5-important-differences-and-benefits
Remove dependency on junit 4

Here's an example https://github.com/hyperledger/besu/pull/5525/files

fixed by #5598


Enable removing the X-Frame-Options header for frames

Users now can add string disable-x-frame-options in frame's name to ignore the X-Frame-Options header for the frame.
Fixes #426.

@zcbenz
I still have this problem as of .195.  I trying to get github oauth hooked up inside a frame inside atom, but the iframe refuses to load.  I wouldn't mind using a webview, but postMessage doesn't so I can't inform my plugin.

This functionality no longer exists, any reason ?
I can't use a  since I need an access to the iframe's DOM

Same for me, I've just tried it and it didn't work.

Same for me, not working! Any updates?

I am also running into this where it seems to have no effect.
this.frameElement.setAttribute('name', 'browser-page-disable-x-frame-options');
this.frameElement.setAttribute('sandbox', 'allow-scripts allow-same-origin');
//this.frameElement.setAttribute('sandbox', 'none');

Uncaught SecurityError: Failed to read the 'cookie' property from 'Document': The document is sandboxed and lacks the 'allow-same-origin' flag.

I also face this problem. Why was it removed?

If you need a workaround, you can use a webview (and console.log for message passing).

I'm having the same issue, any update on this ?

This feature is required sometimes. Why was it removed?

There are another powerful bypass you can use - it's headers modification.
Attach onHeadersReceived listener to your BrowserWindow(mainwindow in example):
`
var onHeadersReceived=(d, c)=>{
if(d.responseHeaders['X-Frame-Options']){
delete d.responseHeaders['X-Frame-Options'];
}
c({cancel: false, responseHeaders: d.responseHeaders});
}
mainWindow.webContents.session.webRequest.onHeadersReceived({}, onHeadersReceived);
mainWindow.on('closed', function() {
mainWindow.removeAllListeners();
mainWindow = null;
});
`

@demogoran great code sample, I was able to use it inside wallabyJs, although I'm having a couple race conditions, see https://twitter.com/DinisCruz/status/733341144587882496

There are 2 fixes for this error:

Use newer electron version. Old one had this annoying bug so you can't use subscriptions for remote window in renderer. As I remember, I hadn't found method to bypass it(works only till renderer window reload, any attempts to unsubscribe on window unload hadn't work)
Use those subscription inside start script instead of renderer. It's supposed to work this way, as I understand.

Also be careful with this thing. For ex., I got auth error with vk.com till I had use it(may be I did something wrong or them had additional checks for referal or something like that, but it costs me some facepalms).
Also, there are more powerful, but really tricky way - you can use http://www.telerik.com/fiddler/fiddlercore with electron to handle requests on C#/js side. To attach it you can use https://github.com/kexplo/electron-edge. I did it some time ago, useful trick.
Also seems it's Windows-specific decision.
Benefit of it is that you can catch not only your app traffic, you can modify proxy for each request with custom logic, also you can modify response body, which isn't allowed using webRequest.*.

I had to make the header names lower case to get your code to work, @demogoran, just for the benefit of others that have the same issue:
  mainWindow.webContents.session.webRequest.onHeadersReceived({}, (d, c) => {
    if(d.responseHeaders['x-frame-options']){
        delete d.responseHeaders['x-frame-options'];
    }
    c({cancel: false, responseHeaders: d.responseHeaders});
  });

Yep, good job.
You also can use more generic code(concept, haven't check it):
const filter=['x-frame-options'];
mainWindow.webContents.session.webRequest.onHeadersReceived({}, (d, c) => {
let headersNames=Object.keys(d.responseHeaders);
filter.forEach((x)=>{
for(let i in headersNames){
if(i.toLowerCase()===x){
delete d.responseHeaders[i];
break;
}
}
});
c({cancel: false, responseHeaders: d.responseHeaders});
});

This feature is necessary, will include it again?

I also need this feature

@myfrndjk have a look at what @josephrocca said above

@ frankhale : Hi Thanks for pointing it out, its working fine for most of the sites :)
However http://www.paytm.com is failing to load any product pages inside Iframe , I think website is trying to check window.top and throwing this  error .Permission denied to access property "document". Can we do something to make it work

Try changing your iframe to a webview and see if things go better

@frankhale : Web view is working fine but the page I am trying to load is having  iframe and I am not sure electron is supporting nested web view tags.This is like i am loading xyz.com in web view and xyz.com is loading http://www.paytm.com in iframe.

Maybe provide a simple example that reproduces the problem and maybe others can assist.

Thanks for your solution you save my day, now I have rewrite it to cover all case sensitive. you can see down here
  mainWindow.webContents.session.webRequest.onHeadersReceived({}, (detail, callback) => {
    const xFrameOriginKey = Object.keys(detail.responseHeaders).forEach(header => String(header).match(/^x-frame-options$/i));
    if (xFrameOriginKey) {
      delete detail.responseHeaders[xFrameOriginKey];
    }
    callback({ cancel: false, responseHeaders: detail.responseHeaders });
  });

Shame this was removed but glad to see there is a workaround (thank you @demogoran ❤).
Here's my one-liner listener body:
win.webContents.session.webRequest.onHeadersReceived((details, callback) => {
    callback({responseHeaders: Object.fromEntries(Object.entries(details.responseHeaders).filter(header => !/x-frame-options/i.test(header[0])))});
});

You can also link this feature to the iFrame name so that you can be selective on where this applies.
  //disable X-Frame-Options when frame name is disable-x-frame-options
  mainWindow.webContents.session.webRequest.onHeadersReceived(
    { urls: ["*://*/*"] },
    (details, callback) => {
      const frameName = details.frame?.name
      if (details && details.responseHeaders) {
        if (frameName === "disable-x-frame-options") {
          if (details.responseHeaders["X-Frame-Options"]) {
            delete details.responseHeaders["X-Frame-Options"]
          } else if (details.responseHeaders["x-frame-options"]) {
            delete details.responseHeaders["x-frame-options"]
          }
        }
      }
      callback({ cancel: false, responseHeaders: details.responseHeaders })
    }
  )