All Collections
Quick Guide
Using the Search effectively (Softagram Desktop)
Using the Search effectively (Softagram Desktop)

Softagram Search supports both basic and advanced use cases

Ville Laitila avatar
Written by Ville Laitila
Updated over a week ago

You can find the Search field to the right of basic navigation controls (back/forward/home). It has two purposes: show the current scope and act as a search field.

Basic Search

Quite often you want to find out certain elements from a huge model, like classes, functions or folders. Or you want to know which parts of the code deal with, say, bluetooth functionality.

This is very easy in Softagram: just type your search term to the search field and press Enter. The model will be filtered to only show the elements that match your search.

In the example below I searched for "parse"  in the OpenSSH Portable source code.

You can also see a hierarchical list of search results in the left sidebar (3 : Search).

Note: when you double-click any element in the search result, the search is no more active and the Search field shows current Scope again.

Search using @Attributes

Utilising attributes, you are able to create fast reports from your codebase. Look for example files that seems to be constantly broken; for that lets assume that fix to change ration is over 20% and files are changed over 100 times during last year, search for that would be "@fix_to_change_365 >0.2 AND @commit_count_365 >100"

(BTW, You find all available attributes explained here: )

Attribute search auto completion

Auto completion and suggestion of attributes is provided for every attribute name in search box as a drop down menu:

Key strokes used:

  • Tab/Enter - use selected suggestion, once suggestion popup is hidden Enter invokes search operation as before

  • Up/Down - cycle selection of suggestions on the list,

  • Esc - clear partially typed attribute and close suggestions

Also simple fuzzy filtering is provided to speed up typing, see example below:

Advanced Search

The basics of SFL: Softagram Filtering Language

One of the most handy use cases is the ability to filter the scope further with AND operator. This will further filter the model by invoking a free text search with “sound” keyword. The resulting visualization will hold only the elements that are found in the both queries.  

  •  “/DOOM3BFG/DOOM3BFG” AND sound

If you want to exclude particular element, NOT operator helps there combined with AND. This query will show main Doom 3 sound without Wave related functionality.

  • "/DOOM3BFG/DOOM3BFG/neo/sound" AND NOT wave

It is sometimes good to quickly filter out the unessential elements like libs, docs etc. This is the way to do it fast: just append AND NOT libs AND NOT docs in the end of your filter.


This is equivalent operation, but uses OR, and parentheses: 

  • “/DOOM3BFG/DOOM3BFG” AND NOT (docs OR libs)

Returing to the initial view and starting the next adventure

Search by attribute

With a search like this you can find out software elements that the other parts of the system depend heavily on

  • @user_count>100

You can also visualize your latest code contributions

  • @latest_commits=your name

Search the Dependencies Between Two Elements

With a simple syntax like A --> B you can find easily the immediate dependencies that originate from A and direct to B, here is an example: 

  • "/DOOM3BFG/DOOM3BFG/neo" --> "/DOOM3BFG/DOOM3BFG/doomclassic"

This shows how Doom3 NEO asset is dependent on some parts of the classic Doom software. 

It is also possible to use in more detailed fashion, on lower level constructs. This example shows how tr_backend_rendertools.cpp uses memset from constructs.h:

"/DOOM3BFG/DOOM3BFG/neo/renderer/tr_backend_rendertools.cpp" -function_ref_-> "/DOOM3BFG/DOOM3BFG/doomclassic/doom/constructs.h/memset"

Searching for Dependency Chains Between Two Elements 

With syntax of A --- B  (yes it is three dash characters!) you are able to invoke a graph traversal algorithm that seeks for all possible dependency chains from A to B, and B to A.
This query shows all routes between Init function and numEntitiesToDeactivate variable:

"/DOOM3BFG/DOOM3BFG/neo/d3xp/Game_local.h/idGameLocal/Init" --- "/DOOM3BFG/DOOM3BFG/neo/d3xp/Game_local.h/idGameLocal/numEntitiesToDeactivate"

Did this answer your question?