Expressions Cookbook (Concept): Difference between revisions
Dgreenwood (talk | contribs) |
Dgreenwood (talk | contribs) |
||
| Line 199: | Line 199: | ||
** <code>DateAdd("m", -3, DateField1)</code> | ** <code>DateAdd("m", -3, DateField1)</code> | ||
Reformatting / Normalization of values | Reformatting / Normalization of values | ||
* This example replaces any backslashes with underscores | * This example replaces any backslashes with underscores | ||
| Line 220: | Line 219: | ||
** <code>GetFieldInstance("Field Name").Location.ToString</code> | ** <code>GetFieldInstance("Field Name").Location.ToString</code> | ||
** Note, this returns logical location in inches, not pixels. So additional work would need to be performed to convert this to pixels if needed. | ** Note, this returns logical location in inches, not pixels. So additional work would need to be performed to convert this to pixels if needed. | ||
Get properties of a CMIS content link. Use this to return property values for a document linked in a CMIS Repository. | |||
* <code>CurrentDocument.ContentLink.GetCustomValue("propertyName").ToString</code> | |||
=== Validate Expressions === | === Validate Expressions === | ||
Revision as of 08:43, 1 October 2025
This article is a running list of code expressions used in Grooper, such as Default Value Expressions, Calculated Value Expressions, Should Submit Expressions and more.
Expressions are snippets of .NET code, allowing Grooper to do various things outside its "normal" parameters. This includes calculating or validating extracted Data Field values in a Data Model, applying conditional execution of a Batch Process or IP Profile, and more! This article collects examples of common (and maybe not so common) uses of expressions in Grooper.
|
😎 |
Special thanks to BIS team member Brian Godwin (and others on the Professional Services team) for contributing this article! |
Data Model Expressions
Default Value Expressions
Global/System Variables
"Literal value"
Literal string values. Insert a literal string value into the field using quotes.
25.00
Literal numeric values. Insert a literal numeric values entering the number only.
Now
Current date and time
Now.ToString("d")
Current date only
Now.ToString("t")
Current time only
DateAdd("d", 30, Now)
Date and time 30 days from now.
Guid.NewGuid
New Guid (Globally Unique IDentifier)
My.User.Name
Name of the current user
My.Computer.Name
Name of the local machine
Files and Links
Link.FullPath
Returns the attached file's path, including the file's name from a Batch Folder's content link.
Link.Path
Returns the attached file's path, not including the file's name from a Batch Folder's content link.
Link.PathSegments(0)
Returns the first segment in a file path from a Batch Folder's content link. For example, "servername" in "servername\folder\subfolder\file.pdf"
Folder.AttachmentFileName
Returns the attached file's name.
Folder.AttachmentFileExtension
Returns the attached file's extension.
IO.Path.GetFileNameWithoutExtension(Link.ObjectName)
Returns the attached file's name only (without the extension) from a Batch Folder's content link.
Link.LinkName
Returns the name of the link (e.g. "Import" or "Export") from a Batch Folder's content link.
DirectCast(Link,FileSystemLink).CreatedTime
Inserts the complete DateTime representing when the original file was created.
DirectCast(Link,FileSystemLink).LastModifiedTime
Inserts the complete DateTime representing when the original file was last modified.
DirectCast(Link,MailLink).Subject
Inserts the Subject of an Imported Email
DirectCast(Link,MailLink).From
Inserts the From field of an Imported Email
DirectCast(Link,MailLink).To
Inserts the To field of an Imported Email
DirectCast(Link,MailLink).Date
Inserts the Date field of an Imported Email
Content Types
ContentTypeName
Populates the field with the name of the document's Content Type (its classified Document Type)
Note: This is a shortcut for the expression Folder.ContentType.DisplayName
Folder.ContentType.ParentNode.DisplayName
Useful to populate fields with the name of the document's Document Type's parent Content Category.
Misc Default Value Expressions
Guid.NewGuid
Creates a new Globally Unique Identifier (GUID) and inserts the value.
Folder.Id
Inserts the GUID of the current Batch Folder.
Folder.Batch.Id
Inserts the GUID of the current Batch Folder's Batch, regardless of the current folder's level
Calculated Value Expressions
Addition of multiple fields
IntegerField1 + IntegerField2DecimalField1 + DecimalField2 + DecimalField3
Concatenation of multiple fields
String.Concat(StringField1, StringField2)String.Concat(StringField1, StringField2, StringField3)String.Concat(StringField1, StringField2, StringField3, StringField4)
Rounding
- This example rounds a decimal value to a precision of 4 digits (e.g. 2.34567891 to 2.3457)
Math.Round(DecimalField1, 4)
Non-integer addition (e.g. of date values)
- These examples increment a date by 30 days ("d"), 1 year ("yyyy"), and the last decrements the date by 3 months ("m")
DateAdd("d", 30, DateField1)DateAdd("yyyy", 1, DateField1)DateAdd("m", -3, DateField1)
Reformatting / Normalization of values
- This example replaces any backslashes with underscores
StringField1.Replace("\", "_")
- This example removes any backslashes
StringField1.Replace("\", "")
Substring calculation
- These examples extract information contained within a string "
ABC123456XXXX654321YYY" by designating the 0-based starting index and desired number of characters- ABC (first 3 characters):
StringField1.Substring(0, 3) - 123456 (6 characters within the string):
StringField1.Substring(3, 6) - XXXX (4 characters within the string):
StringField1.Substring(9, 4) - YYY (last 3 characters):
StringField1.Substring(StringField1.Length - 3)
- ABC (first 3 characters):
Getting the location coordinates of a field on the document
- This could be used to determine the coordinates and size of an extracted value on a document.
GetFieldInstance("Field Name").Location.ToString- Note, this returns logical location in inches, not pixels. So additional work would need to be performed to convert this to pixels if needed.
Get properties of a CMIS content link. Use this to return property values for a document linked in a CMIS Repository.
CurrentDocument.ContentLink.GetCustomValue("propertyName").ToString
Validate Expressions
Date in past / future
- This example ensures the date value is a past date
DateField1 < Now
- This example ensures the date value is at least 30 days in the future
DateField1 >= DateAdd("d", 30, Now)
Equality / inequality of two fields (multiple options)
StringField1 = StringField2IntegerField1.Equals(IntegerField2)IntegerField1 <> DecimalField1Not DecimalField1.Equals(DecimalField2)
Summing fields and comparing to another field
IntegerField1 + IntegerField2 = IntegerField3DecimalField1 + DecimalField2 = DecimalField3DecimalField1 = SumFieldInstance("Table1\AmountColumn")
Running regular expression against field
Text.RegularExpressions.Regex.IsMatch(StringField1, "[0-9]{6}")
Inspecting field-level confidence scores
Instance.Confidence > 0.8
Batch Processing Expressions
Should Submit Expression
Inspecting flagged status
- These examples would submit the task when the object (i.e. folder, page) is flagged or not flagged (2nd example)
Item.FlaggedNot Item.Flagged
- This example would submit the task when the object (folder) contains one or more flagged pages
DirectCast(Item, BatchFolder).FlaggedPages.Any()
Inspecting flagged message
Item.FlagReason = "Needs classification"Item.FlagReason <> "Bypass review"
Inspecting presence of local copy in Grooper
DirectCast(Item, BatchFolder).HasLocalCopy
Inspecting existence of native version
DirectCast(Item, BatchFolder).HasAttachment
Inspecting MIME type
- This example would submit the task when the object's (folder) represents a native PDF or the second if its mime type is PDF
DirectCast(Item, BatchFolder).IsNativePDFDirectCast(Item, BatchFolder).AttachmentMimeType = "application/pdf"
Inspecting content type / parent content category
DirectCast(Item, BatchFolder).ContentTypeName = "MyContentType"DirectCast(DirectCast(Item, BatchFolder).ContentType.ParentNode, ContentCategory).Name = "MyContentCategory"
Inspecting if a field is blank / populated
DirectCast(Item, BatchFolder).IndexData.Fields("StringField1").Value <> ""Not String.IsNullOrEmpty(DirectCast(Item, BatchFolder).IndexData.Fields("StringField1").Value)
Inspecting image properties (resolution, color mode, aspect ratio, size (in bytes), pixel count, etc.)
DirectCast(Item, BatchPage).PrimaryImage.ResolutionX < 240DirectCast(Item, BatchPage).PrimaryImage.IsBinaryDirectCast(Item, BatchPage).PrimaryImage.IsColorDirectCast(Item, BatchPage).PrimaryImage.IsLandscapeDirectCast(Item, BatchPage).PrimaryImage.AspectRatio > 1.25DirectCast(Item, BatchPage).PrimaryImage.Size > 40960DirectCast(Item, BatchPage).PrimaryImage.PixelCount > 3500000
Inspecting presence of layout data (of a certain type: lines, OMR boxes, etc.)
DirectCast(Item, BatchFolder).HasLayoutData
Does page / document have OCR text?
DirectCast(Item, BatchFolder).HasRuntimeOCRDirectCast(Item, BatchPage).HasRuntimeOCR
Inspecting classification candidates and classification scores, incl. alternate candidate scores
DirectCast(Item, BatchFolder).ContentTypeName = "Document Type Name"
Functions and Should Submits
Grooper can now use lambda functions in expressions (and not just Should Submits, all expressions!). This gives you some really advanced capabilities if you have more advanced .NET programing skills.
This example determines if a page scoped task, like Recognize or Execute > Rasterize should be submitted depending on how many text segments are present on a PDF page. If the PDF page has less than 15 text segments, the tasks submits, otherwise the PDF page is not processed.
- This is useful when dealing with poorly formed PDFs that must be forced to be treated like an image when Grooper otherwise thinks they are a native text document.
Function() As Boolean
If DirectCast(Item, BatchPage).IsPDF
Dim doc As Grooper.PDF.PdfDoc = New Grooper.PDF.PdfDoc(DirectCast(Item, BatchPage).GetImageVersion, True)
Dim info As Grooper.PDF.PdfPageInfo = doc.Sharp.GetPageInfo(0)
Return (info.DrawTextOps.Count < 15)
End If
End Function
You could change what property values determine if the task is submitted by changing the Return statement in the function. Here are some examples:
Return info.PageType = PDF.PdfPageInfo.PageTypes.Mixed- Tasks would submit if the PDF's page type is "Mixed"Return info.RenderResolution = "Color @ 300 DPI"- Tasks would submit if the PDF's render format is Color @ 300 DPI.Return info.PageSize = "8.50"" x 11.00"""- Tasks would submit if the PDF's page size is 8.5 x 11.Return info.Images.Count = 4- Tasks would submit if PDF has exactly 4 images embedded in it.Return info.PathSegments.Count > 257- Tasks would submit if the PDF has more than 257 vector drawing paths.
Next Step Expressions
Inspecting batch creator
If(Batch.CreatedBy.ToLower() = "domain\jusername", TrueStepName, FalseStepName)If(Batch.CreatedByDisplayName = "Joe Username", TrueStepName, FalseStepName)
Inspecting creation time (range, day of week)
If(DatePart(DateInterval.Month, Batch.Created) = 6, TrueStepName, FalseStepName)If(DatePart(DateInterval.Day, Batch.Created) > 15, TrueStepName, FalseStepName)
IP Profile Expressions
IP Command Should Execute Expressions
Inspecting image properties (resolution, color mode, aspect ratio, size, pixel count, etc.)
Image.ResolutionX < 240Image.IsBinaryImage.IsColorImage.IsLandscapeImage.AspectRatio > 1.25Image.Size > 40960Image.PixelCount > 3500000
Inspecting presence of layout data (of a certain type: lines, OMR boxes, etc.)
Results.Line_Detection.HorizontalLines.Any()Results.Line_Detection.VerticalLines.Any()Results.Box_Detection.Boxes.Any()Results.Patch_Code_Detection.PatchCodes.Any()
Decisioning based on image classification (Results.ClassifyImage.whatever)
Results.Classify_Image.ClassName = "Sample 1"
Accessing and inspecting results log of prior IP commands
Results.Measure_Entropy.Entropy > 0.85
Inspecting whether prior commands modified image(s)
ResultList.IsImageSourceImage
Mapping Expressions
Import Mapping Expressions
Value concatenation
String.Concat(field1, field2)String.Concat(field1, " ", field2)
Value padding (adding or removing)
- These examples show how to left-pad a value with zeroes for 20 characters, right-pad a value with spaces for 40 characters, and finally trim a padded value of spaces.
field1.PadLeft(20, "0"c)field2.PadRight(40)field3.Trim()
Adding environment variables (date, user, etc.)
NowEnvironment.MachineNameEnvironment.UserNameEnvironment.UserDomainNameEnvironment.OSVersionEnvironment.ProcessorCount
Export Mapping Expressions
Addition of multiple fields
IntegerField1 + IntegerField2DecimalField1 + DecimalField2 + DecimalField3
Concatenation of multiple fields
String.Concat(StringField1, StringField2)String.Concat(StringField2, ", ", StringField1, ": ", StringField3)
How to access Grooper attributes (content type name, GUID, index data, etc.)
CurrentDocument.ContentTypeNameCurrentDocument.IdCurrentDocument.IndexData.Sections("Section1").Fields("Field1").ValueCurrentDocument.IndexData.Sections("Section1").Sections("SectionA").Fields("Field1A").ValueCurrentDocument.IndexData.Tables("Table1").Rows.First().Cells("Column1").Value
Naming based on original file name
IO.Path.GetFileNameWithoutExtension(CurrentDocument.ContentLink.Name)
Converting a date field to a string in a "year-month-day" format
DateField.ToString("yyyy-MM-dd")
Misc Expression Snippets
These expressions may or may not be useful by themselves. It's most likely they are used as part of a larger expression. They are documented here to keep track of previously requested solutions.
Count the number of children at a certain level. This would count the number of Batch Folders that are direct children of a Batch Folder being processed.
ChildrenAtLevel(1).Count
Count the number of children at a certain level of a parent folder. This would count the number of Batch Folders that are direct children of the parent Batch Folder relative to the Batch Folder being processed.
ParentFolder.ChildrenAtLevel(1).Count
General
|
WIP |
This section is a work-in-progress. It needs to be expanded for completeness. |
Understanding how to traverse hierarchy of, e.g. batch or content model
Understanding how to parse tables by row & column
Identifying Sections by instance number
How to inspect properties of node
Dynamic referencing vs. GUID referencing
Conditional expressions with IIF / IF
Using LINQ in Expressions
Direct Casting: when to (Cast)