From 61a8ccafa838189d9089991e0b431b684cbd45f6 Mon Sep 17 00:00:00 2001 From: shinyhappydan Date: Tue, 26 Sep 2023 12:41:52 +0000 Subject: [PATCH] deploy: 4b66f7ddd28df508c606ed665b133c15be60fa7c --- paradox.json | 2 +- snapshot/contexts/elasticsearch-metadata.json | 3 +- snapshot/contexts/elasticsearch.json | 3 +- snapshot/contexts/remote-contexts.json | 9 + snapshot/docs/delta/api/acls-api.html | 8 +- snapshot/docs/delta/api/archives-api.html | 31 +- .../docs/delta/api/assets/archives/fetch.sh | 4 +- .../delta/api/assets/archives/fetched.json | 2 +- .../api/assets/graph-analytics/ga-search.json | 11 + .../multiple-resolution-response.json | 42 ++ .../delta/api/assets/id-resolution/request.sh | 1 + .../single-resolution-response.json | 9 + .../assets/permissions/permissions-get.json | 1 - .../delta/api/assets/remote-contexts.json | 18 + .../api/assets/resources/remote-contexts.sh | 1 + .../api/assets/trial/resources/generate.sh | 19 + .../api/assets/trial/resources/generated.json | 26 + .../api/assets/trial/resources/payload.json | 15 + snapshot/docs/delta/api/assets/version.json | 4 +- snapshot/docs/delta/api/authentication.html | 4 + .../docs/delta/api/content-negotiation.html | 4 + snapshot/docs/delta/api/error-signaling.html | 4 + snapshot/docs/delta/api/events-api.html | 4 + snapshot/docs/delta/api/files-api.html | 21 + .../docs/delta/api/graph-analytics-api.html | 27 + snapshot/docs/delta/api/id-resolution.html | 440 ++++++++++++++++ snapshot/docs/delta/api/identities.html | 4 + snapshot/docs/delta/api/index.html | 15 +- snapshot/docs/delta/api/jira.html | 4 + snapshot/docs/delta/api/multi-fetch.html | 16 +- snapshot/docs/delta/api/orgs-api.html | 8 +- snapshot/docs/delta/api/permissions-api.html | 12 +- snapshot/docs/delta/api/projects-api.html | 4 + snapshot/docs/delta/api/quotas.html | 4 + snapshot/docs/delta/api/realms-api.html | 4 + snapshot/docs/delta/api/resolvers-api.html | 8 +- snapshot/docs/delta/api/resources-api.html | 102 +++- snapshot/docs/delta/api/schemas-api.html | 4 + snapshot/docs/delta/api/search-api.html | 4 + snapshot/docs/delta/api/storages-api.html | 6 +- snapshot/docs/delta/api/supervision-api.html | 8 +- snapshot/docs/delta/api/trial.html | 477 ++++++++++++++++++ .../docs/delta/api/user-permissions-api.html | 379 ++++++++++++++ snapshot/docs/delta/api/version.html | 8 +- .../api/views/aggregated-es-view-api.html | 4 + .../api/views/aggregated-sparql-view-api.html | 4 + .../docs/delta/api/views/composite-sink.html | 4 + .../delta/api/views/composite-view-api.html | 8 +- .../api/views/elasticsearch-view-api.html | 4 + snapshot/docs/delta/api/views/index.html | 4 + snapshot/docs/delta/api/views/pipes.html | 4 + .../docs/delta/api/views/sparql-view-api.html | 4 + snapshot/docs/delta/architecture.html | 4 + snapshot/docs/delta/benchmarks/index.html | 4 + snapshot/docs/delta/benchmarks/v1.2.1.html | 4 + snapshot/docs/delta/benchmarks/v1.4.2.html | 4 + snapshot/docs/delta/index.html | 4 + snapshot/docs/delta/metadata.html | 387 ++++++++++++++ snapshot/docs/delta/plugins/index.html | 8 +- snapshot/docs/faq.html | 4 + snapshot/docs/forge.html | 4 + snapshot/docs/fusion/architecture.html | 4 + snapshot/docs/fusion/index.html | 4 + snapshot/docs/fusion/my-data.html | 4 + snapshot/docs/fusion/organizations.html | 4 + snapshot/docs/fusion/plugins.html | 4 + snapshot/docs/fusion/project.html | 4 + snapshot/docs/fusion/projects.html | 4 + snapshot/docs/fusion/search.html | 4 + snapshot/docs/fusion/studio.html | 4 + snapshot/docs/fusion/studios.html | 4 + snapshot/docs/getting-started/index.html | 4 + .../running-nexus/configuration/index.html | 34 +- .../running-nexus/docker/docker-compose.yaml | 4 +- .../getting-started/running-nexus/index.html | 4 + .../running-nexus/search-configuration.html | 4 + .../getting-started/try-nexus-movielens.html | 4 + snapshot/docs/getting-started/try-nexus.html | 4 + .../understanding-knowledge-graphs.html | 4 + snapshot/docs/index.html | 4 + snapshot/docs/releases/index.html | 8 +- snapshot/docs/releases/older-releases.html | 4 + .../docs/releases/v1.4-to-v1.5-migration.html | 4 + .../docs/releases/v1.5-release-notes.html | 4 + .../docs/releases/v1.5-to-v1.6-migration.html | 4 + .../docs/releases/v1.6-release-notes.html | 4 + .../docs/releases/v1.6-to-v1.7-migration.html | 4 + .../docs/releases/v1.7-release-notes.html | 4 + .../docs/releases/v1.7-to-v1.8-migration.html | 4 + .../docs/releases/v1.8-release-notes.html | 6 +- .../docs/releases/v1.8-to-v1.9-migration.html | 10 + .../docs/releases/v1.9-release-notes.html | 104 +++- snapshot/docs/roadmap.html | 4 + snapshot/docs/utilities/index.html | 4 + snapshot/docs/versions.html | 4 + snapshot/paradox.json | 2 +- snapshot/search/search_index.json | 2 +- v1.5.x/paradox.json | 2 +- v1.6.x/paradox.json | 2 +- v1.7.x/paradox.json | 2 +- 100 files changed, 2416 insertions(+), 111 deletions(-) create mode 100644 snapshot/contexts/remote-contexts.json create mode 100644 snapshot/docs/delta/api/assets/id-resolution/multiple-resolution-response.json create mode 100644 snapshot/docs/delta/api/assets/id-resolution/request.sh create mode 100644 snapshot/docs/delta/api/assets/id-resolution/single-resolution-response.json create mode 100644 snapshot/docs/delta/api/assets/remote-contexts.json create mode 100644 snapshot/docs/delta/api/assets/resources/remote-contexts.sh create mode 100644 snapshot/docs/delta/api/assets/trial/resources/generate.sh create mode 100644 snapshot/docs/delta/api/assets/trial/resources/generated.json create mode 100644 snapshot/docs/delta/api/assets/trial/resources/payload.json create mode 100644 snapshot/docs/delta/api/id-resolution.html create mode 100644 snapshot/docs/delta/api/trial.html create mode 100644 snapshot/docs/delta/api/user-permissions-api.html create mode 100644 snapshot/docs/delta/metadata.html diff --git a/paradox.json b/paradox.json index eba31decbc..8cacd16fd0 100644 --- a/paradox.json +++ b/paradox.json @@ -1,4 +1,4 @@ { "name" : "docs", - "version" : "0.0.0+1-64304504+20230913-1250-SNAPSHOT" + "version" : "0.0.0+1-64304504+20230926-1241-SNAPSHOT" } \ No newline at end of file diff --git a/snapshot/contexts/elasticsearch-metadata.json b/snapshot/contexts/elasticsearch-metadata.json index 7bbc67f7b9..a344a8863a 100644 --- a/snapshot/contexts/elasticsearch-metadata.json +++ b/snapshot/contexts/elasticsearch-metadata.json @@ -3,8 +3,7 @@ "View": "https://bluebrain.github.io/nexus/vocabulary/View", "ElasticSearchView": "https://bluebrain.github.io/nexus/vocabulary/ElasticSearchView", "AggregateElasticSearchView": "https://bluebrain.github.io/nexus/vocabulary/AggregateElasticSearchView", - "_uuid": "https://bluebrain.github.io/nexus/vocabulary/uuid", - "_indexingRev": "https://bluebrain.github.io/nexus/vocabulary/indexingRev" + "_uuid": "https://bluebrain.github.io/nexus/vocabulary/uuid" }, "@id": "https://bluebrain.github.io/nexus/contexts/elasticsearch-metadata.json" } diff --git a/snapshot/contexts/elasticsearch.json b/snapshot/contexts/elasticsearch.json index 8b377b72e4..8a27561e57 100644 --- a/snapshot/contexts/elasticsearch.json +++ b/snapshot/contexts/elasticsearch.json @@ -18,8 +18,7 @@ "viewId": { "@type": "@id" }, - "_uuid": "https://bluebrain.github.io/nexus/vocabulary/uuid", - "_indexingRev": "https://bluebrain.github.io/nexus/vocabulary/indexingRev" + "_uuid": "https://bluebrain.github.io/nexus/vocabulary/uuid" }, "https://bluebrain.github.io/nexus/contexts/pipeline.json" ], diff --git a/snapshot/contexts/remote-contexts.json b/snapshot/contexts/remote-contexts.json new file mode 100644 index 0000000000..641de69e4f --- /dev/null +++ b/snapshot/contexts/remote-contexts.json @@ -0,0 +1,9 @@ +{ + "@context": { + "@vocab": "https://bluebrain.github.io/nexus/vocabulary/", + "remoteContexts": { + "@container": "@set" + } + }, + "@id": "https://bluebrain.github.io/nexus/contexts/remote-contexts.json" +} \ No newline at end of file diff --git a/snapshot/docs/delta/api/acls-api.html b/snapshot/docs/delta/api/acls-api.html index 1af97fcf2b..27579ff984 100644 --- a/snapshot/docs/delta/api/acls-api.html +++ b/snapshot/docs/delta/api/acls-api.html @@ -197,12 +197,15 @@
  • Permissions
  • Realms
  • Access Control Lists
  • +
  • User Permissions
  • Organizations
  • Projects
  • Quotas
  • Schemas
  • Resources
  • +
  • Trial
  • Multi fetch
  • +
  • Id Resolution
  • Resolvers
  • Views
  • +
  • Nexus Metadata
  • Plugins
  • Benchmarks -

    The response will be an HTTP 303 Location redirect, which will point to the url where to consume the archive (tarball).

    +

    The response will be an HTTP 303 Location redirect, which will point to the url where to consume the archive (ZIP).

    The following diagram can help to understand the HTTP exchange post-redirect-get

    Example

    -

    The following example shows how to create an archive containing 3 files. 2 of them are resources and the other is a file. As a response, the tarball will be offered.

    +

    The following example shows how to create an archive containing 3 files. 2 of them are resources and the other is a file. As a response, the ZIP file will be offered.

    Request
    @@ -510,24 +513,20 @@

    Note that if the payload contains an @id different from the {archive_id}, the request will fail.

    Fetch

    -

    When fetching an archive, the response format can be chosen through HTTP content negotiation. In order to fetch the archive metadata, the client can use any of the following MIME types. However, in order to fetch the archive content, the HTTP Accept header should be provided:

    -
      -
    • */* or application/x-tar will return a tar archive (or tarball)
    • -
    • application/zip will return a zip archive
    • -
    Note
    -

    The limitations of the tar format makes the usage of archives difficult (among other things, the maximum file name is limited to 100 characters), so its support will be removed in a future release.

    +

    When fetching an archive, the response format can be chosen through HTTP content negotiation. In order to fetch the archive metadata, the client can use any of the following MIME types. However, in order to fetch the archive content, the HTTP Accept header should be provided as application/zip.

    +

    @@@

    When downloading the archive, it is possible to ignore resources that does not exist by appending the query parameter ignoreNotFound=true to the fetch link.

    GET /v1/archives/{org_label}/{project_label}/{archive_id}
     GET /v1/archives/{org_label}/{project_label}/{archive_id}?ignoreNotFound=true
     

    Example

    -
    Request (tarball) +
    Request (ZIP)
    sourcecurl "http://localhost:8080/v1/archives/myorg/myproject/myarchive" \
    -     -H "Accept: application/x-tar" \
    -     -o output.tar
    + -H "Accept: application/x-zip" \ + -o output.zip

    Request (metadata)
    @@ -569,7 +568,7 @@

    diff --git a/snapshot/docs/delta/api/assets/archives/fetch.sh b/snapshot/docs/delta/api/assets/archives/fetch.sh index 46fc4031d9..6961af6e50 100644 --- a/snapshot/docs/delta/api/assets/archives/fetch.sh +++ b/snapshot/docs/delta/api/assets/archives/fetch.sh @@ -1,3 +1,3 @@ curl "http://localhost:8080/v1/archives/myorg/myproject/myarchive" \ - -H "Accept: application/x-tar" \ - -o output.tar \ No newline at end of file + -H "Accept: application/x-zip" \ + -o output.zip \ No newline at end of file diff --git a/snapshot/docs/delta/api/assets/archives/fetched.json b/snapshot/docs/delta/api/assets/archives/fetched.json index de3ab9aab3..5d742add13 100644 --- a/snapshot/docs/delta/api/assets/archives/fetched.json +++ b/snapshot/docs/delta/api/assets/archives/fetched.json @@ -32,6 +32,6 @@ "_createdAt": "2021-05-17T14:54:42.939Z", "_createdBy": "http://localhost:8080/v1/realms/myrealm/users/john", "_updatedAt": "2021-05-17T14:54:42.939Z", - "_updatedBy": "http://localhost:8080/v1/realms/myrealm/users/john" + "_updatedBy": "http://localhost:8080/v1/realms/myrealm/users/john", "_expiresInSeconds": 17530 } \ No newline at end of file diff --git a/snapshot/docs/delta/api/assets/graph-analytics/ga-search.json b/snapshot/docs/delta/api/assets/graph-analytics/ga-search.json index b9b438837a..767bde649f 100644 --- a/snapshot/docs/delta/api/assets/graph-analytics/ga-search.json +++ b/snapshot/docs/delta/api/assets/graph-analytics/ga-search.json @@ -39,6 +39,17 @@ "path": "http://schema.org/worksFor" } ], + "remoteContexts": [ + { + "@type": "ProjectRemoteContextRef", + "iri": "https://bbp.epfl.ch/contexts/person", + "resource": { + "id": "https://bbp.epfl.ch/contexts/person", + "project": "myorg/myproj", + "rev": 1 + } + } + ], "_createdAt": "2023-08-08T15:49:14.081Z", "_createdBy": { "@type": "User", diff --git a/snapshot/docs/delta/api/assets/id-resolution/multiple-resolution-response.json b/snapshot/docs/delta/api/assets/id-resolution/multiple-resolution-response.json new file mode 100644 index 0000000000..2212b40437 --- /dev/null +++ b/snapshot/docs/delta/api/assets/id-resolution/multiple-resolution-response.json @@ -0,0 +1,42 @@ +{ + "@context" : [ + "https://bluebrain.github.io/nexus/contexts/metadata.json", + "https://bluebrain.github.io/nexus/contexts/search.json" + ], + "_total" : 2, + "_results" : [ + { + "@id" : "https://example.com/Alice", + "_constrainedBy" : "https://bluebrain.github.io/nexus/schemas/unconstrained.json", + "_createdAt" : "2023-09-22T13:55:33.493Z", + "_createdBy" : "http://localhost:8080/v1/realms/myrealm/users/bob", + "_deprecated" : false, + "_incoming" : "http://localhost:8080/v1/resources/myorg/myproject/_/https:%2F%2Fexample.com%2FAlice/incoming", + "_outgoing" : "http://localhost:8080/v1/resources/myorg/myproject/_/https:%2F%2Fexample.com%2FAlice/outgoing", + "_project" : "http://localhost:8080/v1/projects/myorg/myproject", + "_rev" : 1, + "_schemaProject" : "http://localhost:8080/v1/projects/myorg/myproject", + "_score" : 0.0, + "_self" : "http://localhost:8080/v1/resources/myorg/myproject/_/https:%2F%2Fexample.com%2FAlice", + "_updatedAt" : "2023-09-22T13:55:33.493Z", + "_updatedBy" : "http://localhost:8080/v1/realms/myrealm/users/bob" + }, + { + "@id" : "https://example.com/Alice", + "_constrainedBy" : "https://bluebrain.github.io/nexus/schemas/unconstrained.json", + "_createdAt" : "2023-09-22T13:55:33.459Z", + "_createdBy" : "http://localhost:8080/v1/realms/myrealm/users/bob", + "_deprecated" : false, + "_incoming" : "http://localhost:8080/v1/resources/myorg/secondproject/_/https:%2F%2Fexample.com%2FAlice/incoming", + "_outgoing" : "http://localhost:8080/v1/resources/myorg/secondproject/_/https:%2F%2Fexample.com%2FAlice/outgoing", + "_project" : "http://localhost:8080/v1/projects/myorg/secondproject", + "_rev" : 1, + "_schemaProject" : "http://localhost:8080/v1/projects/myorg/secondproject", + "_score" : 0.0, + "_self" : "http://localhost:8080/v1/resources/myorg/secondproject/_/https:%2F%2Fexample.com%2FAlice", + "_updatedAt" : "2023-09-22T13:55:33.459Z", + "_updatedBy" : "http://localhost:8080/v1/realms/myrealm/users/bob" + } + ], + "_maxScore" : 0.0 +} diff --git a/snapshot/docs/delta/api/assets/id-resolution/request.sh b/snapshot/docs/delta/api/assets/id-resolution/request.sh new file mode 100644 index 0000000000..dbc4120617 --- /dev/null +++ b/snapshot/docs/delta/api/assets/id-resolution/request.sh @@ -0,0 +1 @@ +curl "http://localhost:8080/v1/resolve/https%3A%2F%2Fexample.com%2FAlice" \ No newline at end of file diff --git a/snapshot/docs/delta/api/assets/id-resolution/single-resolution-response.json b/snapshot/docs/delta/api/assets/id-resolution/single-resolution-response.json new file mode 100644 index 0000000000..5dcf5dd441 --- /dev/null +++ b/snapshot/docs/delta/api/assets/id-resolution/single-resolution-response.json @@ -0,0 +1,9 @@ +{ + "@context": { + "@vocab": "https://schema.org/" + }, + "@id": "https://example.com/Alice", + "@type": "Person", + "name": "Alice", + "age": 42 +} \ No newline at end of file diff --git a/snapshot/docs/delta/api/assets/permissions/permissions-get.json b/snapshot/docs/delta/api/assets/permissions/permissions-get.json index 740a9e173f..40916aea0c 100644 --- a/snapshot/docs/delta/api/assets/permissions/permissions-get.json +++ b/snapshot/docs/delta/api/assets/permissions/permissions-get.json @@ -18,7 +18,6 @@ "acls/read", "projects/read", "permissions/read", - "archives/write", "organizations/create", "views/query", "storages/write", diff --git a/snapshot/docs/delta/api/assets/remote-contexts.json b/snapshot/docs/delta/api/assets/remote-contexts.json new file mode 100644 index 0000000000..aa5e30ff6f --- /dev/null +++ b/snapshot/docs/delta/api/assets/remote-contexts.json @@ -0,0 +1,18 @@ +{ + "@context": "https://bluebrain.github.io/nexus/contexts/remote-contexts.json", + "remoteContexts": [ + { + "@type": "StaticContextRef", + "iri": "https://bluebrain.github.io/nexus/contexts/metadata.json" + }, + { + "@type": "ProjectContextRef", + "iri": "https://localhost/nexus/context", + "resource": { + "id": "https://localhost/nexus/context", + "project": "org/proj", + "rev": 5 + } + } + ] +} \ No newline at end of file diff --git a/snapshot/docs/delta/api/assets/resources/remote-contexts.sh b/snapshot/docs/delta/api/assets/resources/remote-contexts.sh new file mode 100644 index 0000000000..ba4ddde342 --- /dev/null +++ b/snapshot/docs/delta/api/assets/resources/remote-contexts.sh @@ -0,0 +1 @@ +curl "http://localhost:8080/v1/resources/org/proj/_/my-resource/remote-contexts" diff --git a/snapshot/docs/delta/api/assets/trial/resources/generate.sh b/snapshot/docs/delta/api/assets/trial/resources/generate.sh new file mode 100644 index 0000000000..13f05eeb63 --- /dev/null +++ b/snapshot/docs/delta/api/assets/trial/resources/generate.sh @@ -0,0 +1,19 @@ +curl -X PUT \ + -H "Content-Type: application/json" \ + "http://localhost:8080/trial/resources/myorg/myproj/" \ + -d \ +'{ + "schema": "https://bbp.epfl.ch/nexus/schema/morphology" + "resource": { + "@context": [ + "https://neuroshapes.org", + "https://bluebrain.github.io/nexus/contexts/metadata.json", + { + "@vocab": "https://bluebrain.github.io/nexus/vocabulary/" + } + ], + "@id": "https://bbp.epfl.ch/nexus/data/morphology-001", + "@type": "Morphology", + "name": "Morphology 001" + } + }' \ No newline at end of file diff --git a/snapshot/docs/delta/api/assets/trial/resources/generated.json b/snapshot/docs/delta/api/assets/trial/resources/generated.json new file mode 100644 index 0000000000..7526b8cbc1 --- /dev/null +++ b/snapshot/docs/delta/api/assets/trial/resources/generated.json @@ -0,0 +1,26 @@ +{ + "result": { + "@context": [ + "https://bluebrain.github.io/nexus/contexts/metadata.json", + { + "@vocab": "https://bluebrain.github.io/nexus/vocabulary/" + }, + "https://neuroshapes.org" + ], + "@id": "https://bbp.epfl.ch/nexus/data/morphology-001", + "@type": "Morphology", + "name": "Morphology 001", + "_constrainedBy": "https://bbp.epfl.ch/nexus/schema/morphology", + "_createdAt": "2023-09-18T12:00:00Z", + "_createdBy": "http://localhost/v1/realms/wonderland/users/alice", + "_deprecated": false, + "_incoming": "http://localhost/v1/resources/myorg/myproj/_/https:%2F%2Fbluebrain.github.io%2Fnexus%2Fvocabulary%2FmyId/incoming", + "_outgoing": "http://localhost/v1/resources/myorg/myproj/_/https:%2F%2Fbluebrain.github.io%2Fnexus%2Fvocabulary%2FmyId/outgoing", + "_project": "http://localhost/v1/projects/myorg/myproj", + "_rev": 1, + "_schemaProject": "http://localhost/v1/projects/myorg/myproj", + "_self": "http://localhost/v1/resources/myorg/myproj/_/https:%2F%2Fbluebrain.github.io%2Fnexus%2Fvocabulary%2FmyId", + "_updatedAt": "2023-09-18T12:00:00Z", + "_updatedBy": "http://localhost/v1/realms/wonderland/users/alice" + } +} \ No newline at end of file diff --git a/snapshot/docs/delta/api/assets/trial/resources/payload.json b/snapshot/docs/delta/api/assets/trial/resources/payload.json new file mode 100644 index 0000000000..1a65b84a64 --- /dev/null +++ b/snapshot/docs/delta/api/assets/trial/resources/payload.json @@ -0,0 +1,15 @@ +{ + "schema": "https://bbp.epfl.ch/nexus/schema/morphology" + "resource": { + "@context": [ + "https://neuroshapes.org", + "https://bluebrain.github.io/nexus/contexts/metadata.json", + { + "@vocab": "https://bluebrain.github.io/nexus/vocabulary/" + } + ], + "@id": "https://bbp.epfl.ch/nexus/data/morphology-001", + "@type": "Morphology", + "name": "Morphology 001" + } +} \ No newline at end of file diff --git a/snapshot/docs/delta/api/assets/version.json b/snapshot/docs/delta/api/assets/version.json index 25f06e71e8..f026c80706 100644 --- a/snapshot/docs/delta/api/assets/version.json +++ b/snapshot/docs/delta/api/assets/version.json @@ -4,8 +4,8 @@ "dependencies": { "blazegraph": "2.1.6-RC", "postgresql": "15.4", - "elasticsearch": "8.8.1", - "remoteStorage": "1.8.0" + "elasticsearch": "8.10.1", + "remoteStorage": "1.9.0" }, "plugins": { "archive": "1.9.0", diff --git a/snapshot/docs/delta/api/authentication.html b/snapshot/docs/delta/api/authentication.html index 11d6b98a5d..4e1c33c01f 100644 --- a/snapshot/docs/delta/api/authentication.html +++ b/snapshot/docs/delta/api/authentication.html @@ -197,12 +197,15 @@
  • Permissions
  • Realms
  • Access Control Lists
  • +
  • User Permissions
  • Organizations
  • Projects
  • Quotas
  • Schemas
  • Resources
  • +
  • Trial
  • Multi fetch
  • +
  • Id Resolution
  • Resolvers
  • Views
  • +
  • Nexus Metadata
  • Plugins
  • Benchmarks