Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This is good example of how we can Eliminate bottlenecks with IguanaX. This is the problem. usePrefix Namespaces for Separating Concerns by building a custom file reader component which has a simple interface for a unique purpose rather than using a general purpose no code solution - see The problem with no-code solutions.

Here’s a scenario:

A large lab needs to have a file reading component which can feed files from different customers based on the prefix of the file, i.e. some files start with

...

JJ99, others XYZ etc. depending on the source.

How can we make a super streamlined component which:

  • Matches the requirements

  • Is easy to implement

  • Simplifies operations

Let’s do it!

Create component from Git URL
Expand
titleImport Use +FROM URL to import a custom version of the file reader from git@bitbucket.org:interfaceware/file_tutorial.git
component for this tutorial

This component generates some test files to make it easier to learn how to make a custom file reader.

You can useCreate component +FROM URL to import the component.

Copy paste the URL from here:

Code Block
git@bitbucket.org:interfaceware/file_tutorial.git

This component generates some test files to make it easier to learn how to do a file reader.

See Customizing components
Expand
titleCustomize it
Click Edit on the component card, then MAKE A COPY AND EDIT to open the Translator editor

Refer to Edit a Component to see how it's done if you have not done this before.

The original
Expand
Expand
titleWe need to modify the matching algorithm - what do we start with?
titleBuild a custom configuration

See Custom Fields - We can add Client ID List which will be a comma delimited list of the prefixes we want to filter on:

Image Removed
Expand
titleGenerate some test files

We need to first generate test files to work with.

In the File Reader main.lua, use the function MakeTestData()

Image Removed

It’s a good idea to re comment the code afterwards so it doesn’t keep generating test files in production!

Concepts used:

  • Commenting out code

  • iguana.isTest()

Examine the Custom Field configurations in the component in config.json

To simplify the tutorial we have set these up a ClientList with the filename prefix Ids. Click on the config.json and you should see:

Image Added

See Custom Fields to understand how this was created.

--What file extensions do we match? local FileExtensionMatchSet={ txt=true, log=true, hl7=true }

Expand
titleClick on MatchRules.lua in the Project Tree to see where we need to alter the code

Navigate to MatchRules.lua in the Project Tree. This is the function we need to alter:

Code Block
languagelua
function MatchFile(FileName)
   return true
end

The file reader component is deliberately simple and uses /wiki/spaces/IXB/pages/3181903910 separation of concerns to make it more obvious how to modify the code to meet new needs. So this is what we are starting off with. We need this function to return true when the matching criteria are met.

https://bitbucket.org/interfaceware/fromfile/src/main/MatchRules.lua

Code Block
Expand
titleLet's extract the filename using FILfilename() from the FIL Library, so we can look at it:

Change the matching to add in two lines so we can see the filenames we need to filter on.

Code Block
languagelua
function MatchFile(FileName)
   --local JustFileName = FILfilename(FileName)
   local Extn = FILextension(FileNametrace(JustFileName)
   Extnreturn = Extn:lower()
   return FileExtensionMatchSet[Extn]
endtrue
end

These are the concepts we have used:

code

We’ll apply /wiki/spaces/IXB/pages/3181903910 and write this as a function:

Expand
titleStart the new MatchFile logic with getting the list of prefixes and removing white space
Edit MatchRules.lua to extract the prefixes from the custom fields

Create a second function, APPidList, to extract the ClientList prefixes from the custom fields and update MatchFile to call APPidList.

You can replace the contents of the MatchRules.lua file with this new code:

Code Block
languagelua
function APPidList()
   local IdList = component.fields()["Client Id ListClientList"]
   return IdList
end
= IdList:split(","
function MatchFile(FileName)
   forlocal iIdList = 1,APPidList()
#IdList do  trace(IdList)
   local IdList[i]JustFileName = IdList[i]:trimWS()FILfilename(FileName)
   trace(JustFileName)
   return endtrue
end

These are the concepts we have Concepts used:

Expand
titleBreak the comma delimited string into a list to get each prefix Id

We can quickly do this by adding one line to AppidList after line 2:

Code Block
languagelua
IdList = IdList:split(",")
  • Iterating through a Lua table as list

  • Trimming white space

    You should see something like:

    Image Added

    Concepts used:

    Expand
    titleMake a matching function which takes the ID prefix and sees if the filename starts with it

    So now we make Create a third function, APPmatchPrefix, to determine if the file name matches filename matches the prefix. You can copy the code below:

    Code Block
    languagelua
    function APPmatchPrefix(Prefix, FileName)
       local Part = FileName:sub(1, #Prefix)
       trace(Part, Prefix)
       return (Part == Prefix)
    end

    See the screenshot below and add a line to MatchFile to call and invoke AppmatchPrefix.

    Image Added

    Concepts used:

    We write the new MatchFile function based on the functions we have written already:

    function MatchFile(FileName) local IdList = APPidList() local JustFileName = FILfilename(FileName)
    Expand
    titleNow put all change the matching logic together
    Code Block
    code in MatchFile() so we iterate through the prefix list

    Let’s modify the code to go through the entire list of prefixes:

    Code Block
    languagelua
    for i = 1, #IdList do
    
         if APPmatchPrefix(IdList[i], JustFileName) then 
             return true;
       end
    end
    return endfalse -- we didn't endmatch end

    Concepts used:

  • A function

  • FIL Library used to get the file name
    anything

    And this is what you should see:

    Image Added

    Concepts used:

    Expand
    titleCommit your changes, alter the component to run on the new commit, and run it!

    Commit and Push Changes to Git and go to the component card for Choosing the code to run for your component.

    You’re done! The next steps are how you could further refine the code

    Expand
    titleMake the configuration more robust by trimming the white space from the list of prefixes

    This means refining the APPidList function.

    That would involve looping through the list and removing white space from each ID:

    Image Added

    Concepts:

    Expand
    titleCustomize the logging using iguana.log*

    Add intuitive Custom Logging for your component to increase visibility into processing and adding meaningful messages to help with troubleshooting.

    You can see an example of this in main.lua on line 25:

    Code Block
    languagelua
    iguana.log("Polling every "..Polltime.." seconds");

    Try it for yourself!

    See Concatenating strings for a quick explanation on the double-dot notation.

    Expand
    titleCustomize the status using component.setStatus{data="Text"}

    Add Custom Status for your component to have it display real time updates at the bottom of the component card as its running.

    This component already creates custom status on lines 31-36 of main.lua.

    Try it for yourself!

    There is no limit to how you can streamline the usage of a custom component - if that helps address a bottleneck, then it is well worth it.