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.
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: http://help.softagram.com/reference/softagram-attributes-explained )
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:
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.
“/DOOM3BFG/DOOM3BFG” AND NOT docs AND NOT libs
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
You can also visualize your latest code contributions
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"