Class DataApi
Namespace: Casewhere.Runtime.DSL.Api
Assembly: Casewhere.Runtime.dll
public class DataApi : IDataApi, IDslApi, IDslContextualApi
Inheritance
Implements
IDataApi, IDslApi, IDslContextualApi
Inherited Members
object.ToString(), object.Equals(object), object.Equals(object, object), object.ReferenceEquals(object, object), object.GetHashCode(), object.GetType(), object.MemberwiseClone()
Extension Methods
ObjectExtension.ConvertToBsonValue(object), EnumExtensions.DeepClone<DataApi>(DataApi)
Constructors
DataApi(IDataObjectApiService, IDomainRepository, INonEventDomainRepositories, IDataSourceApiService, IDataClassRepository, ISearchPhraseService, IAdvancedFilterBuilder)
public DataApi(IDataObjectApiService dataObjectApiService, IDomainRepository domainRepository, INonEventDomainRepositories nonEventDomainRepositories, IDataSourceApiService dataSourceApiService, IDataClassRepository dataClassRepository, ISearchPhraseService searchPhraseService, IAdvancedFilterBuilder advancedFilterBuilder)
Parameters
dataObjectApiService
IDataObjectApiService
domainRepository
IDomainRepository
nonEventDomainRepositories
INonEventDomainRepositories
dataSourceApiService
IDataSourceApiService
dataClassRepository
IDataClassRepository
searchPhraseService
ISearchPhraseService
advancedFilterBuilder
IAdvancedFilterBuilder
Methods
Add(string, object, Guid?, bool)
Add a new Data Object.
public string Add(string dataClass, object data, Guid? caseId = null, bool notifyChange = true)
Parameters
dataClass
string
Data Class name
data
object
Data Object to be added.
caseId
Guid?
Id of the case that the object will be added to. If null, the data object will be added to the case of the workflow.
notifyChange
bool
Skip the data change notification when updating data.
Returns
Id of the added Data Object.
Examples
var dataApi = ctx.Use<IDataApi>();
var orderId = dataApi.Add("Order", new
{
OrderNo = 100,
Customer = "Jane",
Total = 15.5
});
AddExternalDO(object, Guid?)
Add a new external data object.
public string AddExternalDO(object data, Guid? caseId = null)
Parameters
data
object
Data Object to be added.
caseId
Guid?
Id of the case that the object will be added to. If null, the data object will be added to the case of the workflow.
Returns
Id of the added Data Object.
Examples
var dataApi = ctx.Use<IDataApi>();
var orderId = dataApi.AddExternalDO(new
{
OrderNo = 100,
Customer = "Jane",
Total = 15.5
});
Any(string, DynamicFilter)
Determines whether any element of a Data Collection exists or satisfies a condition.
public bool Any(string dataClassName, DynamicFilter filter)
Parameters
dataClassName
string
The Data Class name.
filter
DynamicFilter
Filter object that is built using Casewhere.Runtime.DataObjectExpressions.DSL.FilterBuilder.
Returns
True if there is a Data Object satisfies the filter condition; otherwise, False.
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create()
.Eq("DepartmentId", ctx.Input.Id)
.Eq("Active", true)
.Build();
var any = dataApi.Any("Employee", filter);
if (any) Log.Info("There is Employee in the Department!!!");
ChangeCreator(string, string)
Update the CreatedBy attribute value of an Data object
public void ChangeCreator(string id, string value)
Parameters
id
string
Id of the Data Object to be updated.
value
string
The new CreatedBy value.
Examples
var dataApi = ctx.Use<IDataApi>();
var dataClass = dataApi.ChangeCreator("EmployeeUserName");
Clone(string, Guid?, bool)
Clone new object and add to database.
public string Clone(string id, Guid? caseId = null, bool notifyChange = true)
Parameters
id
string
The data object id to be cloned.
caseId
Guid?
Id of the case that the object will be added to. If null, the data object will be added to the case of the workflow.
notifyChange
bool
Skip the data change notification when updating data.
Returns
The new data object id.
Examples
var dataApi = ctx.Use<IDataApi>();
var clonedId = dataApi.Clone(id);
Copy(string, string, bool)
Copy data from one existing data object to another. Only properties that exist in both Data Classes are copied.
public void Copy(string srcId, string destId, bool notifyChange = true)
Parameters
srcId
string
The source data object id.
destId
string
The destination data object id.
notifyChange
bool
Skip the data change notification when updating data.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.Copy(srcId, desId);
Count(string, DynamicFilter)
Count the Data Objects that satisfies a condition.
public long Count(string dataClassName, DynamicFilter filter)
Parameters
dataClassName
string
The Data Class name.
filter
DynamicFilter
Filter object that is built using Casewhere.Runtime.DataObjectExpressions.DSL.FilterBuilder.
Returns
The number of Data Objects that satisfies the condition.
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create()
.Eq("DepartmentId", ctx.Input.Id)
.Eq("Active", true)
.Build();
var count = dataApi.Count("Employee", filter);
Log.Info("There are {Count} Employees in the Department", count);
Delete(string, bool)
Delete a Data Object.
public void Delete(string id, bool notifyChange = true)
Parameters
id
string
Id of the Data Object to be deleted.
notifyChange
bool
Skip the data change notification when updating data.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.Delete(orderId);
DeleteMany(string[], bool)
Delete multiple existing data objects based on a specified array of data object IDs.
public void DeleteMany(string[] doIds, bool notifyChange = true)
Parameters
doIds
string[]
notifyChange
bool
Skip the data change notification when updating data.
Examples
var dataApi = ctx.Use<IDataApi>();
var dataObjectIds = new string[] { "doId1", "doId2" };
dataApi.DeleteMany(dataObjectIds);
DeleteMany(DataObjectApiQuery, bool)
Delete multiple existing data objects based on a specified search query.
public void DeleteMany(DataObjectApiQuery query, bool notifyChange = true)
Parameters
query
DataObjectApiQuery
The search query.
notifyChange
bool
Skip the data change notification when updating data.
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create().Eq("DepartmentId", ctx.Input.Id).Eq("Active", true).Build();
var query = DataObjectApiQuery
.For("Employee")
.FilterBy(filter);
dataApi.DeleteMany(query);
DeleteMany(DataEnumerationQuery, CancellationToken, bool)
Delete multiple existing data objects based on a specified enumeration data object query.
public void DeleteMany(DataEnumerationQuery query, CancellationToken token = default, bool notifyChange = true)
Parameters
query
DataEnumerationQuery
An instance of the DataEnumerationQuery type. The param contains Data Class Name, Batch Size, Filter, ProjectedFields, SortedFields. The Instances of DataEnumerationQuery can't create directly. It is just create from static method DataEnumerationQuery.For("dataClassName").
token
CancellationToken
an instance of CancellationToken. If it isn't passed, the default value will be assigned.
notifyChange
bool
Skip the data change notification when updating data.
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create().Eq("Active", true).Build();
var query = DataEnumerationQuery
.For("Employee")
.FilterBy(filter);
dataApi.DeleteMany(query);
Enumerate(DataEnumerationQuery, CancellationToken)
Query and loop through an extensive collection without writing a lot of code for data paging, Which is also inefficient when dealing with 100k+ records.
public IEnumerable<DynamicDataObject> Enumerate(DataEnumerationQuery queryBuilder, CancellationToken token = default)
Parameters
queryBuilder
DataEnumerationQuery
An instance of the DataEnumerationQuery type. The param contains Data Class Name, Batch Size, Filter, ProjectedFields, SortedFields. The Instances of DataEnumerationQuery can't create directly. It is just create from static method DataEnumerationQuery.For("dataClassName").
token
CancellationToken
an instance of CancellationToken. If it isn't passed, the default value will be assigned.
Returns
IEnumerable<DynamicDataObject>
The method will returns DynamicDataObject list
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create().Eq("Active", true).Build();
var query = DataEnumerationQuery.For("Employee").FilterBy(filter);
var counter = 0;
foreach (var employee in dataApi.Enumerate(query))
{
var fullName = employee["FirstName"] + " " + employee["LastName"];
dataApi.Update(employee["Id"], new { FullName = fullName });
counter++;
if (counter % 100 == 0)
{
ctx.CommitChanges();
}
}
Enumerate(DataSourceEnumerationQuery, CancellationToken)
Query and loop through an extensive collection without writing a lot of code for data paging, Which is also inefficient when dealing with 100k+ records.
public IEnumerable<DynamicDataObject> Enumerate(DataSourceEnumerationQuery queryBuilder, CancellationToken token = default)
Parameters
queryBuilder
DataSourceEnumerationQuery
An instance of the DataSourceEnumerationQuery type. The param contains Data Source Name, Batch Size, Filter, ProjectedFields, SortedFields. The Instances of DataSourceEnumerationQuery can't create directly. It is just create from static method DataSourceEnumerationQuery.For("dataSourceName").
token
CancellationToken
an instance of CancellationToken. If it isn't passed, the default value will be assigned.
Returns
IEnumerable<DynamicDataObject>
The method will returns DynamicDataObject list
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create().Eq("Active", true).Eq("IsDeleted", false).Build();
var query = DataSourceEnumerationQuery.For("EmployeeWithCompany").FilterBy(filter);
foreach (var employee in dataApi.Enumerate(query))
{
var employee = item;
Log.Info("Employee - {name}", employee["Name"]);
var company = employee["Company"];
Log.Info("Company - {name}", company["Name"]);
}
EscapeSearchPhrase(string, string)
Escape the search phrase1. Use this method when you build the search phrase without FilterBuilder.
public string EscapeSearchPhrase(string dataClassName, string searchPhase)
Parameters
dataClassName
string
Name of the Data Class.
searchPhase
string
The search phrase.
Returns
The escaped search phrase.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.EscapeSearchPhrase("Employee", "a search phrase");
GetDataClass(string)
Get data class by name
public DataClass GetDataClass(string dataClassName)
Parameters
dataClassName
string
Name of data class.
Returns
DataClass
Data class by name.
Examples
var dataApi = ctx.Use<IDataApi>();
var dataClass = dataApi.GetDataClass("Employee");
GetSchema(string)
Load schema of a Data Source by name. This is useful for get data schema of a data source.
public IList<DataSourceField> GetSchema(string dataSourceName)
Parameters
dataSourceName
string
The Data Source name
Returns
A list of DataSourceField of data source
Examples
var dataApi = ctx.Use<IDataApi>();
var emplyeeSchema = dataApi.GetSchema("Employee");
Log.Info("This is schema {emplyeeSchema} of the Employee", emplyeeSchema);
HardDelete(params string[])
Remove any events and data of the data objects by their identifiers.
public void HardDelete(params string[] dataObjectIds)
Parameters
dataObjectIds
string[]
The identifiers of data objects.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.HardDelete(customerIds);
Inc(string, string, dynamic)
Increase value of an attribute by specified increment amount.
public void Inc(string id, string attributeName, dynamic value)
Parameters
id
string
The identifiers of the data object.
attributeName
string
The attribute name of the data object
value
dynamic
The increment amount of the data object.
Examples
var dataApi = ctx.Use<IDataApi>();
var customerId = ctx.Input["Id"];
var attributeName = "AvailableBalance";
var incrementAmount = 10000;
dataApi.Inc(customerId, attributeName, incrementAmount);
Load(string)
Load a Data Object by id.
public DynamicDataObject Load(string id)
Parameters
id
string
Id of the Data Object to be loaded.
Returns
DynamicDataObject
The Data Object.
Examples
var dataApi = ctx.Use<IDataApi>();
var department = dataApi.Load(departmentId);
Log.Info(department.Name);
Load(string, bool)
Force load a Data Object by id from the Database and update it to the cache.
public DynamicDataObject Load(string id, bool forceReload = false)
Parameters
id
string
Id of the Data Object to be loaded.
forceReload
bool
forceReload flag indicates whether to load data object directly from the Database and update it to the cache. Default value: false
Returns
DynamicDataObject
The Data Object.
Examples
var dataApi = ctx.Use<IDataApi>();
var department = dataApi.Load(departmentId, true);
Log.Info(department.Name);
Load(string, string)
Load a Data Object from a Data Source by id. This is useful for custom data loading e.g. query including related data objects.
public DynamicDataObject Load(string dataSourceName, string id)
Parameters
dataSourceName
string
The Data Source name.
id
string
Id of the Data Object to be loaded.
Returns
DynamicDataObject
The Data Object.
Examples
var dataApi = ctx.Use<IDataApi>();
var employee = dataApi.Load("EmployeesWithDepartments", employeeId);
Log.Info(employee.Department["Name"]);
Migrate(string, object, bool)
Migrate an Data Object with a specified ID. This method allows add or update a data object with a specified ID without using generated ID from system. Note: if canUpdateIfExist = false then the method will throw exception the specified ID already exits in DB
public void Migrate(string id, object data, bool canUpdateIfExist = false)
Parameters
id
string
Id of the Data Object to be updated or added
data
object
Data to be updated or added
canUpdateIfExist
bool
canUpdateIfExist flag indicates whether to update the data object if it have already exist. Default value: false
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.Migrate(orderId, new
{
Total = 20,
BillingAddress = "123 Sunset Blvd"
},
true);
Migrate(string, object, DslMigrationOption)
Migrate an Data Object with a specified ID. This method allows add or update a data object with a specified ID without using generated ID from system.
public void Migrate(string id, object data, DslMigrationOption option)
Parameters
id
string
Id of the Data Object to be updated or added
data
object
Data to be updated or added
option
DslMigrationOption
option object that is built using Casewhere.Runtime.DSL.DslMigrationOption.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.Migrate(orderId, new
{
Total = 20,
BillingAddress = "123 Sunset Blvd"
},
new DslMigrationOption(canUpdateIfExist: true, ignoreEnforceConstraints: true));
MoveToCase(string, Guid)
Move data object to a specific case.
public void MoveToCase(string id, Guid caseId)
Parameters
id
string
Id of the Data Object.
caseId
Guid
CaseId of the Data Object.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.MoveToCase(id, caseId);
Pull(string, string, params object[])
Pull data from an array attribute. This method is thread-safe. Schema elements that are equal to the input values will be removed.
public void Pull(string id, string attributeName, params object[] data)
Parameters
id
string
The data object id.
attributeName
string
The attribute name.
data
object[]
The pulled data.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.Pull(id, "Categories", "item1", "item2");
dataApi.Pull(id, "Categories", new string[]{ "item1", "item2" });
Push(string, string, params object[])
Push data to an array attribute. This method is thread-safe.
public void Push(string id, string attributeName, params object[] data)
Parameters
id
string
The data object id.
attributeName
string
The attribute name.
data
object[]
The pushed data.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.Push(id, "Categories", "item1", "item2");
dataApi.Push(id, "Categories", new string[]{ "item1", "item2" });
Search(DataObjectApiQuery)
Search Data Objects.
public DynamicQueryResult Search(DataObjectApiQuery query)
Parameters
query
DataObjectApiQuery
The search query.
Returns
Collection of Data Objects.
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create().Eq("DepartmentId", ctx.Input.Id).Eq("Active", true).Build();
var result = dataApi.Search(DataObjectApiQuery
.For("Employee")
.FilterBy(filter));
Log.Info("Total: {TotalItems}", result.TotalItems);
foreach(var emp in result.Data)
Log.Info("{Employee}", emp);
Search(DataSourceApiQuery)
Search Data Objects from a Data Source.
public DynamicQueryResult Search(DataSourceApiQuery query)
Parameters
query
DataSourceApiQuery
The search query.
Returns
Collection of Data Objects.
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create().Eq("DepartmentId", ctx.Input.Id).Eq("Active", true).Build();
var result = dataApi.Search(DataSourceApiQuery
.For("EmployeesWithDepartments")
.FilterBy(filter));
Log.Info("Total: {TotalItems}", result.TotalItems);
foreach(var emp in result.Data)
Log.Info("{DepartmentName}", emp.Department.Name);
SetContext(WorkflowContext)
public void SetContext(WorkflowContext context)
Parameters
context
WorkflowContext
Update(string, object, bool)
Update an existing Data Object.
public void Update(string id, object data, bool notifyChange = true)
Parameters
id
string
Id of the Data Object to be updated.
data
object
Data to be updated.
notifyChange
bool
Skip the data change notification when updating data.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.Update(orderId, new
{
Total = 20,
BillingAddress = "123 Sunset Blvd"
});
UpdateMany(string[], object, bool)
Updates multiple existing data objects based on an array of IDs with patch data.
public void UpdateMany(string[] doIds, object patchData, bool notifyChange = true)
Parameters
doIds
string[]
An array of IDs representing the data objects to be updated.
patchData
object
Data to be updated.
notifyChange
bool
Skip the data change notification when updating data.
Examples
var dataApi = ctx.Use<IDataApi>();
dataApi.UpdateMany(new string[] { "doId1", "doId2" }, new
{
Total = 20,
BillingAddress = "123 Sunset Blvd"
});
UpdateMany(DataObjectApiQuery, object, bool)
Updates multiple existing data objects based on a specified search query with patch data.
public void UpdateMany(DataObjectApiQuery query, object patchData, bool notifyChange = true)
Parameters
query
DataObjectApiQuery
The search query.
patchData
object
Data to be updated.
notifyChange
bool
To skip the data change notification on updating data.
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create().Eq("DepartmentId", ctx.Input.Id).Eq("Active", true).Build();
var query = DataObjectApiQuery
.For("Employee")
.FilterBy(filter);
dataApi.UpdateMany(query, new
{
Total = 20,
BillingAddress = "123 Sunset Blvd"
});
UpdateMany(DataEnumerationQuery, object, CancellationToken, bool)
Update multiple existing data objects based on a specified enumeration data object query with patch data.
public void UpdateMany(DataEnumerationQuery query, object patchData, CancellationToken token = default, bool notifyChange = true)
Parameters
query
DataEnumerationQuery
An instance of the DataEnumerationQuery type. The param contains Data Class Name, Batch Size, Filter, ProjectedFields, SortedFields. The Instances of DataEnumerationQuery can't create directly. It is just create from static method DataEnumerationQuery.For("dataClassName").
patchData
object
Data to be updated.
token
CancellationToken
an instance of CancellationToken. If it isn't passed, the default value will be assigned.
notifyChange
bool
To skip the data change notification on updating data.
Examples
var dataApi = ctx.Use<IDataApi>();
var filter = FilterBuilder.Create().Eq("DepartmentId", ctx.Input.Id).Eq("Active", true).Build();
var query = DataEnumerationQuery
.For("Employee")
.FilterBy(filter);
dataApi.UpdateMany(query,new
{
Total = 20,
BillingAddress = "123 Sunset Blvd"
});