Skip to main content

LQL - LASSO Query Language

Overview​

LQL (LASSO Query Language) is a language used to define the interface of a functional abstraction or concrete code unit (e.g., class). It plays a crucial role in the LASSO framework, enabling features such as:

  • Interface-driven code search (IDCS): LQL is translated into Solr/Lucene queries to retrieve textual candidates that match a given interface specification.
  • Sequence Sheet Notation (SSN): LQL defines the interface used by sequence sheets to identify units under test (e.g., class under test).

How it Works​

Interface-driven Code Search (IDCS)​

In IDCS, LQL is converted into Solr/Lucene queries and optional filter queries to retrieve a set of textual candidates that match a given interface specification.

Sequence Sheet Notation (SSN)​

LQL defines the interface used by sequence sheets to identify Systems Under Test (SUT).

ANTLR4 Grammar​

The grammar for LQL is written using ANTLR4. You can find it in:

  • Location: LQL.g4
  • Generated Java Stub: The Java stub is generated as part of Maven's build cycle (e.g., mvn package), see ANTLR4 Maven plugin.

JUnit Tests (Demonstrations)​

The existing JUnit tests demonstrate all features present in LQL:

Language​

Typical Format​

The typical format of a LQL interface definition is:

InterfaceName {
constructor(fullyQualifiedInputTypes*)
methodName(fullyQualifiedInputTypes*)->fullyQualifiedOutputTypes*
} filters*

where:

  • InterfaceName usually denotes the name of the functional abstraction at hand.
  • constructor an optional constructor (initializer).
  • methodName zero or more method signatures separated with newline, including an optional list of fully-qualified input parameter types as well as output parameter types separated by comma.

Stack Example​

Here's a sample interface definition for a Stack class:

Stack {
push(java.lang.Object)->java.lang.Object
pop()->java.lang.Object
peek()->java.lang.Object
size()->int
}

This example includes filters that represent a negative list in IDCS (fully optional):

!name_fq:Queue !name_fq:Deque

Placeholders​

In case the interface name is unimportant or missing, you can use placeholders like $ to denote any name:

$ {
encode(byte[])->java.lang.String
}

Note that placeholders must start with a dollar sign ($).

Filters​

Filters are fully optional. They can also be set in LSL using the _filter_ command as part of the selection action.