Search Results for

    Show / Hide Table of Contents

    Widget data query

    When configuring a data widget such as a grid widget or list widget, you need to instruct Casewhere how to load data from a data source by composing a data query. Casewhere supports two query syntaxes: Bson and C#.

    image-20220113183139609

    Max Query Timeout

    You can set a Max Query Timeout (in seconds) for the data query. If the query takes longer than the specified duration, it will be cancelled. This is useful for preventing long-running queries from affecting page performance.

    Bson data query

    Bson is the default query syntax, which is sufficient for most cases.

    { 
    	"PrimaryDataObject": { CaseState: "Created" }, 
    	"DataSource": {} 
    }
    
    • PrimaryDataObject: Filter on the data source's primary data class. Filtering on the primary data class is generally fast because Casewhere can utilize database indexes to speed up the queries.

    • DataSource: Filter on the data source projected fields. Casewhere cannot utilize database indexes for this kind of filter, so it's not recommended to use on a large data source.

    Keywords

    @user: The user in context. You can learn more about the user data object here.

    {
    	"PrimaryDataObject": { CaseState: "Created", CreatedBy: "{{@user.UserId}}" }, 
    	"DataSource": {} 
    }
    

    Params: The widget parameters sent from worker sites. You can learn how to set the parameters here.

    Then the data query will be:

    {
    	"PrimaryDataObject": { CaseState: "Created", Author: "{{Params.Author}}" }, 
    	"DataSource": {} 
    }
    

    Examples

    The book data source has below fields:

    {
        Id,
        CreatedBy,
        Title,
        Description,
        Author,
        Year,
        ...
    }
    

    To get a specific book by its ID

    { 
    	"PrimaryDataObject": { CaseState: "Created", _id: "{{Params.Id}}" }, 
    	"DataSource": {} 
    }
    

    To get books created by the logged-in user

    { 
    	"PrimaryDataObject": { CaseState: "Created", CreatedBy: "{{@user.UserId}}" }, 
    	"DataSource": {} 
    }
    

    Let's extend the book data source; now it also includes the library's information.

    {
        Id,
        CreatedBy,
        Title,
        Description,
        Author,
        Year,
        Library: {
            Id,
            Name,
            ...
        },
        ...
    }
    

    To get books in the Library of Congress:

    { 
    	"PrimaryDataObject": { CaseState: "Created" }, 
    	"DataSource": { "Library.Name": "Library of Congress" }
    }
    

    C# data query

    This syntax is designed to handle the most complex scenarios. You can query the database or execute plugins to enrich data queries. Like the Bson syntax, the C# syntax also uses the PrimaryDataObject and DataSource concepts.

    var primaryDataObject = Filter["PrimaryDataObject"].AsBsonDocument;
    var dataSource = Filter["DataSource"].AsBsonDocument;
    
    primaryDataObject.Add(new BsonDocument("CaseState", "Created"));
    

    Keywords

    @user: The user in context. You can learn more about the user data object here.

    var primaryDataObject = Filter["PrimaryDataObject"].AsBsonDocument;
    var dataSource = Filter["DataSource"].AsBsonDocument;
    
    primaryDataObject.Add(new BsonDocument("CaseState", "Created"));
    primaryDataObject.Add(new BsonDocument("CreatedBy", @user.UserId));
    

    @parameters: The widget parameters sent from worker sites. You can learn how to set the parameters here.

    var primaryDataObject = Filter["PrimaryDataObject"].AsBsonDocument;
    var dataSource = Filter["DataSource"].AsBsonDocument;
    
    primaryDataObject.Add(new BsonDocument("CaseState", "Created"));
    primaryDataObject.Add(new BsonDocument("Author", @parameters.Get<string>("Author")));
    

    @apiFactory: To construct Casewhere API objects. Read here for the full list of available Apis.

    var dataApi = @apiFactory.Get<IDataApi>();  
    var pluginApi = @apiFactory.Get<IPluginApi>();  
    var documentApi = @apiFactory.Get<IDocumentApi>();  
    var cacheApi = @apiFactory.Get<ICacheApi>(); 
    ... 
    

    Examples

    Assume you have a data source in the below structure:

    {
        Id,
        CreatedBy,
        Title,
        Description,
        Author,
        Year,
        Library: {
            Id,
            Name,
            ...
        },
    
        ...
    }
    

    To get a specific book by its ID

    var primaryDataObject = Filter["PrimaryDataObject"].AsBsonDocument;
    var dataSource = Filter["DataSource"].AsBsonDocument;
    
    primaryDataObject.Add(new BsonDocument("CaseState", "Created"));
    primaryDataObject.Add(new BsonDocument("_id", @parameters.Get<string>("Id")));
    

    If the Id parameter is not provided, load all books. Else, load the book by its Id.

    var primaryDataObject = Filter["PrimaryDataObject"].AsBsonDocument;
    var dataSource = Filter["DataSource"].AsBsonDocument;
    
    primaryDataObject.Add(new BsonDocument("CaseState", "Created"));
    if (@parameters.Has("Id"))
    {
        primaryDataObject.Add(new BsonDocument("_id", @parameters.Get<string>("Id")));
    }
    

    To get books created by the logged-in user

    var primaryDataObject = Filter["PrimaryDataObject"].AsBsonDocument;
    var dataSource = Filter["DataSource"].AsBsonDocument;
    
    primaryDataObject.Add(new BsonDocument("CaseState", "Created"));
    primaryDataObject.Add(new BsonDocument("CreatedBy", @user.UserId));
    

    To get books in the Library of Congress:

    var primaryDataObject = Filter["PrimaryDataObject"].AsBsonDocument;
    var dataSource = Filter["DataSource"].AsBsonDocument;
    
    primaryDataObject.Add(new BsonDocument("CaseState", "Created"));
    dataSource.Add(new BsonDocument("Library.Name", "Library of Congress"));
    

    To find books at all libraries in Denmark:

    var primaryDataObject = Filter["PrimaryDataObject"].AsBsonDocument;
    var dataSource = Filter["DataSource"].AsBsonDocument;
    
    primaryDataObject.Add(new BsonDocument("CaseState", "Created"));
    
    var dataApi = @apiFactory.Get<IDataApi>();
    var libraryFilter = FilterBuilder
        .Create()
        .Eq("Country", "DK")
        .Build();
    
    var libraries = dataApi.Search(DataObjectApiQuery
        .For("Library")
        .FilterBy(libraryFilter)).Data;
    
    var libraryIds = libraries.Select(lib => lib.Get<string>("Id")).ToList();
    
    if (libraryIds.Count > 0)
    {
        primaryDataObject.Add(new BsonDocument("LibraryId", new BsonDocument("$in", new BsonArray(libraryIds))));
    }
    
    In This Article
    Back to top Generated by DocFX