Commit Graph
109 Commits
Author SHA1 Message Date
Dominik Schmidt 0dbd8d6963 feat(search): add metric aggregations
sum/min/max/avg over a numeric field: bleve folds the accumulators from doc values, OpenSearch reads them from a stats aggregation, the service layer reduces them to the value of the kind after the cross-space merge. The proto gains MetricDefinition, MetricKind and Metric, which travels as accumulators (sum, count, min, max) so the merge works whatever the kind; value is set after the merge and absent for a metric without a single value. A metric is only valid on a numeric field, and only one of bucketDefinition and metricDefinition at a time. AGG-06, 18 and 21 in the parity suite.
2026-10-06 10:51:38 +02:00
Dominik Schmidt b2d8a13c24 feat(search): add range aggregations
Numeric and date ranges on both engines: bleve folds them from doc values, OpenSearch uses range and date_range aggregations. The proto gains BucketRange and bucketDefinition.ranges, the aggregation package the range parser (bounds are numbers or RFC3339 dates, one kind per aggregation, anything else is rejected), the kind of an option and the validation of ranges against the field type. Every requested range is answered in request order, an empty one with a count of zero, with no space answering too; size does not cut ranges, keyAsNumber sorts them by their lower bound. Range keys read from..to. AGG-04, 05 and 07 to 09 in the parity suite.
2026-10-06 10:50:28 +02:00
Dominik Schmidt 713fae1f8c feat(search): add terms aggregations
Term buckets on both engines: bleve folds them from doc values (its facets read numbers as prefix-coded terms), OpenSearch uses terms aggregations. A request gets every bucket, up to 65535 per space (the OpenSearch default for search.max_buckets, held on bleve as well); beyond that it is refused. The proto gains AggregationOption, BucketDefinition (sort, minimum count), AggregationResult and Bucket. The new aggregation package merges the per-space results by position, so several aggregations on one field stay apart, and shapes them per BucketDefinition (minimum count, sort, size). It also validates aggregations against the index mapping (a field the index knows and a client may name, of a type whose values are buckets; the mapping overrides mark the internal fields): the search service relies on it, the graph endpoint asks it first to save the round trip, next to its own checks against the spec, and with the field names of the request so an error reads like the request. A request names a field like the driveItem property, exactly so. A number is keyed as it is, a bool as true or false on both engines, an empty value is no bucket. Pinned in the parity suite as AGG-01 to 03, 17, 34, 37 and 39; the paging rows AGG-41 to 43 pin the first commit through the same matrix machinery, which also shortens long answer lists in the README.
2026-10-06 10:49:18 +02:00
Dominik Schmidt 5b840ddc7d feat(graph): add POST /search/query
MS Graph style search endpoint: searchRequest with KQL queryString, from/size pagination (values outside the spec's bounds are rejected), entityTypes validated to driveItem, hits as driveItems with webUrl, parentReference, remoteItem for shares, the facets and @libre.graph.permissions.actions.allowedValues, which the search service now projects onto the Entity from the same permission set as the WebDAV report. Properties the endpoint does not evaluate yet (aggregations, aggregationFilters, sortProperties) answer 501 instead of being ignored, an unknown $expand answers 400, and a failing search service keeps its status. Hits reuse what the drive item listing has, which moves a little: the thumbnails helper is named for the drive item it fills (setDriveItemThumbnailsByID, it served shares only), the web URL of an id gets a helper (webURLForID), and the facets come out of the proto through one generic mapping.FromProto instead of a copy per facet.
2026-10-06 10:47:03 +02:00
Dominik Schmidt e83dac7d24 feat(search): offset paging with a stable order
The search service takes a `from` offset next to the page size and applies it after the cross-space merge; every space answers the full prefix up to from+size, since an offset cannot be distributed. Pages are stable: both engines and the merge break score ties by id, and OpenSearch counts every match (track_total_hits). No engine pages beyond the first 10000 matches, the OpenSearch result window, so a from and size reaching beyond it are rejected on both engines. `page_size` becomes optional on the wire: absent is the default of 200, 0 asks for no matches, -1 for all; WebDAV and the tags listing set it accordingly, and the WebDAV report's `<oc:offset>`, parsed since the report exists and never read, now pages the merged list. The gRPC wrapper passes the request through and keys its cache by the whole request.
2026-10-06 10:45:57 +02:00
Andre Duffeck 8f2adf2138 Reindex disabled spaces once they get enabled again (#3579)
Spaces that are disabled while reindexing are skipped. They are now
remembered in a NATS KV bucket (including whether a forced rescan was
requested) and reindexed when the SpaceEnabled event comes in. The
entry is removed when the space gets deleted.
2026-10-05 14:28:58 +02:00
Pascal Wengerter 002a2e43fb chore: regenerate mockery outputs 2026-09-16 14:57:41 +02:00
Pascal Wengerter dc5821eb3d fix: support Go 1.27 code generation 2026-09-16 14:57:41 +02:00
Dominik Schmidt 81b0df1ad4 feat(search): live photo facet 2026-09-03 03:34:33 +02:00
Dominik Schmidt 3515594787 fix(search): keep the video facet on the file itself 2026-09-03 01:09:41 +02:00
Dominik Schmidt a2050d1fb9 feat(search): index and expose the motion photo facet 2026-09-03 00:31:40 +02:00
Dominik Schmidt 727c986de8 feat(search): index and expose the video facet 2026-09-01 16:26:01 +02:00
André Duffeck 2eb1fe069c Add a --concurrency flag to the index command
It controls the number of spaces that are indexed in parallel. The max
concurrency configured in the server is still considered.
2026-07-31 16:07:18 +02:00
André Duffeck e26a009fc1 Improve "opencloud search index" command
The command no longer times out after 10 minutes when the processing
hasn't been finished yet. Instead it shows progress and logs successful
and failed spaces. The process can also be aborted using ctrl+c.

Example output:

```
$ bin/opencloud search index --all-spaces --insecure --force-rescan
[1/602] indexed space a9033d65-6c13-4556-b923-f321ab33a9ca$eb6a8a0e-2e62-4b40-bce9-360063236676!eb6a8a0e-2e62-4b40-bce9-360063236676 in 5.501190908s
[2/602] indexed space a9033d65-6c13-4556-b923-f321ab33a9ca$34b7c565-da3b-4f53-8559-825e87db4011!34b7c565-da3b-4f53-8559-825e87db4011 in 5.935075697s
[3/602] indexed space a9033d65-6c13-4556-b923-f321ab33a9ca$e08c6026-24f6-4a9e-a805-ed335b34b8da!e08c6026-24f6-4a9e-a805-ed335b34b8da in 6.016350958s
^Caborted, indexing has been stopped
```

Fixes #2592
2026-07-31 14:50:09 +02:00
Ralf Haferkamp 0601a80e19 remove remaining store proto stuff
They were accidently reintroduce with a recent PR
(https://github.com/opencloud-eu/opencloud/pull/2755)
2026-05-19 14:49:26 +02:00
Jörn Friedrich Dreyer 66fae3061d Merge pull request #2755 from opencloud-eu/no-registry-lookup-in-cli
No registry lookup in cli
2026-05-18 11:38:21 +02:00
Jörn Friedrich Dreyer 2124b6c657 generate grpc client stubs 2026-05-13 11:33:27 +02:00
Jörn Friedrich Dreyer a79ea88773 delete unused store proto
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2026-05-13 11:05:32 +02:00
Jörn Friedrich Dreyer fb4112dc68 update generated code
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2026-05-13 10:52:44 +02:00
Ralf Haferkamp 10e54ca717 cleanup: Remove proto-gen-docs dependency
We don't currently use the docs for the internal grpc APIs. Let's skip
building them on `make generate`.
2026-04-28 17:22:48 +02:00
André Duffeck 60bcc6b0f2 Add a flag to the reindex command to force a full reindex
That can be helpful when the search service configuration has changed,
e.g. by enabling TIKA. Previously files that had already been indexed
were not indexed again and thus were no part of the fulltext index.

Fixes #2285
Fixes #2578
2026-04-14 08:20:28 +02:00
André Duffeck ce5ec1b3dc Add support for favorites to the search service 2026-03-13 09:38:28 +01:00
André Duffeck aa9f74bcb4 Regenerate mocks 2025-07-16 10:29:34 +02:00
Christian Richter 8186a26af5 add noop clean to protogen/Makefile
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-07-08 11:23:52 +02:00
06kellyjac 29f9e71044 build: add protogen to modules list fix Makefile
Added protogen to the OC_MODULES list since it uses mockery so has
generated files.
Removed `include` for file which no-longer exists.
2025-06-19 16:25:39 +01:00
06kellyjac 2a3a20693a build: Modify mockery config to work with v3
Maintaining the positioning of the files from v2 to reduce cognitive
load.
Indentation of yaml files now matches `.editorconfig`.
All mock files regenerated.
Added empty `{}` following convention from `mockery init` etc.
Removed directory specification where it would already match.
2025-06-19 16:25:39 +01:00
Jörn Friedrich Dreyer 3c38a3e3ed fix mockery warnings
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2025-04-29 11:01:17 +02:00
Ralf Haferkamp 24da3687d9 Makefile: remove unneeded recursion.mk
The MAKE_DEPTH variable is not used anywhere anymore.
2025-04-22 16:57:17 +02:00
Artur NeumannandMichael Barz b075b177d6 tests: add pipeline config (#341)
Co-authored-by: Michael Barz <michael.barz@zeitgestalten.eu>
2025-03-12 12:22:13 +05:45
Ralf Haferkamp 48edc9a5d1 Reintroduce check for go before including bingo Makefile
This re-adds the check for go being installed before including the
bingo variables make file to avoid repeating errors about missing a
missing go binary when running 'make node-generate' in the ci (the node
container doesn't have go installed)
2025-03-11 11:19:20 +01:00
Florian Schade dbafbaa333 fix: remove deprecations and use go-generate instead of go-generate-STAGE 2025-03-06 11:56:09 +01:00
Florian Schade da1963cfa4 enhancement: split make ci-node-generate and ci-go-generate into prod and dev stages 2025-03-05 17:32:37 +01:00
André Duffeck c785cfb82c Add back yaml tags which were dropped in fd4aa77a 2025-01-31 14:34:56 +01:00
Jörn Friedrich Dreyer 8ac250952f url fixes, more decisions
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2025-01-29 16:49:39 +01:00
Florian Schade fd4aa77ab8 enhancement: include web theme 2025-01-20 15:51:12 +01:00
Ralf Haferkamp 0a9a48472f Merge pull request #30 from opencloud-eu/fix-init
Fix ocis init
2025-01-20 11:07:29 +01:00
Florian Schade 0fe3ec5927 fix: protogen makefile 2025-01-17 10:14:31 +01:00
André Duffeck f1ac9aaf29 Fix names in protobuf 2025-01-17 08:29:18 +01:00
Florian Schade b6a3a169c3 fix: failing protogen make generate task 2025-01-16 08:26:17 +01:00
Florian Schade 4a45d7fca8 refactor!: change base data and config dir path
BREAKING CHANGE: `.ocis` dir isn't valid anymore, use init again.
2025-01-15 15:07:57 +01:00
André Duffeck 8c8cdd9310 Adapt protobuf naming 2025-01-15 11:04:32 +01:00
Ralf Haferkamp ae7d6cfb86 Adjust protogen config for new name 2025-01-13 15:40:06 +01:00
Ralf Haferkamp 01cde87af0 Adjust mockery configs for new name 2025-01-13 15:05:38 +01:00
Jörn Friedrich Dreyer 8e028f17e9 change module name
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2025-01-13 09:58:18 +01:00
jkoberg 7947c99930 feat(settings): translate notifications settings
Signed-off-by: jkoberg <jkoberg@owncloud.com>
2025-01-02 11:31:42 +01:00
Roman Perekhod 698b6755d1 The user settings was extended by the notifications preferences 2024-12-18 10:52:21 +01:00
Christian Richter 3669322e09 remove protogen & generate protobuf code
Signed-off-by: Christian Richter <crichter@owncloud.com>
2024-08-22 11:04:59 +02:00
Ralf Haferkamp 1b47707e2f settings: Add spec and stubs for ListRoleAssignmentsFiltered request 2024-06-04 11:00:09 +02:00
Benedikt Kulmann 21a9992980 feat: add image and photo metadata to search (#8504)
* feat: add image and photo metadata to search
2024-05-21 10:21:15 +02:00
Jannik Stehle d40a643fbf feat: add remote item id to search report responses
Adds the remote item id to search `REPORT` responses for shared resources and resources that are part of such. This id represents the id of the original resource that has been shared (= the remote item) and is needed for clients to correctly resolve their locations.
2024-05-15 11:26:43 +02:00