-
Notifications
You must be signed in to change notification settings - Fork 53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Add materialized views #3000
Changes from 15 commits
c200056
dca89b5
22819ac
4301a8f
24d70d1
a95b7c3
823384c
70b9705
2d54db1
b2cc5b5
dd7eff4
51f43da
b3ecbc4
bc63d81
e76af07
15f244d
5bd2de4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
// Copyright 2024 Democratized Data Foundation | ||
// | ||
// Use of this software is governed by the Business Source License | ||
// included in the file licenses/BSL.txt. | ||
// | ||
// As of the Change Date specified in that file, in accordance with | ||
// the Business Source License, use of this software will be governed | ||
// by the Apache License, Version 2.0, included in the file | ||
// licenses/APL.txt. | ||
|
||
package cli | ||
|
||
import ( | ||
"github.com/sourcenetwork/immutable" | ||
"github.com/spf13/cobra" | ||
|
||
"github.com/sourcenetwork/defradb/client" | ||
) | ||
|
||
func MakeViewRefreshCommand() *cobra.Command { | ||
var name string | ||
var schemaRoot string | ||
var versionID string | ||
var getInactive bool | ||
var cmd = &cobra.Command{ | ||
Use: "refresh", | ||
Short: "Refresh views.", | ||
Long: `Refresh views, executing the underlying query and LensVm transforms and | ||
persisting the results. | ||
|
||
View is refreshed as the current user, meaning the cached items will reflect that user's | ||
permissions. Subsequent query requests to the view, regardless of user, will receive | ||
items from that cache. | ||
|
||
Example: refresh all views | ||
defradb client view refresh | ||
|
||
Example: refresh views by name | ||
defradb client view refresh --name UserView | ||
|
||
Example: refresh views by schema root id | ||
defradb client view refresh --schema bae123 | ||
|
||
Example: refresh views by version id. This will also return inactive views | ||
defradb client view refresh --version bae123 | ||
`, | ||
RunE: func(cmd *cobra.Command, args []string) error { | ||
store := mustGetContextStore(cmd) | ||
|
||
options := client.CollectionFetchOptions{} | ||
if versionID != "" { | ||
options.SchemaVersionID = immutable.Some(versionID) | ||
} | ||
if schemaRoot != "" { | ||
options.SchemaRoot = immutable.Some(schemaRoot) | ||
} | ||
if name != "" { | ||
options.Name = immutable.Some(name) | ||
} | ||
if getInactive { | ||
options.IncludeInactive = immutable.Some(getInactive) | ||
} | ||
|
||
return store.RefreshViews( | ||
cmd.Context(), | ||
options, | ||
) | ||
}, | ||
} | ||
cmd.Flags().StringVar(&name, "name", "", "View name") | ||
cmd.Flags().StringVar(&schemaRoot, "schema", "", "View schema Root") | ||
cmd.Flags().StringVar(&versionID, "version", "", "View version ID") | ||
cmd.Flags().BoolVar(&getInactive, "get-inactive", false, "Get inactive views as well as active") | ||
return cmd | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -196,6 +196,14 @@ type Store interface { | |
transform immutable.Option[model.Lens], | ||
) ([]CollectionDefinition, error) | ||
|
||
// RefreshViews refreshes the caches of all views matching the given options. If no options are set, all views | ||
// will be refreshed. | ||
// | ||
// The cached result is dependent on the ACP settings of the source data and the permissions of the user making | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thought: This makes me think that there might be need for setting who is allowed to cache views on a given node. Otherwise this could be abused. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes of course, we'll either want it covered by admin ACP or allow users to own views. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Might be worth documenting this in: #2640 |
||
// the call. At the moment only one cache can be active at a time, so please pay attention to access rights | ||
// when making this call. | ||
RefreshViews(context.Context, CollectionFetchOptions) error | ||
|
||
// SetMigration sets the migration for all collections using the given source-destination schema version IDs. | ||
// | ||
// There may only be one migration per collection version. If another migration was registered it will be | ||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# Materialized views | ||
|
||
Views have been made materialized by default, this caused the tests to change slightly. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
## defradb client view refresh | ||
|
||
Refresh views. | ||
|
||
### Synopsis | ||
|
||
Refresh views, executing the underlying query and LensVm transforms and | ||
persisting the results. | ||
|
||
View is refreshed as the current user, meaning the cached items will reflect that user's | ||
permissions. Subsequent query requests to the view, regardless of user, will receive | ||
items from that cache. | ||
|
||
Example: refresh all views | ||
defradb client view refresh | ||
|
||
Example: refresh views by name | ||
defradb client view refresh --name UserView | ||
|
||
Example: refresh views by schema root id | ||
defradb client view refresh --schema bae123 | ||
|
||
Example: refresh views by version id. This will also return inactive views | ||
defradb client view refresh --version bae123 | ||
|
||
|
||
``` | ||
defradb client view refresh [flags] | ||
``` | ||
|
||
### Options | ||
|
||
``` | ||
--get-inactive Get inactive views as well as active | ||
-h, --help help for refresh | ||
--name string View name | ||
--schema string View schema Root | ||
--version string View version ID | ||
``` | ||
|
||
### Options inherited from parent commands | ||
|
||
``` | ||
-i, --identity string Hex formatted private key used to authenticate with ACP | ||
--keyring-backend string Keyring backend to use. Options are file or system (default "file") | ||
--keyring-namespace string Service name to use when using the system backend (default "defradb") | ||
--keyring-path string Path to store encrypted keys when using the file backend (default "keys") | ||
--log-format string Log format to use. Options are text or json (default "text") | ||
--log-level string Log level to use. Options are debug, info, error, fatal (default "info") | ||
--log-output string Log output path. Options are stderr or stdout. (default "stderr") | ||
--log-overrides string Logger config overrides. Format <name>,<key>=<val>,...;<name>,... | ||
--log-source Include source location in logs | ||
--log-stacktrace Include stacktrace in error and fatal logs | ||
--no-keyring Disable the keyring and generate ephemeral keys | ||
--no-log-color Disable colored log output | ||
--rootdir string Directory for persistent data (default: $HOME/.defradb) | ||
--source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor | ||
--tx uint Transaction ID | ||
--url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") | ||
``` | ||
|
||
### SEE ALSO | ||
|
||
* [defradb client view](defradb_client_view.md) - Manage views within a running DefraDB instance | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
todo: The coverage file names will clash currently as you forget to add the new type after line
225
Just append after this block:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cheers Shahzad, sorted.