- Introduction
- Project Status
- Getting Started
- As a Shell-Scripting Language Alternative
- Basic Features
- Array Comprehensions
- Array Literals
- Dataframe Literals
- Define and Instantiate JVM classes
- Dictionary/Object Literals
- Implicit Class Declarations
- Implicit Class Importing
- Matrix and Vector Literals
- Matter of taste
- String Literals (Double-quoted)
- String Literals (Single-quoted)
- String Literals (Triple-Double-quoted)
- String Literals (Triple-Single-quoted)
- Featured Examples By Category
- Aggregation and Sorting (25)
- Concurrency (10)
- Control Flow (21)
- Dataframe I/O (23)
- Dataframe Management (14)
- Filtering and Matching (25)
- JVM and Reflection (14)
- REPL Tools (32)
- Scope and Session (15)
- System Tools (15)
- Testing - Unit/Integration (5)
- Transformation (8)
Lollypop is a general-purpose programming/scripting language for the JVM. Features include:
- Native support for Scala and Java classes, objects and packages.
- Native support for JSON (arrays, dictionaries and objects).
- Native support for Maven package repositories.
- Data-oriented types - Dataframes, BLOB/CLOB and Matrices and Vectors.
- Multi-paradigm programming model - declarative/SQL, functional, object-oriented and reactive.
Preview — there are still a number of experimental features to sort out.
sbt "project core" clean assembly
The Jar binary should be ./app/core/target/scala-2.13/core-assembly-0.1.6.9.jar
sbt "project jdbc_driver" clean assembly
The Jar binary should be ./app/jdbc-driver/target/scala-2.13/jdbc-driver-assembly-0.1.6.9.jar
sbt "project core" run
OR
java -jar ./app/core/target/scala-2.13/core-assembly-0.1.6.9.jar
Lollypop offers developers the opportunity to use a Scala/SQL-hybrid scripting language for writing shell-scripts. And because your scripts will be running within the JVM you can leverage Maven Central and the myriads of libraries available to it.
Lollypop provides native variants of the following UNIX-like commands:
- cat - Retrieves the contents of a file.
- cd - Changes the current directory.
- cp - Copies a source file or directory to a target.
- echo - Prints text to the standard output.
- find - Returns a dataframe containing a recursive list of files matching any specified criterion.
- ls - Returns a dataframe containing a list of files matching any specified criterion.
- md5 - Returns an MD5 digest of a file or byte-encode-able value.
- mkdir - Creates a new directory.
- mv - Renames a file or moves the file to a directory.
- pwd - Retrieves the contents of a file.
- rm - Removes a file or a collection of files via pattern-matching.
- rmdir - Removes a specific directory.
- rmr - Recursively removes files or collections of files via pattern-matching.
- touch - Creates or updates the last modified time of a file. Return true if successful.
- wc - Returns the count of lines of a text file.
- www - A non-interactive HTTP client
- What if I ask you to write some Bash code to retrieve the top 5 largest files by size in descending order?
Could you write it without consulting a search engine or manual pages? Off the cuff, here's what I came up with to do it. It's crude, and it only works on the Mac...
ls -lS ./app/examples/ | grep -v ^total | head -n 5
-rw-r--r--@ 1 ldaniels staff 4990190 Nov 11 23:50 stocks-100k.csv
-rw-r--r--@ 1 ldaniels staff 336324 Nov 11 23:50 stocks.csv
-rw-r--r--@ 1 ldaniels staff 249566 Nov 11 23:50 stocks-5k.csv
drwxr-xr-x@ 6 ldaniels staff 192 Jul 5 14:57 target
drwxr-xr-x@ 5 ldaniels staff 160 Jul 5 14:52 src
And here's the equivalent in Lollypop:
ls app/examples where not isHidden order by length desc limit 5
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| stocks-100k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-100k.csv | 2023-11-12T07:50:27.490Z | 4990190 | false | true | false |
| stocks-5k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-5k.csv | 2023-11-12T07:50:27.491Z | 249566 | false | true | false |
| .DS_Store | /Users/ldaniels/GitHub/lollypop/app/examples/.DS_Store | 2023-11-12T05:53:49.722Z | 6148 | false | true | true |
| target | /Users/ldaniels/GitHub/lollypop/app/examples/target | 2023-07-05T21:57:46.435Z | 192 | true | false | false |
| companylist | /Users/ldaniels/GitHub/lollypop/app/examples/companylist | 2023-11-12T07:50:27.476Z | 128 | true | false | false |
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
- What if I ask for the same as above except find files recursively?
find './app/examples/' where not isHidden order by length desc limit 5
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| stocks-100k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-100k.csv | 2023-11-12T07:50:27.490Z | 4990190 | false | true | false |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
- What if you want a list of the top 5 CPU hungry processes?
def ps() := TableArray((? ps aux ?).map(x =>
x.trim()
.replaceAll(" ", " ")
.split("[ ]")
.filter(x => not x.isEmpty())
))
select PID, `%CPU`, `%MEM`, STARTED, TIME, VSZ, RSS
from (ps())
order by `%CPU` desc
limit 5
|--------------------------------------------------------------------|
| PID | %CPU | %MEM | STARTED | TIME | VSZ | RSS |
|--------------------------------------------------------------------|
| 1542 | 83.6 | 0.2 | 13Dec23 | 1657:48.74 | 36408744 | 231972 |
| 25369 | 19.1 | 10.7 | Thu09AM | 728:56.39 | 438577760 | 10803088 |
| 21272 | 12.4 | 3.2 | 9:39AM | 0:25.86 | 437902704 | 3271536 |
| 28637 | 8.2 | 0.6 | Wed04PM | 414:47.08 | 1594687744 | 612032 |
| 360 | 8.1 | 0.8 | 13Dec23 | 669:52.88 | 416009088 | 790640 |
|--------------------------------------------------------------------|
The system command iostat 1 5
yielded the following text output:
disk0 disk4 disk5 cpu load average
KB/t tps MB/s KB/t tps MB/s KB/t tps MB/s us sy id 1m 5m 15m
37.13 105 3.80 127.34 11 1.31 1017.11 6 5.97 10 4 86 2.79 2.33 2.18
22.67 3 0.07 0.00 0 0.00 0.00 0 0.00 5 3 92 2.79 2.33 2.18
0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 6 3 91 2.65 2.31 2.17
0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 7 3 90 2.65 2.31 2.17
0.00 0 0.00 0.00 0 0.00 0.00 0 0.00 7 3 90 2.65 2.31 2.17
We could use system evaluation tags (?
and ?)
to easily capture then parse them into a dataframe:
def iostat(n, m) := TableArray((? iostat $n $m ?).drop(1).map(x =>
x.trim()
.replaceAll(" ", " ")
.split("[ ]")
.filter(x => not x.isEmpty())
))
iostat(1, 5)
|--------------------------------------------------------------------------------------------------|
| KB/t | tps | MB/s | KB/t | tps | MB/s | KB/t | tps | MB/s | us | sy | id | 1m | 5m | 15m |
|--------------------------------------------------------------------------------------------------|
| 37.19 | 105 | 3.81 | 37.19 | 105 | 3.81 | 37.19 | 105 | 3.81 | 10 | 4 | 86 | 2.62 | 2.44 | 2.43 |
| 5.62 | 338 | 1.85 | 5.62 | 338 | 1.85 | 5.62 | 338 | 1.85 | 18 | 5 | 78 | 2.62 | 2.44 | 2.43 |
| 22.67 | 3 | 0.07 | 22.67 | 3 | 0.07 | 22.67 | 3 | 0.07 | 11 | 4 | 85 | 2.62 | 2.44 | 2.43 |
| 0.0 | 0 | 0.0 | 0.0 | 0 | 0.0 | 0.0 | 0 | 0.0 | 11 | 4 | 85 | 2.62 | 2.44 | 2.43 |
| 0.0 | 0 | 0.0 | 0.0 | 0 | 0.0 | 0.0 | 0 | 0.0 | 10 | 4 | 85 | 2.62 | 2.44 | 2.43 |
|--------------------------------------------------------------------------------------------------|
Now we have a dataframe (table) containing the metrics outputted by iostat
Description: Define logical arrays
['A' to 'F'].reverse()
['F', 'E', 'D', 'C', 'B', 'A']
Description: Define arrays and apply monadic functions
[1, 3, 5, 7].foldLeft(0, (a, b) => a + b)
16
Description: Produces graphical charts
graph { shape: "pie3d", title: "Powered By Lollypop" } from (
|------------------|
| exchange | total |
|------------------|
| NASDAQ | 24 |
| AMEX | 5 |
| NYSE | 28 |
| OTCBB | 32 |
| OTHEROTC | 7 |
|------------------|
)
Description: Creates a new ephemeral (in-memory) JVM-compatible class
class StockQuote(symbol: String, exchange: String, lastSale: Double, lastSaleTime: Date)
stock = new StockQuote("ABC", "OTCBB", 0.0231, DateTime())
stock.toString()
StockQuote("ABC", "OTCBB", 0.0231, "2024-01-26T01:17:50.900Z")
Description: Dynamically create objects (e.g. JSON)
response = { 'message1' : 'Hello World' }
response.message2 = 'Hallo Monde'
response.message3 = ['Hello', 'Hallo', 'World', 'Monde']
response
{"message1": "Hello World", "message2": "Hallo Monde", "message3": ["Hello", "Hallo", "World", "Monde"]}
Description: Binds a virtual method to a class
implicit class `java.lang.String` {
def reverseString(self) := {
import "java.lang.StringBuilder"
val src = self.toCharArray()
val dest = new StringBuilder(self.length())
val eol = self.length() - 1
var n = 0
while (n <= eol) {
dest.append(src[eol - n])
n += 1
}
dest.toString()
}
}
"Hello World".reverseString()
dlroW olleH
Description: Imports the methods of a Scala implicit class
import implicit "com.lollypop.util.StringRenderHelper$StringRenderer"
DateTime().renderAsJson()
"2024-01-26T01:17:50.945Z"
Description: Creates a new matrix
vector = [2.0, 1.0, 3.0]
matrixA = new Matrix([
[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]
])
matrixA * vector
[13.0, 31.0, 49.0]
Description: The solution to a problem can be achieved many different ways...
import 'java.lang.Runtime'
rt = Runtime.getRuntime()
chart = { shape: "pie3d", title: "Memory Usage" }
graph chart from {
// (1) the following declarative expression ...
[{ name: 'totalMemory', value: rt.totalMemory() },
{ name: 'freeMemory', value: rt.freeMemory() }].toTable()
// (2) and the following SQL statement ...
select name: 'totalMemory', value: rt.totalMemory()
union
select name: 'freeMemory', value: rt.freeMemory()
// (3) and the following multi-paradigm statement are all equivalent.
transpose(select totalMemory: rt.totalMemory(), freeMemory: rt.freeMemory())
}
Description: Declare strings
item = { name : "Larry" }
"Hello {{ item.name }},\nhow are you?\nFine, I hope!"
Hello Larry,
how are you?
Fine, I hope!
Description: Declare strings
item = { name : "Larry" }
'Hello {{ item.name }},\nhow are you?\nFine, I hope!'
Hello Larry,
how are you?
Fine, I hope!
Description: Declare multiline strings
item = { name : "Larry" }
"""|Hello {{ item.name }},
|how are you?
|Fine, I hope!
|""".stripMargin('|')
Hello Larry,
how are you?
Fine, I hope!
Description: Declare multiline strings
item = { name : "Larry" }
'''|Hello {{ item.name }},
|how are you?
|Fine, I hope!
|'''.stripMargin('|')
Hello Larry,
how are you?
Fine, I hope!
Description: Computes the average of a numeric expression.
val stocks =
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| XYZ | AMEX | 31.95 |
| ABC | NYSE | 56.12 |
| DNS | AMEX | 97.61 |
|------------------------------|
avg(stocks#lastSale)
61.89333333333334
Description: Computes the average of a numeric expression.
val stocks =
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| XYZ | AMEX | 31.95 |
| ABC | NYSE | 56.12 |
| DNS | AMEX | 97.61 |
|------------------------------|
select avgLastSale: avg(lastSale) from @stocks
|-------------------|
| avgLastSale |
|-------------------|
| 61.89333333333334 |
|-------------------|
Description: Returns the number of rows matching the query criteria.
stocks =
|---------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NYSE | RPPI | 51.8413 | 2023-09-28T00:58:42.974Z |
| AMEX | MDLA | 177.1311 | 2023-09-28T00:58:44.363Z |
| OTCBB | VMUT | | 2023-09-28T00:58:35.392Z |
| AMEX | QTZUA | 120.5353 | 2023-09-28T00:58:08.024Z |
| OTCBB | JCJMT | | 2023-09-28T00:58:17.985Z |
| NASDAQ | EMY | 24.6447 | 2023-09-28T00:58:22.595Z |
|---------------------------------------------------------|
count(stocks)
6
Description: Returns the number of rows matching the query criteria.
stocks =
|---------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NYSE | RPPI | 51.8413 | 2023-09-28T00:58:42.974Z |
| AMEX | MDLA | 177.1311 | 2023-09-28T00:58:44.363Z |
| OTCBB | VMUT | | 2023-09-28T00:58:35.392Z |
| AMEX | QTZUA | 120.5353 | 2023-09-28T00:58:08.024Z |
| OTCBB | JCJMT | | 2023-09-28T00:58:17.985Z |
| NASDAQ | EMY | 24.6447 | 2023-09-28T00:58:22.595Z |
|---------------------------------------------------------|
count(stocks#lastSale)
6
Description: Returns the number of rows matching the query criteria.
stocks =
|---------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NYSE | RPPI | 51.8413 | 2023-09-28T00:58:42.974Z |
| AMEX | MDLA | 177.1311 | 2023-09-28T00:58:44.363Z |
| OTCBB | VMUT | | 2023-09-28T00:58:35.392Z |
| AMEX | QTZUA | 120.5353 | 2023-09-28T00:58:08.024Z |
| OTCBB | JCJMT | | 2023-09-28T00:58:17.985Z |
| NASDAQ | EMY | 24.6447 | 2023-09-28T00:58:22.595Z |
|---------------------------------------------------------|
select total: count(*) from @stocks
|-------|
| total |
|-------|
| 6 |
|-------|
Description: Returns the number of rows matching the query criteria.
stocks =
|---------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NYSE | RPPI | 51.8413 | 2023-09-28T00:58:42.974Z |
| AMEX | MDLA | 177.1311 | 2023-09-28T00:58:44.363Z |
| OTCBB | VMUT | | 2023-09-28T00:58:35.392Z |
| AMEX | QTZUA | 120.5353 | 2023-09-28T00:58:08.024Z |
| OTCBB | JCJMT | | 2023-09-28T00:58:17.985Z |
| NASDAQ | EMY | 24.6447 | 2023-09-28T00:58:22.595Z |
|---------------------------------------------------------|
select total: count(lastSale) from @stocks
|-------|
| total |
|-------|
| 4 |
|-------|
Description: Returns the distinct number of rows matching the query criteria.
stocks =
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| VDON | OTCBB | 0.4002 | 2023-07-29T05:06:56.232Z |
| XETQ | OTCBB | 5.1147 | 2023-07-29T05:06:56.233Z |
| XGDJ | NASDAQ | 51.5446 | 2023-07-29T05:06:56.236Z |
| FQPY | NASDAQ | 75.4873 | 2023-07-29T05:06:56.238Z |
| VNQR | NASDAQ | 38.5333 | 2023-07-29T05:06:56.239Z |
|---------------------------------------------------------|
select total: count(unique(exchange)) from @stocks
|-------|
| total |
|-------|
| 2 |
|-------|
Description: Returns the distinct number of rows matching the query criteria.
stocks =
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| VDON | OTCBB | 0.4002 | 2023-07-29T05:06:56.232Z |
| XETQ | OTCBB | 5.1147 | 2023-07-29T05:06:56.233Z |
| XGDJ | NASDAQ | 51.5446 | 2023-07-29T05:06:56.236Z |
| FQPY | NASDAQ | 75.4873 | 2023-07-29T05:06:56.238Z |
| VNQR | NASDAQ | 38.5333 | 2023-07-29T05:06:56.239Z |
|---------------------------------------------------------|
select total: countUnique(exchange) from @stocks
|-------|
| total |
|-------|
| 2 |
|-------|
Description: Aggregates a result set by a column
select kind, total: count(*)
from (this)
group by kind
|------------------------|
| kind | total |
|------------------------|
| PrintStream | 2 |
| Random$ | 1 |
| OS | 1 |
| WebSockets$ | 1 |
| BufferedReader | 1 |
| Double | 1 |
| Nodes | 1 |
|------------------------|
Description: Aggregates a result set by a column
chart = { shape: "pie3d", title: "Types in Session" }
graph chart from (
select kind, total: count(*)
from (this)
group by kind
)
Description: Returns the maximum value of a numeric expression.
val stocks =
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| XYZ | AMEX | 31.95 |
| ABC | NYSE | 56.12 |
| DNS | AMEX | 97.61 |
|------------------------------|
max(stocks#lastSale)
97.61
Description: Returns the maximum value of a numeric expression.
val stocks =
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| XYZ | AMEX | 31.95 |
| ABC | NYSE | 56.12 |
| DNS | AMEX | 97.61 |
|------------------------------|
select maxLastSale: max(lastSale) from @stocks
|-------------|
| maxLastSale |
|-------------|
| 97.61 |
|-------------|
Description: Returns the minimum value of a numeric expression.
val stocks =
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| XYZ | AMEX | 31.95 |
| ABC | NYSE | 56.12 |
| DNS | AMEX | 97.61 |
|------------------------------|
min(stocks#lastSale)
31.95
Description: Returns the minimum value of a numeric expression.
val stocks =
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| XYZ | AMEX | 31.95 |
| ABC | NYSE | 56.12 |
| DNS | AMEX | 97.61 |
|------------------------------|
select minLastSale: min(lastSale) from @stocks
|-------------|
| minLastSale |
|-------------|
| 31.95 |
|-------------|
Description: Sorts a result set by a column
from (
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| HWWM | NASDAQ | 191.6725 | 2023-08-06T18:33:08.661Z |
| VLYW | AMEX | 197.9962 | 2023-08-06T18:33:08.670Z |
| VSOM | NASDAQ | 166.8542 | 2023-08-06T18:33:08.672Z |
| FHWS | NYSE | 22.5909 | 2023-08-06T18:33:08.673Z |
| SRGN | AMEX | 180.2358 | 2023-08-06T18:33:08.675Z |
| PTFY | NYSE | 19.9265 | 2023-08-06T18:33:08.676Z |
|---------------------------------------------------------|
) order by lastSale desc
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| VLYW | AMEX | 197.9962 | 2023-08-06T18:33:08.670Z |
| HWWM | NASDAQ | 191.6725 | 2023-08-06T18:33:08.661Z |
| SRGN | AMEX | 180.2358 | 2023-08-06T18:33:08.675Z |
| VSOM | NASDAQ | 166.8542 | 2023-08-06T18:33:08.672Z |
| FHWS | NYSE | 22.5909 | 2023-08-06T18:33:08.673Z |
| PTFY | NYSE | 19.9265 | 2023-08-06T18:33:08.676Z |
|---------------------------------------------------------|
Description: Returns the sum of a numeric expression.
stocks = (
|-------------------|
| symbol | lastSale |
|-------------------|
| VHLH | 153.2553 |
| GPI | 89.7307 |
| SGE | 131.6038 |
| GVABB | 31.1324 |
| GTIT | 110.6881 |
| JDXEZ | 243.4389 |
| RNUBE | 157.2571 |
| DBY | 237.5894 |
| CO | 109.6587 |
| BIU | 232.9175 |
|-------------------|
)
sum(stocks#lastSale)
1497.2719
Description: Returns the sum of a numeric expression.
select total: sum(lastSale) from (
|-------------------|
| symbol | lastSale |
|-------------------|
| VHLH | 153.2553 |
| GPI | 89.7307 |
| SGE | 131.6038 |
| GVABB | 31.1324 |
| GTIT | 110.6881 |
| JDXEZ | 243.4389 |
| RNUBE | 157.2571 |
| DBY | 237.5894 |
| CO | 109.6587 |
| BIU | 232.9175 |
|-------------------|
)
|-----------|
| total |
|-----------|
| 1497.2719 |
|-----------|
Description: Transforms an array of an array of primitive values (Boolean, Int, String et al) into a table
def iostat(n, m) := TableArray((? iostat $n $m ?).drop(1).map(x =>
x.trim()
.replaceAll(" ", " ")
.split("[ ]")
.filter(x => not x.isEmpty())
))
iostat(1, 5)
|-------------------------------------------------------------------------------|
| KB/t | tps | MB/s | KB/t | tps | MB/s | us | sy | id | 1m | 5m | 15m |
|-------------------------------------------------------------------------------|
| 12.25 | 93 | 1.11 | 12.25 | 93 | 1.11 | 5 | 2 | 92 | 2.77 | 1.95 | 1.84 |
| 5.09 | 180 | 0.89 | 5.09 | 180 | 0.89 | 8 | 4 | 88 | 2.77 | 1.95 | 1.84 |
| 13.8 | 40 | 0.54 | 13.8 | 40 | 0.54 | 6 | 30 | 63 | 2.77 | 1.95 | 1.84 |
| 58.17 | 426 | 24.22 | 58.17 | 426 | 24.22 | 20 | 21 | 60 | 2.77 | 1.95 | 1.84 |
| 5.56 | 317 | 1.72 | 5.56 | 317 | 1.72 | 33 | 4 | 63 | 2.95 | 2.0 | 1.85 |
|-------------------------------------------------------------------------------|
Description: Transforms an array of an array of primitive values (Boolean, Int, String et al) into a table
def ps() := TableArray((? ps aux ?).map(x =>
x.trim()
.replaceAll(" ", " ")
.split("[ ]")
.filter(x => not x.isEmpty())
))
select PID, `%CPU`, `%MEM`, STARTED, TIME, VSZ, RSS
from (ps())
order by `%CPU` desc
limit 5
|------------------------------------------------------------------|
| PID | %CPU | %MEM | STARTED | TIME | VSZ | RSS |
|------------------------------------------------------------------|
| 631 | 171.4 | 5.5 | 8:28PM | 154:16.00 | 437002000 | 5561856 |
| 364 | 35.3 | 0.3 | 8:28PM | 82:15.83 | 414302976 | 343232 |
| 61927 | 29.7 | 0.2 | 5:17PM | 0:01.05 | 412760112 | 151424 |
| 368 | 2.2 | 0.2 | 8:28PM | 0:16.36 | 410507360 | 197856 |
| 1516 | 1.6 | 0.2 | 8:28PM | 13:26.75 | 36774968 | 186684 |
|------------------------------------------------------------------|
Description: Makes columns into rows and rows into columns. The function returns a table with the rows and columns transposed.
transpose(items: [1 to 5])
|-------|
| items |
|-------|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
|-------|
Description: Makes columns into rows and rows into columns. The function returns a table with the rows and columns transposed.
faces = transpose(face: ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"])
suits = transpose(suit: ["♠", "♦", "♥", "♣"])
deck = faces * suits
deck.shuffle()
@deck limit 5
|-------------|
| face | suit |
|-------------|
| K | ♥ |
| 6 | ♣ |
| J | ♦ |
| 9 | ♥ |
| 3 | ♥ |
|-------------|
Description: Makes columns into rows and rows into columns. The function returns a table with the rows and columns transposed.
transpose(help('select'))
|----------------------------------------------------------------------------------------------------|
| name | value |
|----------------------------------------------------------------------------------------------------|
| name | select |
| category | Dataframe I/O |
| paradigm | Declarative |
| description | Returns row(s) of data based on the expression and options |
| example | select symbol: 'GMTQ', exchange: 'OTCBB', lastSale: 0.1111, lastSaleTime: DateTime() |
|----------------------------------------------------------------------------------------------------|
Description: Makes columns into rows and rows into columns. The function returns a table with the rows and columns transposed.
transpose(new Matrix([
[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]
]))
|-----------------|
| A | B | C |
|-----------------|
| 1.0 | 4.0 | 7.0 |
| 2.0 | 5.0 | 8.0 |
| 3.0 | 6.0 | 9.0 |
|-----------------|
Description: Returns a unique collection of elements based on the query criteria.
val stocks =
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| XYZ | AMEX | 31.95 |
| ABC | NYSE | 56.12 |
| YOKE | NYSE | 56.12 |
| DNS | AMEX | 97.61 |
|------------------------------|
select exchange: unique(exchange) from @stocks
|------------------|
| exchange |
|------------------|
| ["AMEX", "NYSE"] |
|------------------|
Description: Separates the elements of a collection expression into multiple rows, or the elements of map expr into multiple rows and columns.
declare table stocks(symbol: String(4), exchange: String(6), transactions: Table(price: Double, transactionTime: DateTime)[5])
insert into @stocks (symbol, exchange, transactions)
values ('AAPL', 'NASDAQ', {price:156.39, transactionTime:"2021-08-05T19:23:11.000Z"}),
('AMD', 'NASDAQ', {price:56.87, transactionTime:"2021-08-05T19:23:11.000Z"}),
('INTC', 'NYSE', {price:89.44, transactionTime:"2021-08-05T19:23:11.000Z"}),
('AMZN', 'NASDAQ', {price:988.12, transactionTime:"2021-08-05T19:23:11.000Z"}),
('SHMN', 'OTCBB', [{price:0.0010, transactionTime:"2021-08-05T19:23:11.000Z"},
{price:0.0011, transactionTime:"2021-08-05T19:23:12.000Z"}])
select symbol, exchange, unnest(transactions) from @stocks where symbol is 'SHMN'
|-------------------------------------------------------|
| symbol | exchange | price | transactionTime |
|-------------------------------------------------------|
| SHMN | OTCBB | 0.001 | 2021-08-05T19:23:11.000Z |
| SHMN | OTCBB | 0.0011 | 2021-08-05T19:23:12.000Z |
|-------------------------------------------------------|
Description: Schedules a one-time execution of command(s) after a specific delay period
var ticker = 5
after Duration('100 millis') ticker += 3
import "java.lang.Thread"
Thread.sleep(Long(250))
ticker is 8
true
Description: Asynchronously executes an instruction
async { OS.listFiles("./app") }
|-------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|-------------------------------------------------------------------------------------------------------------------------------------|
| .DS_Store | /Users/ldaniels/GitHub/lollypop/app/.DS_Store | 2024-01-04T03:50:40.658Z | 8196 | false | true | true |
| core | /Users/ldaniels/GitHub/lollypop/app/core | 2023-05-23T21:20:11.818Z | 160 | true | false | false |
| target | /Users/ldaniels/GitHub/lollypop/app/target | 2023-12-20T23:40:00.523Z | 160 | true | false | false |
| examples | /Users/ldaniels/GitHub/lollypop/app/examples | 2023-11-12T07:50:27.491Z | 288 | true | false | false |
| jdbc-driver | /Users/ldaniels/GitHub/lollypop/app/jdbc-driver | 2023-06-29T22:26:20.960Z | 160 | true | false | false |
|-------------------------------------------------------------------------------------------------------------------------------------|
Description: Schedules the execution of command(s) on a specific interval
var n = 0
val timer = every Duration("20 millis") n += 1
import "java.lang.Thread"
Thread.sleep(Long(1000))
timer.cancel()
n
51
Description: Executes a statement on a running Lollypop peer node.
node = Nodes.start()
node.awaitStartup(Duration('1 second'))
results = node.exec('''
from (
|-------------------------------------------------------|
| ticker | market | lastSale | lastSaleTime |
|-------------------------------------------------------|
| NKWI | OTCBB | 98.9501 | 2022-09-04T23:36:47.846Z |
| AQKU | NASDAQ | 68.2945 | 2022-09-04T23:36:47.860Z |
| WRGB | AMEX | 46.8355 | 2022-09-04T23:36:47.862Z |
| ESCN | AMEX | 42.5934 | 2022-09-04T23:36:47.865Z |
| NFRK | AMEX | 28.2808 | 2022-09-04T23:36:47.864Z |
|-------------------------------------------------------|
) where lastSale < 30
''')
node.stop()
results
|-------------------------------------------------------|
| ticker | market | lastSale | lastSaleTime |
|-------------------------------------------------------|
| NFRK | AMEX | 28.2808 | 2022-09-04T23:36:47.864Z |
|-------------------------------------------------------|
Description: Creates a new REST API endpoint.
node = Nodes.start()
node.awaitStartup(Duration('1 second'))
node.api('/api/comments/', {
post: (message: String) => "post '{{message}}'"
get: (id: UUID) => "get {{(id}}"
put: (id: UUID, message: String) => "put '{{message}}' ~> {{(id}}"
delete: (id: UUID) => "delete {{(id}}"
})
www post "http://0.0.0.0:{{node.port}}/api/comments/" <~ { message: "Hello World" }
HttpResponse(body="post 'Hello World'", message="OK", statusCode=200, responseID=db18af2a-8c17-4773-8d99-44abde36a708)
Description: Opens a commandline interface to a remote Lollypop peer node.
node = Nodes.start()
node.awaitStartup(Duration('1 second'))
try
node.exec(["x = 1", "y = 2", "z = x + y", "z"])
catch e => stderr <=== e
finally
node.stop()
|--------|
| result |
|--------|
| 3 |
|--------|
Description: Creates a new HTML/CSS/File endpoint
node = Nodes.start()
node.awaitStartup(Duration('1 second'))
node.files('/www/notebooks/', {
"" : "public/index.html",
"*" : "public"
})
false
Description: Invokes an instruction or set of instructions one-time only
[1 to 5].foreach(n => {
stdout <=== 'This happens every cycle {{n}}\n'
once stdout <=== 'This happens once {{n}}\n'
})
()
This happens every cycle 1
This happens once 1
This happens every cycle 2
This happens every cycle 3
This happens every cycle 4
This happens every cycle 5
Description: Executes an instruction at the moment the conditional expression evaluates as true
whenever n_bricks is 0 { stdout <=== "n_bricks is empty\n" }
stdout <=== "Setting n_bricks to 0\n"
n_bricks = 0
stdout <=== "Did it work?"
java.io.PrintStream@b144175
Setting n_bricks to 0
n_bricks is empty
Did it work?
Description: Executes an instruction at the moment the regular expression evaluates as true
whenever '^set(.*)'
stdout <=== "instruction was '{{__INSTRUCTION__}}'\n"
set x = { message: "Confirmed" }
stdout <=== "Did it work?"
java.io.PrintStream@b144175
instruction was 'set x = { message: "Confirmed" }'
Did it work?
Description: Binds multiple statements together
declare table if not exists TradingSystem (
stock_id: RowNumber,
symbol: String(5),
exchange: Enum ('AMEX', 'NASDAQ', 'NYSE', 'OTCBB', 'OTHEROTC'),
lastSale: Double,
lastSaleTime: DateTime = DateTime())
&& insert into TradingSystem (symbol, exchange, lastSale, lastSaleTime)
values ("MSFT", "NYSE", 56.55, DateTime()),
("AAPL", "NASDAQ", 98.55, DateTime()),
("AMZN", "NYSE", 56.55, DateTime()),
("GOOG", "NASDAQ", 98.55, DateTime())
&& from TradingSystem
|--------------------------------------------------------------------|
| stock_id | symbol | exchange | lastSale | lastSaleTime |
|--------------------------------------------------------------------|
| 0 | MSFT | NYSE | 56.55 | 2024-01-26T01:17:57.495Z |
| 1 | AAPL | NASDAQ | 98.55 | 2024-01-26T01:17:57.495Z |
| 2 | AMZN | NYSE | 56.55 | 2024-01-26T01:17:57.495Z |
| 3 | GOOG | NASDAQ | 98.55 | 2024-01-26T01:17:57.495Z |
|--------------------------------------------------------------------|
Description: ???
can be used for marking methods that remain to be implemented.
def blowUp() := ???
try
blowUp()
catch e =>
stdout <=== e.getMessage()
java.io.PrintStream@b144175
an implementation is missing on line 3 at 3
Description: Executes a stored procedure; returns a row set
namespace "test.examples"
stockQuotes =
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| DBGK | AMEX | 46.2471 | 2023-08-06T04:50:07.478Z |
| GROT | NASDAQ | 44.3673 | 2023-08-06T04:50:07.480Z |
| SCOF | NASDAQ | 60.8058 | 2023-08-06T04:50:07.482Z |
| CYCR | NASDAQ | 83.9982 | 2023-08-06T04:50:07.483Z |
| IIDA | NASDAQ | 126.3182 | 2023-08-06T04:50:07.484Z |
|---------------------------------------------------------|
drop if exists getStockQuote
create procedure getStockQuote(theExchange: String,
--> exchange: String,
--> total: Double,
--> maxPrice: Double,
--> minPrice: Double) as
select exchange, total: count(*), maxPrice: max(lastSale), minPrice: min(lastSale)
from @stockQuotes
where exchange is theExchange
group by exchange
call getStockQuote("NASDAQ")
|----------------------------------------|
| exchange | total | maxPrice | minPrice |
|----------------------------------------|
| NASDAQ | 4.0 | 126.3182 | 44.3673 |
|----------------------------------------|
Description: Creates a function
create function if not exists calc_add(a: Int, b: Int) := a + b
|------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|------------------------------------------------------------------------------------------------------|
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | [] |
|------------------------------------------------------------------------------------------------------|
Description: Creates a persistent macro
namespace "temp.examples"
create macro if not exists n_tickers := "tickers %e:qty" {
[1 to qty].map(_ => {
exchange = ['AMEX', 'NASDAQ', 'NYSE', 'OTCBB', 'OTHER_OTC'][Random.nextInt(5)]
is_otc = exchange.startsWith("OT")
lastSaleLimit = switch exchange case "OTCBB" then 5.0 case "OTHER_OTC" then 1.0 case _ then 100.0
lastSale = scaleTo(lastSaleLimit * Random.nextDouble(1.0), 4)
lastSaleTime = DateTime(DateTime() - Duration(1000 * 60 * Random.nextDouble(1.0)))
symbol = Random.nextString(['A' to 'Z'], iff(exchange.startsWith("OT"), Random.nextInt(2) + 4, Random.nextInt(4) + 2))
select lastSaleTime, lastSale, exchange, symbol
}).toTable()
}
tickers 5
|---------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NASDAQ | CSBZ | 84.8772 | 2024-01-26T01:17:43.050Z |
| NYSE | FPOQW | 42.8732 | 2024-01-26T01:17:34.628Z |
| OTCBB | TEPXJ | 4.7204 | 2024-01-26T01:17:37.340Z |
| NYSE | GMXIG | 99.286 | 2024-01-26T01:17:54.627Z |
| NASDAQ | EQWH | 39.5633 | 2024-01-26T01:17:27.957Z |
|---------------------------------------------------------|
Description: Creates a database procedure
namespace "test.examples"
stockQuotes =
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| DBGK | AMEX | 46.2471 | 2023-08-06T04:50:07.478Z |
| GROT | NASDAQ | 44.3673 | 2023-08-06T04:50:07.480Z |
| SCOF | NASDAQ | 60.8058 | 2023-08-06T04:50:07.482Z |
| CYCR | NASDAQ | 83.9982 | 2023-08-06T04:50:07.483Z |
| IIDA | NASDAQ | 126.3182 | 2023-08-06T04:50:07.484Z |
|---------------------------------------------------------|
drop if exists getStockQuote
create procedure getStockQuote(theExchange: String,
--> exchange: String,
--> total: Double,
--> maxPrice: Double,
--> minPrice: Double) :=
select exchange, total: count(*), maxPrice: max(lastSale), minPrice: min(lastSale)
from @stockQuotes
where exchange is theExchange
group by exchange
call getStockQuote("NASDAQ")
|----------------------------------------|
| exchange | total | maxPrice | minPrice |
|----------------------------------------|
| NASDAQ | 4.0 | 126.3182 | 44.3673 |
|----------------------------------------|
Description: Defines a named user-defined function
def ¡(n: Double) := iff(n <= 1.0, 1.0, n * ¡(n - 1.0))
¡(5)
120.0
Description: Defines a named user-defined function
def msec(op) := {
import ["java.lang.System"]
val startTime = System.nanoTime()
val result = op()
val elapsedTime = (System.nanoTime() - startTime) / 1000000.0
(elapsedTime, result)
}
def ¡(n: Double) := iff(n <= 1.0, 1.0, n * ¡(n - 1.0))
msec(() => ¡(6))
Tuple2(_1=0.383, _2=720.0)
Description: Defines a named user-defined function
def roman(value: Int) := ("I" * value)
.replaceAll("IIIII", "V")
.replaceAll("IIII", "IV")
.replaceAll("VV", "X")
.replaceAll("VIV", "IX")
.replaceAll("XXXXX", "L")
.replaceAll("XXXX", "XL")
.replaceAll("LL", "C")
.replaceAll("LXL", "XC")
.replaceAll("CCCCC", "D")
.replaceAll("CCCC", "CD")
.replaceAll("DD", "M")
.replaceAll("DCD", "CM")
roman(1023)
MXXIII
Description: Creates a loop that executes enclosed statement(s) until the test condition evaluates to false
var x = 0
var y = 1
do { x += 1; y *= x } while x < 5
y
120
Description: Iterates over a dataframe applying a function to each entry
stocks =
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| LORI | NYSE | 89.6033 | 2023-07-29T04:09:04.524Z |
| AVSR | AMEX | 477.5694 | 2023-07-29T04:09:04.529Z |
| KXYP | OTCBB | 475.6416 | 2023-07-29T04:09:04.531Z |
| JYVV | NYSE | 197.1071 | 2023-07-29T04:09:04.532Z |
| EVDX | OTCBB | 77.1829 | 2023-07-29T04:09:04.533Z |
|---------------------------------------------------------|
var messages = []
each item in (select symbol, lastSale from @stocks where lastSale < 100)
messages = messages.push('{{item.symbol}} is {{item.lastSale}}/share')
messages
["LORI is 89.6033/share", "EVDX is 77.1829/share"]
Description: Iterates a dataframe in reverse order applying a function to each entry
stocks =
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| OTHER_OTC | WAEQK | 0.6713 | 2023-10-14T18:40:32.998Z |
| NASDAQ | RQNMU | 19.6168 | 2023-10-14T18:40:32.335Z |
| NASDAQ | WP | 45.7338 | 2023-10-14T18:40:24.264Z |
| OTHER_OTC | NNFO | 0.151 | 2023-10-14T18:39:51.236Z |
| NASDAQ | LVEBB | 8.4378 | 2023-10-14T18:39:58.491Z |
| NASDAQ | SWTD | 22.5552 | 2023-10-14T18:39:50.783Z |
| OTHER_OTC | CZYBQ | 0.8543 | 2023-10-14T18:40:40.513Z |
| NASDAQ | CQ | 174.0586 | 2023-10-14T18:39:55.858Z |
| NYSE | QOVGA | 1.9199 | 2023-10-14T18:40:14.590Z |
| NYSE | ZJWL | 17.3107 | 2023-10-14T18:40:13.205Z |
|----------------------------------------------------------|
each item in (stocks.reverse()) yield item
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| NYSE | ZJWL | 17.3107 | 2023-10-14T18:40:13.205Z |
| NYSE | QOVGA | 1.9199 | 2023-10-14T18:40:14.590Z |
| NASDAQ | CQ | 174.0586 | 2023-10-14T18:39:55.858Z |
| OTHER_OTC | CZYBQ | 0.8543 | 2023-10-14T18:40:40.513Z |
| NASDAQ | SWTD | 22.5552 | 2023-10-14T18:39:50.783Z |
| NASDAQ | LVEBB | 8.4378 | 2023-10-14T18:39:58.491Z |
| OTHER_OTC | NNFO | 0.151 | 2023-10-14T18:39:51.236Z |
| NASDAQ | WP | 45.7338 | 2023-10-14T18:40:24.264Z |
| NASDAQ | RQNMU | 19.6168 | 2023-10-14T18:40:32.335Z |
| OTHER_OTC | WAEQK | 0.6713 | 2023-10-14T18:40:32.998Z |
|----------------------------------------------------------|
Description: If the expression
is true, then outcomeA
otherwise outcomeB
value = 123
if(value > 99) "Yes!" else "No."
Yes!
Description: If the condition
is true, then trueValue
otherwise falseValue
value = 123
iff(value > 99, 'Yes!', 'No.')
Yes!
Description: Creates a user-defined instruction
macro "drawCircle ( %e:size ) @ ( %e:x , %e:y )" := {
"Circle({{size}}) <- ({{x * 2}}, {{y / 2}})"
}
stdout <=== drawCircle(100)@(80, 650)
Circle(100) <- (160, 325)
Description: Returns a result set (from a daughter scope)
return 'Hello World'
Hello World
Description: Throws a JVM exception
try
throw new `java.lang.RuntimeException`('A processing error occurred')
catch e => stdout <=== e.getMessage()
java.io.PrintStream@b144175
A processing error occurred on line 2 at 3
Description: Attempts an operation and catches any exceptions that occur preventing them from stopping program execution
def connect() := throw new `java.lang.RuntimeException`("Connection error")
try connect() catch e => stderr <=== e.getMessage()
java.io.PrintStream@fee7ca
Connection error on line 1 at 17 on line 2 at 5
Description: Attempts an operation and catches any exceptions that occur preventing them from stopping program execution
var n = 0
try n /= 0 catch e => stderr <=== e.getMessage() finally n = -1
this
|-------------------------------------------------------------------------------------------------------------|
| name | kind | value |
|-------------------------------------------------------------------------------------------------------------|
| WebSockets | WebSockets$ | lollypop.io.WebSockets$@1e23ee0e |
| n | Integer | -1 |
| stdout | PrintStream | java.io.PrintStream@b144175 |
| stdin | BufferedReader | java.io.BufferedReader@1ac3a6f |
| stderr | PrintStream | java.io.PrintStream@fee7ca |
| OS | OS | lollypop.lang.OS |
| π | Double | 3.141592653589793 |
| Nodes | Nodes | lollypop.io.Nodes@29c80149 |
| e | DivisionByZeroError | com.lollypop.runtime.errors.DivisionByZeroError: Division by zero: n / 0 |
| Random | Random$ | lollypop.lang.Random |
|-------------------------------------------------------------------------------------------------------------|
Division by zero: n / 0
Description: Repeats the command
while the expression
is true
var x = 0
var y = 1
while x < 5 do { x += 1; y *= x }
y
120
Description: Provides a closure over a resource; closing it upon completion.
namespace "temp.examples"
drop if exists `Stocks`
create table `Stocks` (
symbol: String(8),
exchange: Enum (AMEX, NASDAQ, NYSE, OTCBB, OTHEROTC),
lastSale: Double
) containing (
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAXX | NYSE | 56.12 |
| UPEX | NYSE | 116.24 |
| XYZ | AMEX | 31.95 |
| JUNK | AMEX | 97.61 |
| ABC | OTCBB | 5.887 |
|------------------------------|
)
with ns("Stocks") { stocks => @stocks where lastSale < 50 }
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| XYZ | AMEX | 31.95 |
| ABC | OTCBB | 5.887 |
|------------------------------|
Description: Returns a column slice of a data frame
declare table stocks(symbol: String(4), exchange: String(6), lastSale: Double, lastSaleTime: DateTime)
containing (
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NQOO | AMEX | 190.1432 | 2023-08-10T01:44:20.075Z |
| LVMM | NASDAQ | 164.2654 | 2023-08-10T01:44:20.092Z |
| VQLJ | AMEX | 160.753 | 2023-08-10T01:44:20.093Z |
| LRBJ | OTCBB | 64.0764 | 2023-08-10T01:44:20.095Z |
| QFHM | AMEX | 148.6447 | 2023-08-10T01:44:20.096Z |
|---------------------------------------------------------|
)
stocks#[symbol, lastSale]
|-------------------|
| symbol | lastSale |
|-------------------|
| NQOO | 190.1432 |
| LVMM | 164.2654 |
| VQLJ | 160.753 |
| LRBJ | 64.0764 |
| QFHM | 148.6447 |
|-------------------|
Description: Deletes rows matching an expression from a table
val stocks =
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| OWWO | NYSE | 483.0286 |
| SJJR | OTCBB | 56.7381 |
| EGXY | OTCBB | 309.8648 |
| NXSQ | OTCBB | 254.2278 |
| LQRQ | AMEX | 88.42 |
|------------------------------|
delete from @stocks where symbol is "EGXY"
stocks
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| OWWO | NYSE | 483.0286 |
| SJJR | OTCBB | 56.7381 |
| NXSQ | OTCBB | 254.2278 |
| LQRQ | AMEX | 88.42 |
|------------------------------|
Description: Returns a table representing the layout of the query expression
describe (select v1: 123, v2: 'abc')
|------------------------------------------------------------|
| name | type | description | defaultValue | isNullable |
|------------------------------------------------------------|
| v1 | Int | | | |
| v2 | String(3) | | | |
|------------------------------------------------------------|
Description: Retrieves rows from a datasource
from [{ item: "Apple" }, { item: "Orange" }, { item: "Cherry" }]
|--------|
| item |
|--------|
| Apple |
| Orange |
| Cherry |
|--------|
Description: Produces graphical charts from dataframes
graph { shape: "pie3d", title: "Exchange Exposure" } from (
|------------------|
| exchange | total |
|------------------|
| NASDAQ | 24 |
| AMEX | 5 |
| NYSE | 28 |
| OTCBB | 32 |
| OTHEROTC | 7 |
|------------------|
)
Description: Produces graphical charts from queries
chart = { shape: "pie", title: "Member Types of OS" }
graph chart from (
select memberType, total: count(*) from (membersOf(OS))
group by memberType
)
Description: Produces graphical charts declaratively or procedurally
chart = { shape: "scatter", title: "Scatter Demo" }
samples = {
import "java.lang.Math"
def series(x) := "Series {{ (x % 2) + 1 }}"
select w, x, y from ([0 to 500]
.map(x => select w: series(x), x, y: x * iff((x % 2) is 0, Math.cos(x), Math.sin(x)))
.toTable())
}
graph chart from samples
Description: Appends new row(s) to a table
stagedActors =
|------------------------------------------|
| name | popularity | ratio |
|------------------------------------------|
| John Wayne | 42 | 0.4206 |
| Carry Grant | 87 | 0.8712 |
| Doris Day | 89 | 0.8907 |
| Audrey Hepburn | 97 | 0.9732 |
| Gretta Garbeaux | 57 | 0.5679 |
|------------------------------------------|
declare table Actors (name: String(64), popularity: Int)
insert into Actors (name, popularity) select name, popularity from @stagedActors
graph { shape: "bar", title: "Popularity" } from Actors
Description: Appends new row(s) to a table
declare table Stocks(symbol: String(8), exchange: String(8), transactions: Table(price: Double, transactionTime: DateTime))
insert into Stocks (symbol, exchange, transactions)
values ('AAPL', 'NASDAQ', {"price":156.39, "transactionTime":"2021-08-05T19:23:11.000Z"}),
('AMD', 'NASDAQ', {"price":56.87, "transactionTime":"2021-08-05T19:23:11.000Z"}),
('INTC','NYSE', {"price":89.44, "transactionTime":"2021-08-05T19:23:11.000Z"}),
('AMZN', 'NASDAQ', {"price":988.12, "transactionTime":"2021-08-05T19:23:11.000Z"}),
('SHMN', 'OTCBB', [{"price":0.0010, "transactionTime":"2021-08-05T19:23:11.000Z"},
{"price":0.0011, "transactionTime":"2021-08-05T19:23:12.000Z"}])
insert into Stocks#transactions (price, transactionTime)
values (35.11, "2021-08-05T19:23:12.000Z"),
(35.83, "2021-08-05T19:23:15.000Z"),
(36.03, "2021-08-05T19:23:17.000Z")
where symbol is 'AMD'
|---------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|---------------------------------------------------------------------------------------------------------|
| 0 | 0 | 0 | 0 | 3 | 1 | 5 | 0 | 0 | [6, 7, 8] |
|---------------------------------------------------------------------------------------------------------|
Description: Computes the intersection of two queries
from (
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAXX | NYSE | 56.12 |
| UPEX | NYSE | 116.24 |
| XYZ | AMEX | 31.95 |
| ABC | OTCBB | 5.887 |
|------------------------------|
) intersect (
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| JUNK | AMEX | 97.61 |
| AAXX | NYSE | 56.12 |
| ABC | OTCBB | 5.887 |
|------------------------------|
)
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAXX | NYSE | 56.12 |
| ABC | OTCBB | 5.887 |
|------------------------------|
Description: Inserts a result set into a table
pennyStocks = Table(symbol: String(10), exchange: String(10), lastSale: Double, lastSaleTime: DateTime)
from (
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| OTHER_OTC | YVWY | 0.5407 | 2023-09-21T04:47:37.370Z |
| OTHER_OTC | EPOFJ | 0.8329 | 2023-09-21T04:47:27.720Z |
| OTHER_OTC | QEQA | 0.7419 | 2023-09-21T04:48:07.901Z |
| OTHER_OTC | SFWCS | 0.9577 | 2023-09-21T04:47:54.694Z |
| OTHER_OTC | VBJHF | 0.8121 | 2023-09-21T04:47:56.769Z |
| OTHER_OTC | SDLMF | 0.2186 | 2023-09-21T04:48:18.913Z |
| OTHER_OTC | JXDZ | 0.0157 | 2023-09-21T04:48:08.459Z |
| OTCBB | ZMNF | 0.5647 | 2023-09-21T04:47:23.112Z |
| OTCBB | VVAH | 0.5786 | 2023-09-21T04:47:40.420Z |
| OTCBB | HSCKG | 0.2719 | 2023-09-21T04:47:43.268Z |
| OTCBB | SHDF | 0.0161 | 2023-09-21T04:57:07.529Z |
| OTCBB | QJGVO | 0.0026 | 2023-09-21T04:57:39.230Z |
| OTHER_OTC | PMBFY | 0.0139 | 2023-09-21T04:57:46.146Z |
| OTCBB | CAVY | 0.0047 | 2023-09-21T04:57:43.503Z |
|----------------------------------------------------------|
) where lastSale <= 0.02 into @pennyStocks
|----------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|----------------------------------------------------------|
| JXDZ | OTHER_OTC | 0.0157 | 2023-09-21T04:48:08.459Z |
| SHDF | OTCBB | 0.0161 | 2023-09-21T04:57:07.529Z |
| QJGVO | OTCBB | 0.0026 | 2023-09-21T04:57:39.230Z |
| PMBFY | OTHER_OTC | 0.0139 | 2023-09-21T04:57:46.146Z |
| CAVY | OTCBB | 0.0047 | 2023-09-21T04:57:43.503Z |
|----------------------------------------------------------|
Description: Setups a pagination query
stocks =
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| OTCBB | RPYM | 0.4932 | 2023-10-02T01:57:31.086Z |
| OTCBB | EGBQ | 0.6747 | 2023-10-02T01:57:09.991Z |
| OTHER_OTC | PEMCQ | 0.6176 | 2023-10-02T01:57:23.684Z |
| NASDAQ | IPHBY | 113.9129 | 2023-10-02T01:57:01.837Z |
| NASDAQ | HLOQW | 159.1307 | 2023-10-02T01:57:50.139Z |
| NYSE | WQN | 177.4067 | 2023-10-02T01:57:17.371Z |
| NASDAQ | JONV | 139.6465 | 2023-10-02T01:57:55.758Z |
| NASDAQ | KKLPE | 135.2768 | 2023-10-02T01:57:07.520Z |
| AMEX | KHGRO | 163.3631 | 2023-10-02T01:57:21.286Z |
| NASDAQ | GSCF | 75.8721 | 2023-10-02T01:57:21.640Z |
| NASDAQ | ZEP | 91.009 | 2023-10-02T01:57:03.740Z |
| OTHER_OTC | KMUEH | 0.2605 | 2023-10-02T01:57:03.702Z |
| OTCBB | WLXIM | 0.6886 | 2023-10-02T01:57:45.739Z |
| NASDAQ | OVTS | 153.5991 | 2023-10-02T01:57:23.061Z |
| OTCBB | YGIVQ | 0.8364 | 2023-10-02T01:57:38.882Z |
|----------------------------------------------------------|
stocksP = pagination(select * from stocks)
stocksP.first(5)
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| OTCBB | RPYM | 0.4932 | 2023-10-02T01:57:31.086Z |
| OTCBB | EGBQ | 0.6747 | 2023-10-02T01:57:09.991Z |
| OTHER_OTC | PEMCQ | 0.6176 | 2023-10-02T01:57:23.684Z |
| NASDAQ | IPHBY | 113.9129 | 2023-10-02T01:57:01.837Z |
| NASDAQ | HLOQW | 159.1307 | 2023-10-02T01:57:50.139Z |
|----------------------------------------------------------|
Description: Setups a pagination query
stocks =
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| OTCBB | RPYM | 0.4932 | 2023-10-02T01:57:31.086Z |
| OTCBB | EGBQ | 0.6747 | 2023-10-02T01:57:09.991Z |
| OTHER_OTC | PEMCQ | 0.6176 | 2023-10-02T01:57:23.684Z |
| NASDAQ | IPHBY | 113.9129 | 2023-10-02T01:57:01.837Z |
| NASDAQ | HLOQW | 159.1307 | 2023-10-02T01:57:50.139Z |
| NYSE | WQN | 177.4067 | 2023-10-02T01:57:17.371Z |
| NASDAQ | JONV | 139.6465 | 2023-10-02T01:57:55.758Z |
| NASDAQ | KKLPE | 135.2768 | 2023-10-02T01:57:07.520Z |
| AMEX | KHGRO | 163.3631 | 2023-10-02T01:57:21.286Z |
| NASDAQ | GSCF | 75.8721 | 2023-10-02T01:57:21.640Z |
| NASDAQ | ZEP | 91.009 | 2023-10-02T01:57:03.740Z |
| OTHER_OTC | KMUEH | 0.2605 | 2023-10-02T01:57:03.702Z |
| OTCBB | WLXIM | 0.6886 | 2023-10-02T01:57:45.739Z |
| NASDAQ | OVTS | 153.5991 | 2023-10-02T01:57:23.061Z |
| OTCBB | YGIVQ | 0.8364 | 2023-10-02T01:57:38.882Z |
|----------------------------------------------------------|
stocksP = pagination(select * from stocks)
stocksP.last(5)
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| NASDAQ | ZEP | 91.009 | 2023-10-02T01:57:03.740Z |
| OTHER_OTC | KMUEH | 0.2605 | 2023-10-02T01:57:03.702Z |
| OTCBB | WLXIM | 0.6886 | 2023-10-02T01:57:45.739Z |
| NASDAQ | OVTS | 153.5991 | 2023-10-02T01:57:23.061Z |
| OTCBB | YGIVQ | 0.8364 | 2023-10-02T01:57:38.882Z |
|----------------------------------------------------------|
Description: Setups a pagination query
stocks =
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| OTCBB | RPYM | 0.4932 | 2023-10-02T01:57:31.086Z |
| OTCBB | EGBQ | 0.6747 | 2023-10-02T01:57:09.991Z |
| OTHER_OTC | PEMCQ | 0.6176 | 2023-10-02T01:57:23.684Z |
| NASDAQ | IPHBY | 113.9129 | 2023-10-02T01:57:01.837Z |
| NASDAQ | HLOQW | 159.1307 | 2023-10-02T01:57:50.139Z |
| NYSE | WQN | 177.4067 | 2023-10-02T01:57:17.371Z |
| NASDAQ | JONV | 139.6465 | 2023-10-02T01:57:55.758Z |
| NASDAQ | KKLPE | 135.2768 | 2023-10-02T01:57:07.520Z |
| AMEX | KHGRO | 163.3631 | 2023-10-02T01:57:21.286Z |
| NASDAQ | GSCF | 75.8721 | 2023-10-02T01:57:21.640Z |
| NASDAQ | ZEP | 91.009 | 2023-10-02T01:57:03.740Z |
| OTHER_OTC | KMUEH | 0.2605 | 2023-10-02T01:57:03.702Z |
| OTCBB | WLXIM | 0.6886 | 2023-10-02T01:57:45.739Z |
| NASDAQ | OVTS | 153.5991 | 2023-10-02T01:57:23.061Z |
| OTCBB | YGIVQ | 0.8364 | 2023-10-02T01:57:38.882Z |
|----------------------------------------------------------|
stocksP = pagination(select * from stocks)
stocksP.first(5)
stocksP.next(5)
|---------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NYSE | WQN | 177.4067 | 2023-10-02T01:57:17.371Z |
| NASDAQ | JONV | 139.6465 | 2023-10-02T01:57:55.758Z |
| NASDAQ | KKLPE | 135.2768 | 2023-10-02T01:57:07.520Z |
| AMEX | KHGRO | 163.3631 | 2023-10-02T01:57:21.286Z |
| NASDAQ | GSCF | 75.8721 | 2023-10-02T01:57:21.640Z |
|---------------------------------------------------------|
Description: Returns row(s) of data based on the expression and options
select symbol: 'GMTQ', exchange: 'OTCBB', lastSale: 0.1111, lastSaleTime: DateTime()
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| GMTQ | OTCBB | 0.1111 | 2024-01-26T01:17:58.877Z |
|---------------------------------------------------------|
Description: Computes the subtraction of two queries
from (
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAXX | NYSE | 56.12 |
| UPEX | NYSE | 116.24 |
| JUNK | AMEX | 97.61 |
| XYZ | AMEX | 31.95 |
|------------------------------|
) subtract (
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| JUNK | AMEX | 97.61 |
| ABC | OTCBB | 5.887 |
| XYZ | AMEX | 31.95 |
|------------------------------|
)
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAXX | NYSE | 56.12 |
| UPEX | NYSE | 116.24 |
|------------------------------|
Description: Restores rows matching an expression from a table
val stocks =
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| CMHA | NASDAQ | 121.4325 | 2023-08-05T22:45:29.370Z |
| JPJI | NYSE | 185.8192 | 2023-08-05T22:45:29.371Z |
| QCYA | AMEX | 152.0165 | 2023-08-05T22:45:29.372Z |
| TGRV | NYSE | 80.225 | 2023-08-05T22:45:29.373Z |
| XHMQ | NASDAQ | 98.445 | 2023-08-05T22:45:29.374Z |
|---------------------------------------------------------|
delete from @stocks where symbol is "CMHA"
undelete from @stocks where symbol is "CMHA"
|------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|------------------------------------------------------------------------------------------------------|
| 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | [] |
|------------------------------------------------------------------------------------------------------|
Description: Combines two (or more) result sets (vertically)
from (
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAXX | NYSE | 56.12 |
| UPEX | NYSE | 116.24 |
| XYZ | AMEX | 31.95 |
|------------------------------|
) union (
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| JUNK | AMEX | 97.61 |
| ABC | OTC BB | 5.887 |
|------------------------------|
)
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAXX | NYSE | 56.12 |
| UPEX | NYSE | 116.24 |
| XYZ | AMEX | 31.95 |
| JUNK | AMEX | 97.61 |
| ABC | OTC BB | 5.887 |
|------------------------------|
Description: Combines two (or more) result sets (vertically) retaining only distinct rows
from (
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAXX | NYSE | 56.12 |
| UPEX | NYSE | 116.24 |
| XYZ | AMEX | 31.95 |
| ABC | OTCBB | 5.887 |
|------------------------------|
) union distinct (
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| JUNK | AMEX | 97.61 |
| AAXX | NYSE | 56.12 |
| ABC | OTCBB | 5.887 |
|------------------------------|
)
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAXX | NYSE | 56.12 |
| UPEX | NYSE | 116.24 |
| XYZ | AMEX | 31.95 |
| ABC | OTCBB | 5.887 |
| JUNK | AMEX | 97.61 |
|------------------------------|
Description: Modifies rows matching a conditional expression from a table
val stocks =
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| ISIT | NASDAQ | 189.3509 | 2023-08-05T22:34:20.263Z |
| OBEA | NASDAQ | 99.1026 | 2023-08-05T22:34:20.279Z |
| IJYY | AMEX | 190.4665 | 2023-08-05T22:34:20.280Z |
| SMPG | NYSE | 184.6356 | 2023-08-05T22:34:20.282Z |
| UKHT | NASDAQ | 71.1514 | 2023-08-05T22:34:20.283Z |
|---------------------------------------------------------|
update @stocks set lastSaleTime = DateTime() where exchange is "NASDAQ"
stocks
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| ISIT | NASDAQ | 189.3509 | 2024-01-26T01:17:58.915Z |
| OBEA | NASDAQ | 99.1026 | 2024-01-26T01:17:58.915Z |
| IJYY | AMEX | 190.4665 | 2023-08-05T22:34:20.280Z |
| SMPG | NYSE | 184.6356 | 2023-08-05T22:34:20.282Z |
| UKHT | NASDAQ | 71.1514 | 2024-01-26T01:17:58.915Z |
|---------------------------------------------------------|
Description: Modifies rows matching a conditional expression from a table
declare table stocks (symbol: String(8), exchange: String(8), transactions: Table (price: Double, transactionTime: DateTime)[5])
insert into @stocks (symbol, exchange, transactions)
values ('AAPL', 'NASDAQ', {"price":156.39, "transactionTime":"2021-08-05T19:23:11.000Z"}),
('AMD', 'NASDAQ', {"price":56.87, "transactionTime":"2021-08-05T19:23:11.000Z"}),
('INTC','NYSE', {"price":89.44, "transactionTime":"2021-08-05T19:23:11.000Z"}),
('AMZN', 'NASDAQ', {"price":988.12, "transactionTime":"2021-08-05T19:23:11.000Z"}),
('SHMN', 'OTCBB', [{"price":0.0010, "transactionTime":"2021-08-05T19:23:11.000Z"},
{"price":0.0011, "transactionTime":"2021-08-05T19:23:12.000Z"}])
update @stocks#transactions
set price = 0.0012
where symbol is 'SHMN'
and transactions wherein (price is 0.001)
limit 1
stocks
|-----------------------------------------------------------------------------|
| symbol | exchange | transactions |
|-----------------------------------------------------------------------------|
| AAPL | NASDAQ | EmbeddedInnerTableRowCollection(price, transactionTime) |
| AMD | NASDAQ | EmbeddedInnerTableRowCollection(price, transactionTime) |
| INTC | NYSE | EmbeddedInnerTableRowCollection(price, transactionTime) |
| AMZN | NASDAQ | EmbeddedInnerTableRowCollection(price, transactionTime) |
| SHMN | OTCBB | EmbeddedInnerTableRowCollection(price, transactionTime) |
|-----------------------------------------------------------------------------|
Description: Inserts (or updates) new row(s) into a table
namespace "temp.examples"
drop if exists Stocks &&
create table Stocks (symbol: String(8), exchange: String(8), lastSale: Double) &&
create index Stocks#symbol &&
insert into Stocks (symbol, exchange, lastSale)
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| ATT | NYSE | 66.78 |
| UPEX | NASDAQ | 116.24 |
| XYZ | AMEX | 31.95 |
| ABC | OTCBB | 5.887 |
|------------------------------|
upsert into Stocks (symbol, exchange, lastSale) values ('AAPL', 'NASDAQ', 156.39) where symbol is 'AAPL'
ns('Stocks')
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| ATT | NYSE | 66.78 |
| UPEX | NASDAQ | 116.24 |
| XYZ | AMEX | 31.95 |
| ABC | OTCBB | 5.887 |
| AAPL | NASDAQ | 156.39 |
|------------------------------|
Description: Inserts (or updates) new row(s) into a table
namespace "temp.examples"
drop if exists Stocks &&
create table Stocks (symbol: String(8), exchange: String(8), lastSale: Double) &&
create index Stocks#symbol &&
insert into Stocks (symbol, exchange, lastSale)
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAPL | NASDAQ | 156.12 |
| ATT | NYSE | 66.78 |
| UPEX | NASDAQ | 116.24 |
| XYZ | AMEX | 31.95 |
| ABC | OTCBB | 5.887 |
|------------------------------|
upsert into Stocks (symbol, exchange, lastSale)
values ('AAPL', 'NASDAQ', 156.39)
where symbol is 'AAPL'
ns('Stocks')
|------------------------------|
| symbol | exchange | lastSale |
|------------------------------|
| AAPL | NASDAQ | 156.39 |
| ATT | NYSE | 66.78 |
| UPEX | NASDAQ | 116.24 |
| XYZ | AMEX | 31.95 |
| ABC | OTCBB | 5.887 |
|------------------------------|
Description: Modifies the structure of a table
namespace "temp.examples"
drop if exists StockQuotes
create table StockQuotes(symbol: String(5), exchange: String(9), lastSale: Double) containing (
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| OTCBB | YSZUY | 0.2355 | 2023-10-19T23:25:32.886Z |
| NASDAQ | DMZH | 183.1636 | 2023-10-19T23:26:03.509Z |
| OTCBB | VV | | |
| NYSE | TGPNF | 51.6171 | 2023-10-19T23:25:32.166Z |
| OTHER_OTC | RIZA | 0.2766 | 2023-10-19T23:25:42.020Z |
| NASDAQ | JXMLB | 91.6028 | 2023-10-19T23:26:08.951Z |
|----------------------------------------------------------|
)
alter table StockQuotes
prepend column saleDate: DateTime = DateTime()
rename column symbol to ticker
label 'Stock quotes staging table'
ns('StockQuotes')
|----------------------------------------------------------|
| saleDate | ticker | exchange | lastSale |
|----------------------------------------------------------|
| 2024-01-26T01:17:59.066Z | YSZUY | OTCBB | 0.2355 |
| 2024-01-26T01:17:59.066Z | DMZH | NASDAQ | 183.1636 |
| 2024-01-26T01:17:59.066Z | VV | OTCBB | |
| 2024-01-26T01:17:59.066Z | TGPNF | NYSE | 51.6171 |
| 2024-01-26T01:17:59.066Z | RIZA | OTHER_OTC | 0.2766 |
| 2024-01-26T01:17:59.066Z | JXMLB | NASDAQ | 91.6028 |
|----------------------------------------------------------|
Description: Creates an external table
create external table if not exists customers (
customer_uid: UUID,
name: String,
address: String,
ingestion_date: Long
) containing { format: 'json', location: './datasets/customers/json/', null_values: ['n/a'] }
|------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|------------------------------------------------------------------------------------------------------|
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | [] |
|------------------------------------------------------------------------------------------------------|
Description: Creates a table index
create index if not exists stocks#symbol
|------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|------------------------------------------------------------------------------------------------------|
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | [] |
|------------------------------------------------------------------------------------------------------|
Description: Creates a persistent database table
def generateStocks(qty: Int) := {
[1 to qty].map(_ => {
exchange = ['AMEX', 'NASDAQ', 'NYSE', 'OTCBB', 'OTHER_OTC'][Random.nextInt(5)]
is_otc = exchange.startsWith("OT")
lastSale = scaleTo(iff(is_otc, 1, 201) * Random.nextDouble(1.0), 4)
lastSaleTime = DateTime(DateTime() - Duration(1000 * 60 * Random.nextDouble(1.0)))
symbol = Random.nextString(['A' to 'Z'], iff(is_otc, Random.nextInt(2) + 4, Random.nextInt(4) + 2))
select lastSaleTime, lastSale, exchange, symbol
}).toTable()
}
namespace "temp.examples"
drop if exists Stocks
create table Stocks (symbol: String(10), exchange: String(10), lastSale: Double, lastSaleTime: DateTime)
containing (generateStocks(1000))
graph { shape: "pie3d", title: "Small Caps" }
select exchange, total: sum(lastSale) from Stocks
where lastSale <= 5.0
group by exchange
Description: Creates a database type
create type mood := Enum (sad, okay, happy)
|------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|------------------------------------------------------------------------------------------------------|
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | [] |
|------------------------------------------------------------------------------------------------------|
Description: Creates a unique index
namespace "temp.examples"
drop if exists Stocks
create table Stocks (
symbol: String(5),
exchange: Enum (AMEX, NASDAQ, NYSE, OTCBB, OTHEROTC),
lastSale: Double,
lastSaleTime: DateTime
)
create unique index Stocks#symbol
|------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|------------------------------------------------------------------------------------------------------|
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | [] |
|------------------------------------------------------------------------------------------------------|
Description: Creates a view
namespace "temp.temp"
drop if exists Students
create table Students (name: String(64), grade: Char, ratio: Double) containing (
|----------------------------------|
| name | grade | ratio |
|----------------------------------|
| John Wayne | D | 0.6042 |
| Carry Grant | B | 0.8908 |
| Doris Day | A | 0.9936 |
| Audrey Hepburn | A | 0.9161 |
| Gretta Garbeaux | C | 0.7656 |
|----------------------------------|
)
drop if exists A_Students
create view A_Students as select * from Students where ratio >= 0.9
ns('A_Students')
|---------------------------------|
| name | grade | ratio |
|---------------------------------|
| Doris Day | A | 0.9936 |
| Audrey Hepburn | A | 0.9161 |
|---------------------------------|
Description: Creates a durable database table
declare table Stocks (
symbol: String(8),
exchange: Enum (AMEX, NASDAQ, NYSE, OTCBB, OTHEROTC),
lastSale: Double,
lastSaleTime: DateTime)
|------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|------------------------------------------------------------------------------------------------------|
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | [] |
|------------------------------------------------------------------------------------------------------|
Description: Creates a view
declare table Students (name: String(64), grade: Char, ratio: Double) containing (
|----------------------------------|
| name | grade | ratio |
|----------------------------------|
| John Wayne | D | 0.6042 |
| Carry Grant | B | 0.8908 |
| Doris Day | A | 0.9936 |
| Audrey Hepburn | A | 0.9161 |
| Gretta Garbeaux | C | 0.7656 |
|----------------------------------|
)
declare view A_Students as select * from Students where ratio >= 0.9
A_Students
|---------------------------------|
| name | grade | ratio |
|---------------------------------|
| Doris Day | A | 0.9936 |
| Audrey Hepburn | A | 0.9161 |
|---------------------------------|
Description: Deletes a database object
namespace "temp.examples"
drop if exists Stocks
create table Stocks (
symbol: String(8),
exchange: Enum (AMEX, NASDAQ, NYSE, OTCBB, OTHEROTC),
lastSale: Double,
lastSaleTime: DateTime,
headlines Table ( headline String(128), newsDate DateTime )[100]
)
drop Stocks
|------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|------------------------------------------------------------------------------------------------------|
| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | [] |
|------------------------------------------------------------------------------------------------------|
Description: Returns a new transient table
val stocks = Table(symbol: String(4), exchange: String(6), transactions: Table(price: Double, transactionTime: DateTime)[5])
insert into @stocks (symbol, exchange, transactions)
values ('AAPL', 'NASDAQ', {price:156.39, transactionTime:"2021-08-05T19:23:11.000Z"}),
('AMD', 'NASDAQ', {price:56.87, transactionTime:"2021-08-05T19:23:11.000Z"}),
('INTC', 'NYSE', {price:89.44, transactionTime:"2021-08-05T19:23:11.000Z"}),
('AMZN', 'NASDAQ', {price:988.12, transactionTime:"2021-08-05T19:23:11.000Z"}),
('SHMN', 'OTCBB', [{price:0.0010, transactionTime:"2021-08-05T19:23:11.000Z"},
{price:0.0011, transactionTime:"2021-08-05T19:23:12.000Z"}])
@stocks
|--------------------------------------------------------------------|
| symbol | exchange | transactions |
|--------------------------------------------------------------------|
| AAPL | NASDAQ | (price, transactionTime) |
| AMD | NASDAQ | (price, transactionTime) |
| INTC | NYSE | (price, transactionTime) |
| AMZN | NASDAQ | (price, transactionTime) |
| SHMN | OTCBB | ByteArrayRowCollection(price, transactionTime) |
|--------------------------------------------------------------------|
Description: Creates a new table file, which will be identical to the source table.
val stocksA =
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NUBD | NYSE | 183.8314 | 2023-08-06T03:56:12.932Z |
| UAGU | NASDAQ | 105.9287 | 2023-08-06T03:56:12.940Z |
| XUWH | NASDAQ | 58.743 | 2023-08-06T03:56:12.941Z |
| EDVC | NYSE | 186.1966 | 2023-08-06T03:56:12.943Z |
| LFUG | NYSE | 128.5487 | 2023-08-06T03:56:12.944Z |
|---------------------------------------------------------|
val stocksB = tableLike(stocksA)
insert into @stocksB from stocksA where lastSale >= 120
stocksB
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NUBD | NYSE | 183.8314 | 2023-08-06T03:56:12.932Z |
| EDVC | NYSE | 186.1966 | 2023-08-06T03:56:12.943Z |
| LFUG | NYSE | 128.5487 | 2023-08-06T03:56:12.944Z |
|---------------------------------------------------------|
Description: Returns a Table builder
stocks =
TableZoo(symbol: String(10), exchange: String(10), lastSale: Double, lastSaleTime: DateTime)
.withMemorySupport(150)
.build()
insert into @stocks
|----------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|----------------------------------------------------------|
| OTHER_OTC | MBANF | 0.0109 | 2023-09-21T04:57:58.702Z |
| OTHER_OTC | YAMJI | 0.0155 | 2023-09-21T04:57:24.456Z |
| OTCBB | HQCY | 0.0135 | 2023-09-21T04:57:53.351Z |
| OTHER_OTC | GEYSG | 0.0186 | 2023-09-21T04:57:28.014Z |
| OTHER_OTC | WYISA | 0.0132 | 2023-09-21T04:57:58.271Z |
| OTCBB | TXWFI | 0.0194 | 2023-09-21T04:58:06.199Z |
| OTCBB | ZIYBG | 0.0167 | 2023-09-21T04:58:03.392Z |
|----------------------------------------------------------|
stocks
|----------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|----------------------------------------------------------|
| MBANF | OTHER_OTC | 0.0109 | 2023-09-21T04:57:58.702Z |
| YAMJI | OTHER_OTC | 0.0155 | 2023-09-21T04:57:24.456Z |
| HQCY | OTCBB | 0.0135 | 2023-09-21T04:57:53.351Z |
| GEYSG | OTHER_OTC | 0.0186 | 2023-09-21T04:57:28.014Z |
| WYISA | OTHER_OTC | 0.0132 | 2023-09-21T04:57:58.271Z |
| TXWFI | OTCBB | 0.0194 | 2023-09-21T04:58:06.199Z |
| ZIYBG | OTCBB | 0.0167 | 2023-09-21T04:58:03.392Z |
|----------------------------------------------------------|
Description: Removes all of the data from a table
val stocks =
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| CJHK | OTCBB | 36.4423 | 2023-08-03T00:09:42.263Z |
| OZIS | NYSE | 97.3854 | 2023-08-03T00:09:42.279Z |
| DKRA | NASDAQ | 127.5813 | 2023-08-03T00:09:42.280Z |
| IWEC | AMEX | 132.1874 | 2023-08-03T00:09:42.282Z |
| JIRD | OTCBB | 22.0003 | 2023-08-03T00:09:42.283Z |
|---------------------------------------------------------|
truncate @stocks
|------------------------------------------------------------------------------------------------------|
| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |
|------------------------------------------------------------------------------------------------------|
| 0 | 0 | 0 | 5 | 0 | 0 | 0 | 0 | 0 | [] |
|------------------------------------------------------------------------------------------------------|
Description: returns true if the value
is exactly the expression
; otherwise false
x = 200
x == 200
true
Description: determines whether the value
is between the to
and from
(inclusive)
from (
|-------------------------------------------------------------------------|
| ticker | market | lastSale | roundedLastSale | lastSaleTime |
|-------------------------------------------------------------------------|
| NKWI | OTCBB | 98.9501 | 98.9 | 2022-09-04T23:36:47.846Z |
| AQKU | NASDAQ | 68.2945 | 68.2 | 2022-09-04T23:36:47.860Z |
| WRGB | AMEX | 46.8355 | 46.8 | 2022-09-04T23:36:47.862Z |
| ESCN | AMEX | 42.5934 | 42.5 | 2022-09-04T23:36:47.865Z |
| NFRK | AMEX | 28.2808 | 28.2 | 2022-09-04T23:36:47.864Z |
|-------------------------------------------------------------------------|
) where lastSale between 28.2808 and 42.5934
order by lastSale desc
|-------------------------------------------------------------------------|
| ticker | market | lastSale | roundedLastSale | lastSaleTime |
|-------------------------------------------------------------------------|
| ESCN | AMEX | 42.5934 | 42.5 | 2022-09-04T23:36:47.865Z |
| NFRK | AMEX | 28.2808 | 28.2 | 2022-09-04T23:36:47.864Z |
|-------------------------------------------------------------------------|
Description: determines whether the value
is between the to
and from
(non-inclusive)
from (
|-------------------------------------------------------------------------|
| ticker | market | lastSale | roundedLastSale | lastSaleTime |
|-------------------------------------------------------------------------|
| NKWI | OTCBB | 98.9501 | 98.9 | 2022-09-04T23:36:47.846Z |
| AQKU | NASDAQ | 68.2945 | 68.2 | 2022-09-04T23:36:47.860Z |
| WRGB | AMEX | 46.8355 | 46.8 | 2022-09-04T23:36:47.862Z |
| ESCN | AMEX | 42.5934 | 42.5 | 2022-09-04T23:36:47.865Z |
| NFRK | AMEX | 28.2808 | 28.2 | 2022-09-04T23:36:47.864Z |
|-------------------------------------------------------------------------|
) where lastSale betwixt 28.2808 and 42.5934
order by lastSale desc
|-------------------------------------------------------------------------|
| ticker | market | lastSale | roundedLastSale | lastSaleTime |
|-------------------------------------------------------------------------|
| NFRK | AMEX | 28.2808 | 28.2 | 2022-09-04T23:36:47.864Z |
|-------------------------------------------------------------------------|
Description: determines whether the value
contains the expression
string = "Hello World"
string contains "World"
true
Description: determines whether the value
contains the expression
dict = {"name":"Tom", "DOB":"2003-09-28T00:00:00.000Z"}
dict contains "name"
true
Description: determines whether the value
contains the expression
array = [{"name":"Jerry"}, {"name":"Tom"}, {"name":"Sheila"}]
array contains {"name":"Tom"}
true
Description: determines whether at least one row is found within the query
val stocks = (
|---------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|---------------------------------------------------------|
| OTCBB | BKULD | 0.8745 | 2023-09-26T21:30:24.127Z |
| OTCBB | SAFXV | 0.8741 | 2023-09-26T21:30:13.488Z |
| NASDAQ | ECN | 36.9565 | 2023-09-26T21:30:05.816Z |
| AMEX | HRB | 164.4908 | 2023-09-26T21:30:41.457Z |
| NASDAQ | CFF | 107.4943 | 2023-09-26T21:30:06.283Z |
|---------------------------------------------------------|
)
@stocks where lastSale > 5 and exists(select symbol from @stocks where exchange is 'OTCBB')
|---------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NASDAQ | ECN | 36.9565 | 2023-09-26T21:30:05.816Z |
| AMEX | HRB | 164.4908 | 2023-09-26T21:30:41.457Z |
| NASDAQ | CFF | 107.4943 | 2023-09-26T21:30:06.283Z |
|---------------------------------------------------------|
Description: Exposes the components of a matches
expression
isString = v => v.isString()
isUUID = v => v.isUUID()
isNumber = v => v.isNumber()
response = { id: "a891ee9b-6667-40fc-9ed1-a129d04c8b6d", symbol: "ABC", exchange: "NYSE", lastSale: "35.76" }
expose(response matches { id: isUUID, symbol: isString, exchange: isString, lastSale: isNumber })
|----------------------------------------------------------------------------|
| expression | value | result |
|----------------------------------------------------------------------------|
| (v: Any) => v.isUUID() | "a891ee9b-6667-40fc-9ed1-a129d04c8b6d" | true |
| (v: Any) => v.isString() | "ABC" | true |
| (v: Any) => v.isString() | "NYSE" | true |
| (v: Any) => v.isNumber() | "35.76" | false |
|----------------------------------------------------------------------------|
Description: Applies a filter condition to an aggregate query
declare table travelers(id UUID, lastName String(12), firstName String(12), destAirportCode String(3))
containing (
|-------------------------------------------------------------------------------|
| id | lastName | firstName | destAirportCode |
|-------------------------------------------------------------------------------|
| b938c7e6-76b4-4c0c-a849-8c6f05474270 | JONES | GARRY | SNA |
| 10b6b0c1-cb90-4708-a57a-8e944bdbdd99 | JONES | DEBBIE | SNA |
| 10b6b0c1-cb90-4708-a57a-8e944bdb3499 | MILLER | SALLY MAE | MOB |
| 326d3c64-d09d-49ef-972d-cbf815e50c16 | JONES | TAMERA | SNA |
| c573d368-0f54-4f57-be31-4e6fe0059c23 | JONES | ERIC | SNA |
| b493e970-2814-4d7c-9003-dcc198b0a539 | ADAMS | KAREN | DTW |
| 8ab14ae0-a893-430d-bc3e-f4860d5feecb | ADAMS | MIKE | DTW |
| 8e3229f0-0ac7-45a2-90b2-7fca72e4918e | JONES | SAMANTHA | BUR |
| 10b6b0c1-cb90-4708-a1b0-8e944bdb34ee | MILLER | CAROL ANN | MOB |
| 324befc4-e584-4b94-a1b0-47faa0cb7b45 | SHARMA | PANKAJ | LAX |
|-------------------------------------------------------------------------------|
)
graph { shape: "bar", title: "Travelers" }
select lastName, members: count(*)
from @travelers
group by lastName having members > 1
Description: determines whether the value
matches the expression
val stocks = (
|-------------------------------------------------------------------------|
| ticker | market | lastSale | roundedLastSale | lastSaleTime |
|-------------------------------------------------------------------------|
| AQKU | NASDAQ | 68.2945 | 68.2 | 2022-09-04T23:36:47.860Z |
| WRGB | AMEX | 46.8355 | 46.8 | 2022-09-04T23:36:47.862Z |
| NKWI | OTCBB | 98.9501 | 98.9 | 2022-09-04T23:36:47.846Z |
| ESCN | AMEX | 42.5934 | 42.5 | 2022-09-04T23:36:47.865Z |
| NFRK | AMEX | 28.2808 | 28.2 | 2022-09-04T23:36:47.864Z |
|-------------------------------------------------------------------------|
)
@stocks where market in ["NASDAQ", "OTCBB"]
|-------------------------------------------------------------------------|
| ticker | market | lastSale | roundedLastSale | lastSaleTime |
|-------------------------------------------------------------------------|
| AQKU | NASDAQ | 68.2945 | 68.2 | 2022-09-04T23:36:47.860Z |
| NKWI | OTCBB | 98.9501 | 98.9 | 2022-09-04T23:36:47.846Z |
|-------------------------------------------------------------------------|
Description: Computes the inner join of two queries
namespace 'temp.examples'
drop if exists stockQuotes_A
create table stockQuotes_A (symbol: String(32), exchange: String(32), lastSale: Double)
insert into stockQuotes_A (symbol, exchange, lastSale)
values ('GREED', 'NASDAQ', 2345.78), ('BFG', 'NYSE', 113.56),
('ABC', 'AMEX', 11.46), ('ACME', 'NYSE', 56.78)
create index stockQuotes_A#symbol
drop if exists companies_A
create table companies_A (symbol: String(32), name: String(32))
insert into companies_A (symbol, name)
values ('ABC', 'ABC & Co'), ('BFG', 'BFG Corp.'),
('GREED', 'GreedIsGood.com'), ('ACME', 'ACME Inc.')
create index companies_A#symbol
select B.name, A.symbol, A.exchange, A.lastSale
from stockQuotes_A as A
inner join companies_A as B on A.symbol is B.symbol
|------------------------------------------------|
| name | symbol | exchange | lastSale |
|------------------------------------------------|
| ABC & Co | ABC | AMEX | 11.46 |
| ACME Inc. | ACME | NYSE | 56.78 |
| BFG Corp. | BFG | NYSE | 113.56 |
| GreedIsGood.com | GREED | NASDAQ | 2345.78 |
|------------------------------------------------|
Description: returns true if the value
is exactly the expression
; otherwise false
x = 201
x == 200
false
Description: returns true if the value
is exactly the expression
; otherwise false
x = 200
x is 200
true
Description: returns true if the value
is exactly the expression
; otherwise false
x = 201
x is 200
false
Description: determines whether the expression
is compatible with the CODEC
(new `java.util.Date`()) isCodecOf DateTime
true
Description: Returns true if the field or variable exists within the scope.
isDefined(counter)
false
Description: returns true if the value
is not exactly the expression
; otherwise false
x = 199
x isnt 200
true
Description: returns true if the value
is not exactly the expression
; otherwise false
x = 200
x isnt 200
false
Description: Limits the maximum number of rows returned by a query
from (
|-------------------------------------------------------------------------|
| ticker | market | lastSale | roundedLastSale | lastSaleTime |
|-------------------------------------------------------------------------|
| NKWI | OTCBB | 98.9501 | 98.9 | 2022-09-04T23:36:47.846Z |
| AQKU | NASDAQ | 68.2945 | 68.2 | 2022-09-04T23:36:47.860Z |
| WRGB | AMEX | 46.8355 | 46.8 | 2022-09-04T23:36:47.862Z |
| ESCN | AMEX | 42.5934 | 42.5 | 2022-09-04T23:36:47.865Z |
| NFRK | AMEX | 28.2808 | 28.2 | 2022-09-04T23:36:47.864Z |
|-------------------------------------------------------------------------|
) limit 3
|-------------------------------------------------------------------------|
| ticker | market | lastSale | roundedLastSale | lastSaleTime |
|-------------------------------------------------------------------------|
| NKWI | OTCBB | 98.9501 | 98.9 | 2022-09-04T23:36:47.846Z |
| AQKU | NASDAQ | 68.2945 | 68.2 | 2022-09-04T23:36:47.860Z |
| WRGB | AMEX | 46.8355 | 46.8 | 2022-09-04T23:36:47.862Z |
|-------------------------------------------------------------------------|
Description: determines whether the value
matches the expression
"Hello World 123" matches "H(.*) W(.*) \d+"
true
Description: determines whether the value
matches the expression
isEven = x => (x.isNumber() is true) and ((x % 2) is 0)
5678 matches isEven
true
Description: determines whether the value
matches the expression
response = { id: 5678, symbol: "DOG", exchange: "NYSE", lastSale: 90.67 }
response matches {
id: _ => true
symbol: "DOG"
exchange: "NYSE"
lastSale: 90.67
}
true
Description: determines whether the value
matches the expression
class Stock(symbol: String, exchange: String, lastSale: Double)
stock = new Stock(symbol: "ATX", exchange: "NASDAQ", lastSale: 234.57)
stock matches Stock(
symbol: x => (x.isString() is true) and
(x.length() between 1 and 6) and
(x.forall(c => Character.isAlphabetic(c)) is true),
exchange: x => x in ['NYSE', 'AMEX', 'NASDAQ', 'OTCBB'],
lastSale: n => n >= 0 and n < 500
)
true
Description: Filters a result set
from (
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| HWWM | NASDAQ | 191.6725 | 2023-08-06T18:33:08.661Z |
| VLYW | AMEX | 197.9962 | 2023-08-06T18:33:08.670Z |
| VSOM | NASDAQ | 166.8542 | 2023-08-06T18:33:08.672Z |
| FHWS | NYSE | 22.5909 | 2023-08-06T18:33:08.673Z |
| SRGN | AMEX | 180.2358 | 2023-08-06T18:33:08.675Z |
| PTFY | NYSE | 19.9265 | 2023-08-06T18:33:08.676Z |
|---------------------------------------------------------|
) where lastSale < 50.0
|---------------------------------------------------------|
| symbol | exchange | lastSale | lastSaleTime |
|---------------------------------------------------------|
| FHWS | NYSE | 22.5909 | 2023-08-06T18:33:08.673Z |
| PTFY | NYSE | 19.9265 | 2023-08-06T18:33:08.676Z |
|---------------------------------------------------------|
Description: determines whether the value
contains the expression
stocks = Table(symbol: String(4), exchange: String(8), transactions: Table(price: Double, transactionTime: DateTime)[2])
insert into @stocks (symbol, exchange, transactions)
values ('AAPL', 'NASDAQ', {price: 156.39, transactionTime: "2021-08-05T19:23:11.000Z"}),
('AMD', 'NASDAQ', {price: 56.87, transactionTime: "2021-08-05T19:23:11.000Z"}),
('INTC', 'NYSE', {price: 89.44, transactionTime: "2021-08-05T19:23:11.000Z"}),
('AMZN', 'NASDAQ', {price: 988.12, transactionTime: "2021-08-05T19:23:11.000Z"}),
('SHMN', 'OTCBB', [{price: 0.0010, transactionTime: "2021-08-05T19:23:11.000Z"},
{price: 0.0011, transactionTime: "2021-08-05T19:23:12.000Z"}])
select unnest(transactions)
from @stocks
where transactions wherein (price is 0.0011)
|-----------------------------------|
| price | transactionTime |
|-----------------------------------|
| 0.001 | 2021-08-05T19:23:11.000Z |
| 0.0011 | 2021-08-05T19:23:12.000Z |
|-----------------------------------|
Description: Invokes a virtual method
val items = values ("NASDAQ", 1276), ("AMEX", 1259), ("NYSE", 1275), ("OTCBB", 1190)
items.!toTable()
|---------------|
| A | B |
|---------------|
| NASDAQ | 1276 |
| AMEX | 1259 |
| NYSE | 1275 |
| OTCBB | 1190 |
|---------------|
Description: The argument spread operator: can convert an array into individual arguments
def p3d(x: Double, y: Double, z: Double) := (x, y, z)
p3d([ x: 123, y:13, z: 67 ]...)
Tuple3(_1=123, _2=13, _3=67)
Description: The argument spread operator: can convert a dictionary into individual arguments
def p3d(x: Double, y: Double, z: Double) := (x, y, z)
p3d({ x: 123, y:13, z: 67 }...)
Tuple3(_1=123, _2=13, _3=67)
Description: determines whether the method exists within the instance
val num = 5
num.?MAX_VALUE
true
Description: Returns a class instance by name (e.g. "Class.forName")
classOf('java.io.File')
`java.io.File`
Description: Returns the CODEC (encoder/decoder) of an expression.
val counter = 5
codecOf(counter)
Int
Description: Returns the interfaces implemented by a class or instance
interfacesOf(classOf('java.util.ArrayList'))
[`java.util.List`, `java.util.RandomAccess`, `java.lang.Cloneable`, `java.io.Serializable`, `java.util.Collection`, `java.lang.Iterable`]
Description: Returns the members (constructors, fields and methods) of a JVM Class as a Table
from membersOf(new `java.util.Date`()) limit 5
|-----------------------------------------------------------------------------------------------------------------------------|
| modifiers | member | returnType | memberType |
|-----------------------------------------------------------------------------------------------------------------------------|
| public | java.util.Date(arg0: String) | java.util.Date | Constructor |
| public | java.util.Date(arg0: int, arg1: int, arg2: int, arg3: int, arg4: int, arg5: int) | java.util.Date | Constructor |
| public | java.util.Date(arg0: int, arg1: int, arg2: int, arg3: int, arg4: int) | java.util.Date | Constructor |
| public | java.util.Date() | java.util.Date | Constructor |
| public | java.util.Date(arg0: long) | java.util.Date | Constructor |
|-----------------------------------------------------------------------------------------------------------------------------|
Description: The new operator can be used to instantiate JVM classes.
new `java.util.Date`()
2024-01-26T01:18:00.212Z
Description: The new operator can be used to instantiate Lollypop-defined classes.
import "java.util.Date"
class QStock(symbol: String, exchange: String, lastSale: Double, lastSaleTime: Date)
stock = new QStock("AAPL", "NASDAQ", 31.23, new Date())
stock.lastSale
31.23
Description: The new operator can be used to create anonymous objects from interfaces or traits.
import "java.awt.event.MouseListener"
import "java.awt.event.MouseEvent"
new MouseListener() {
mouseClicked: (e: MouseEvent) => stdout <=== "mouseClicked"
mousePressed: (e: MouseEvent) => stdout <=== "mousePressed"
mouseReleased: (e: MouseEvent) => stdout <=== "mouseReleased"
mouseEntered: (e: MouseEvent) => stdout <=== "mouseEntered"
mouseExited: (e: MouseEvent) => stdout <=== "mouseExited"
}
new MouseListener() { mouseClicked: (e: MouseEvent) => stdout <=== "mouseClicked", mousePressed: (e: MouseEvent) => stdout <=== "mousePressed", mouseReleased: (e: MouseEvent) => stdout <=== "mouseReleased", mouseEntered: (e: MouseEvent) => stdout <=== "mouseEntered", mouseExited: (e: MouseEvent) => stdout <=== "mouseExited" }
Description: Returns a Scala object instance by name
objectOf('scala.Function1')
scala.Function1$@5a35ae82
Description: Returns the super-classes extended by a class or instance
superClassesOf(classOf('java.util.ArrayList'))
[`java.util.AbstractList`, `java.util.AbstractCollection`, `java.lang.Object`]
Description: Returns the type of an expression.
counter = 5
typeOf(counter)
java.lang.Integer
Description: Executes an application from the host operating system
(% iostat 1 3 %)
|--------------------------------------------------------------------------------|
| lineNumber | output |
|--------------------------------------------------------------------------------|
| 1 | disk0 disk6 cpu load average |
| 2 | KB/t tps MB/s KB/t tps MB/s us sy id 1m 5m 15m |
| 3 | 12.26 93 1.11 7.29 0 0.00 5 2 92 2.80 1.98 1.85 |
| 4 | 416.00 1 0.41 0.00 0 0.00 5 3 92 2.80 1.98 1.85 |
| 5 | 27.32 718 19.15 0.00 0 0.00 15 6 79 2.80 1.98 1.85 |
|--------------------------------------------------------------------------------|
Description: Executes an application from the host operating system
(& iostat 1 3 &)
scala.sys.process.ProcessImpl$SimpleProcess@7682bf66
Description: Invokes a native process from the host operating system
def iostat(n, m) := transpose(output: (? iostat $n $m ?))
iostat(1, 5)
|-------------------------------------------------------------------|
| output |
|-------------------------------------------------------------------|
| disk0 disk6 cpu load average |
| KB/t tps MB/s KB/t tps MB/s us sy id 1m 5m 15m |
| 12.26 93 1.11 7.29 0 0.00 5 2 92 2.80 1.98 1.85 |
| 0.00 0 0.00 0.00 0 0.00 9 2 88 2.80 1.98 1.85 |
| 5.05 289 1.42 0.00 0 0.00 5 3 93 2.80 1.98 1.85 |
| 5.58 305 1.66 0.00 0 0.00 10 4 85 2.65 1.97 1.84 |
| 5.00 24 0.12 0.00 0 0.00 3 2 96 2.65 1.97 1.84 |
|-------------------------------------------------------------------|
disk0 disk6 cpu load average
KB/t tps MB/s KB/t tps MB/s us sy id 1m 5m 15m
12.26 93 1.11 7.29 0 0.00 5 2 92 2.80 1.98 1.85
0.00 0 0.00 0.00 0 0.00 9 2 88 2.80 1.98 1.85
5.05 289 1.42 0.00 0 0.00 5 3 93 2.80 1.98 1.85
Description: Invokes a native process from the host operating system
def ps() := transpose(output: (? ps aux ?))
from ps() limit 5
|-----------------------------------------------------------------------------------------------------------|
| output |
|-----------------------------------------------------------------------------------------------------------|
| USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND |
| ldaniels 631 11.8 5.5 437002464 5561872 ?? S 8:28PM 154:19.73 /Applications/Intel ... |
| _windowserver 364 5.9 0.3 414292272 343312 ?? Ss 8:28PM 82:18.23 /System/Library/Priv ... |
| ldaniels 62299 3.2 0.2 412622944 151280 ?? S 5:18PM 0:00.98 /opt/homebrew/opt/op ... |
| ldaniels 60453 2.2 5.5 440247680 5554784 ?? S 5:17PM 1:11.65 /Users/ldaniels/Lib ... |
|-----------------------------------------------------------------------------------------------------------|
Description: Retrieves the contents of a file.
cat 'app/examples/src/main/resources/log4j.properties'
|---------------------------------------------------------------------------------------------|
| cat |
|---------------------------------------------------------------------------------------------|
| # Root logger option |
| log4j.rootLogger=INFO, stdout |
| |
| # Direct log messages to stdout |
| log4j.appender.stdout=org.apache.log4j.ConsoleAppender |
| log4j.appender.stdout.Target=System.out |
| log4j.appender.stdout.layout=org.apache.log4j.PatternLayout |
| log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n |
|---------------------------------------------------------------------------------------------|
Description: Changes the current directory.
cd ^/Users/karl/Documents
pwd
/Users/karl/Documents
Description: Changes the current directory.
cd ~/Documents
pwd
/Users/ldaniels/Documents
Description: Changes the current directory.
cd "~/Documents"
pwd
/Users/ldaniels/Documents
Description: Copies a source file or directory to a target.
val `count` =
try
cp 'build.sbt' 'temp.txt'
catch e => -1
finally
rm 'temp.txt'
"{{`count`}} bytes copied.\n" ===> stdout
java.io.PrintStream@b144175
6440 bytes copied.
Description: Prints text to the standard output.
echo "Hello Lollypop!"
()
Hello Lollypop!
Description: Prints text to the standard output.
item = { symbol: "ABC", lastSale: 97.55 }
echo '{{item.symbol}} is {{item.lastSale}}/share'
()
ABC is 97.55/share
Description: Returns a dataframe containing a recursive list of files matching any specified criterion.
find "./app/examples/" where name matches "(.*)[.]csv"
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| stocks-100k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-100k.csv | 2023-11-12T07:50:27.490Z | 4990190 | false | true | false |
| companylist-amex.csv | /Users/ldaniels/GitHub/lollypop/app/examples/companylist/csv/companylist-amex.csv | 2023-11-12T07:50:27.477Z | 44754 | false | true | false |
| companylist-nyse.csv | /Users/ldaniels/GitHub/lollypop/app/examples/companylist/csv/companylist-nyse.csv | 2023-11-12T07:50:27.479Z | 405461 | false | true | false |
| companylist-nasdaq.csv | /Users/ldaniels/GitHub/lollypop/app/examples/companylist/csv/companylist-nasdaq.csv | 2023-11-12T07:50:27.478Z | 456099 | false | true | false |
| stocks-5k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-5k.csv | 2023-11-12T07:50:27.491Z | 249566 | false | true | false |
| stocks.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks.csv | 2023-11-12T07:50:27.492Z | 336324 | false | true | false |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Description: Returns a dataframe containing a list of files matching any specified criterion.
find app/examples where name matches "(.*)[.]csv" order by lastModified desc
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| stocks.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks.csv | 2023-11-12T07:50:27.492Z | 336324 | false | true | false |
| stocks-5k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-5k.csv | 2023-11-12T07:50:27.491Z | 249566 | false | true | false |
| stocks-100k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-100k.csv | 2023-11-12T07:50:27.490Z | 4990190 | false | true | false |
| companylist-nyse.csv | /Users/ldaniels/GitHub/lollypop/app/examples/companylist/csv/companylist-nyse.csv | 2023-11-12T07:50:27.479Z | 405461 | false | true | false |
| companylist-nasdaq.csv | /Users/ldaniels/GitHub/lollypop/app/examples/companylist/csv/companylist-nasdaq.csv | 2023-11-12T07:50:27.478Z | 456099 | false | true | false |
| companylist-amex.csv | /Users/ldaniels/GitHub/lollypop/app/examples/companylist/csv/companylist-amex.csv | 2023-11-12T07:50:27.477Z | 44754 | false | true | false |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Description: Returns a dataframe containing a list of files matching any specified criterion. NOTE: ~ indicates the user's home directory.
find docs limit 5
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| .DS_Store | /Users/ldaniels/GitHub/lollypop/docs/.DS_Store | 2024-01-12T21:51:06.002Z | 6148 | false | true | true |
| Travelers.png | /Users/ldaniels/GitHub/lollypop/docs/images/Travelers.png | 2024-01-26T01:17:59.949Z | 18784 | false | true | false |
| Small_Caps.png | /Users/ldaniels/GitHub/lollypop/docs/images/Small_Caps.png | 2024-01-26T01:17:59.711Z | 27441 | false | true | false |
| Exchange_Exposure.png | /Users/ldaniels/GitHub/lollypop/docs/images/Exchange_Exposure.png | 2024-01-26T01:17:57.866Z | 26520 | false | true | false |
| Powered_By_Lollypop.png | /Users/ldaniels/GitHub/lollypop/docs/images/Powered_By_Lollypop.png | 2024-01-26T01:17:50.892Z | 26480 | false | true | false |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Description: Returns a dataframe containing a list of files matching any specified criterion.
ls
|-------------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|-------------------------------------------------------------------------------------------------------------------------------------------|
| .DS_Store | /Users/ldaniels/GitHub/lollypop/.DS_Store | 2024-01-12T21:51:06.005Z | 8196 | false | true | true |
| app | /Users/ldaniels/GitHub/lollypop/app | 2023-11-03T20:22:06.270Z | 224 | true | false | false |
| LICENSE | /Users/ldaniels/GitHub/lollypop/LICENSE | 2023-10-18T21:42:27.686Z | 1073 | false | true | false |
| test1.json | /Users/ldaniels/GitHub/lollypop/test1.json | 2024-01-03T21:35:19.204Z | 12 | false | true | false |
| target | /Users/ldaniels/GitHub/lollypop/target | 2023-11-24T20:42:51.377Z | 288 | true | false | false |
| .bsp | /Users/ldaniels/GitHub/lollypop/.bsp | 2023-10-19T16:00:17.226Z | 96 | true | false | true |
| vin-mapping.json | /Users/ldaniels/GitHub/lollypop/vin-mapping.json | 2024-01-26T01:17:49.816Z | 1345 | false | true | false |
| docs | /Users/ldaniels/GitHub/lollypop/docs | 2024-01-02T22:51:06.289Z | 160 | true | false | false |
| rebuild.sh | /Users/ldaniels/GitHub/lollypop/rebuild.sh | 2023-11-06T19:36:01.005Z | 227 | false | true | false |
| README.md | /Users/ldaniels/GitHub/lollypop/README.md | 2024-01-26T01:18:06.480Z | 133409 | false | true | false |
| project | /Users/ldaniels/GitHub/lollypop/project | 2024-01-24T21:02:23.626Z | 256 | true | false | false |
| kafka.properties | /Users/ldaniels/GitHub/lollypop/kafka.properties | 2024-01-25T20:13:47.435Z | 322 | false | true | false |
| .gitignore | /Users/ldaniels/GitHub/lollypop/.gitignore | 2023-12-05T11:46:58.644Z | 646 | false | true | true |
| StartDevEnv.sql | /Users/ldaniels/GitHub/lollypop/StartDevEnv.sql | 2023-12-17T03:04:32.192Z | 558 | false | true | false |
| lollypop_db | /Users/ldaniels/GitHub/lollypop/lollypop_db | 2023-12-06T20:50:29.341Z | 128 | true | false | false |
| .git | /Users/ldaniels/GitHub/lollypop/.git | 2024-01-26T01:16:16.637Z | 576 | true | false | true |
| build.sbt | /Users/ldaniels/GitHub/lollypop/build.sbt | 2024-01-25T20:13:47.435Z | 6440 | false | true | false |
| .idea | /Users/ldaniels/GitHub/lollypop/.idea | 2024-01-26T01:17:50.609Z | 480 | true | false | true |
|-------------------------------------------------------------------------------------------------------------------------------------------|
Description: Returns a dataframe containing a list of files matching any specified criterion.
ls app/examples where not isHidden order by length desc
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| stocks-100k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-100k.csv | 2023-11-12T07:50:27.490Z | 4990190 | false | true | false |
| stocks.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks.csv | 2023-11-12T07:50:27.492Z | 336324 | false | true | false |
| stocks-5k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-5k.csv | 2023-11-12T07:50:27.491Z | 249566 | false | true | false |
| target | /Users/ldaniels/GitHub/lollypop/app/examples/target | 2023-07-05T21:57:46.435Z | 192 | true | false | false |
| src | /Users/ldaniels/GitHub/lollypop/app/examples/src | 2023-07-05T21:52:11.441Z | 160 | true | false | false |
| companylist | /Users/ldaniels/GitHub/lollypop/app/examples/companylist | 2023-11-12T07:50:27.476Z | 128 | true | false | false |
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
Description: Returns a dataframe containing a list of files matching any specified criterion.
ls "./app/examples/" where name matches ".*[.]csv"
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| stocks-100k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-100k.csv | 2023-11-12T07:50:27.490Z | 4990190 | false | true | false |
| stocks-5k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-5k.csv | 2023-11-12T07:50:27.491Z | 249566 | false | true | false |
| stocks.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks.csv | 2023-11-12T07:50:27.492Z | 336324 | false | true | false |
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
Description: Returns a dataframe containing a list of files matching any specified criterion. NOTE: ~ indicates the user's home directory.
ls ~ order by length desc limit 5
|-----------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|-----------------------------------------------------------------------------------------------------------|
| Music | /Users/ldaniels/Music | 2023-07-26T17:40:28.631Z | 224 | true | false | false |
| .ivy2 | /Users/ldaniels/.ivy2 | 2024-01-25T14:59:28.772Z | 160 | true | false | true |
| .config | /Users/ldaniels/.config | 2023-12-16T01:14:09.652Z | 160 | true | false | true |
| ui | /Users/ldaniels/ui | 2024-01-02T14:27:00.036Z | 96 | true | false | false |
| .condarc | /Users/ldaniels/.condarc | 2023-11-21T14:27:22.019Z | 41 | false | true | true |
|-----------------------------------------------------------------------------------------------------------|
Description: Returns an MD5 digest of a file or byte-encode-able value.
md5 "BadPassword123"
��4p�`DVڙ����)
Description: Returns an MD5 digest of a file or byte-encode-able value.
md5 new `java.io.File`("app/core/src/main/scala/com/lollypop/repl/gnu/MD5Sum.scala")
��W������C���z�
Description: Creates a new directory.
created = mkdir temp
response = iff(not created, "Couldn't do it", "Done")
rmdir temp
response
Done
Description: Renames a file or moves the file to a directory.
try {
cp 'build.sbt' 'temp.txt'
mv 'temp.txt' 'temp1.txt'
} catch e => {
e ===> stderr
false
} finally rm 'temp.txt' or rm 'temp1.txt'
true
Description: Returns a dataframe containing a list of active Lollypop peers
node = Nodes.start()
node.awaitStartup(Duration('1 second'))
node.exec("this where kind is 'Table'")
nps
|-----------------------------------------------------------------------------------------------------------------------------------------------|
| host | port | uptimeInSeconds | lastCommand |
|-----------------------------------------------------------------------------------------------------------------------------------------------|
| 0.0.0.0 | 15449 | 9 | |
| 0.0.0.0 | 11322 | 0 | this where kind is 'Table' |
| 0.0.0.0 | 14903 | 9 | |
| 0.0.0.0 | 8061 | 9 | x = 1;y = 2;z = x + y;z |
| 0.0.0.0 | 13136 | 9 | \nfrom (\n|-------------------------------------------------------|\n| ticker | market | lastSale | ... |
|-----------------------------------------------------------------------------------------------------------------------------------------------|
Description: Retrieves the contents of a file.
cd ~
pwd
/Users/ldaniels
Description: Removes a file or a collection of files via pattern-matching.
val `count` =
try
cp 'build.sbt' 'temp.txt'
catch e => -1
finally
rm 'temp.txt'
"{{`count`}} bytes copied.\n" ===> stdout
java.io.PrintStream@b144175
6440 bytes copied.
Description: Removes a specific directory.
created = mkdir temp_zzz
response = iff(not created, "Couldn't do it", "Done")
rmdir temp_zzz
response
Done
Description: Recursively removes files or collections of files via pattern-matching.
val `count` =
try
cp 'build.sbt' 'temp.txt'
catch e => -1
finally
rmr 'temp.txt'
"{{`count`}} bytes copied.\n" ===> stdout
java.io.PrintStream@b144175
6440 bytes copied.
Description: Creates or updates the last modified time of a file. Return true if successful.
touch 'app/examples/src/main/resources/log4j.properties'
true
Description: Returns the count of lines of a text file.
wc LICENSE
1073
Description: A non-interactive HTTP client
www get('https://example.com/')
HttpResponse(body="<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div {
width: 600px;
margin: 5em auto;
padding: 2em;
background-color: #fdfdff;
border-radius: 0.5em;
box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
}
a:link, a:visited {
color: #38488f;
text-decoration: none;
}
@media (max-width: 700px) {
div {
margin: 0 auto;
width: auto;
}
}
</style>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
", message="OK", statusCode=200, responseID=a3cd6a81-910f-4a25-9a05-88ff86bb8dd0)
Description: Returns a URL based on a relative path.
www path('users')
HttpResponse(body=null, message=null, statusCode=200, responseID=fcb0378f-b261-4a26-a738-5481e1f90bfb)
Description: Returns a URI based on a relative path.
www uri('users')
HttpResponse(body=null, message=null, statusCode=200, responseID=d0b72c1f-94f9-4608-8ed8-a602b9df5809)
Description: used to disambiguate a variable from a field or other identifiers
x = 1
$x
1
Description: Horizontally combines two arrays.
['a', 'b', 'c'] <|> [1, 2, 3]
[['a', 1], ['b', 2], ['c', 3]]
Description: Defines an anonymous function
val f = n => n * n
f(5)
25
Description: Define objects literally using JSON syntax
[{id: '7bd0b461-4eb9-400a-9b63-713af85a43d0', lastName: 'JONES', firstName: 'GARRY', airportCode: 'SNA'},
{id: '73a3fe49-df95-4a7a-9809-0bb4009f414b', lastName: 'JONES', firstName: 'DEBBIE', airportCode: 'SNA'},
{id: 'e015fc77-45bf-4a40-9721-f8f3248497a1', lastName: 'JONES', firstName: 'TAMERA', airportCode: 'SNA'},
{id: '33e31b53-b540-45e3-97d7-d2353a49f9c6', lastName: 'JONES', firstName: 'ERIC', airportCode: 'SNA'},
{id: 'e4dcba22-56d6-4e53-adbc-23fd84aece72', lastName: 'ADAMS', firstName: 'KAREN', airportCode: 'DTW'},
{id: '3879ba60-827e-4535-bf4e-246ca8807ba1', lastName: 'ADAMS', firstName: 'MIKE', airportCode: 'DTW'},
{id: '3d8dc7d8-cd86-48f4-b364-d2f40f1ae05b', lastName: 'JONES', firstName: 'SAMANTHA', airportCode: 'BUR'},
{id: '22d10aaa-32ac-4cd0-9bed-aa8e78a36d80', lastName: 'SHARMA', firstName: 'PANKAJ', airportCode: 'LAX'}
].toTable()
|---------------------------------------------------------------------------|
| airportCode | lastName | firstName | id |
|---------------------------------------------------------------------------|
| SNA | JONES | GARRY | 7bd0b461-4eb9-400a-9b63-713af85a43d0 |
| SNA | JONES | DEBBIE | 73a3fe49-df95-4a7a-9809-0bb4009f414b |
| SNA | JONES | TAMERA | e015fc77-45bf-4a40-9721-f8f3248497a1 |
| SNA | JONES | ERIC | 33e31b53-b540-45e3-97d7-d2353a49f9c6 |
| DTW | ADAMS | KAREN | e4dcba22-56d6-4e53-adbc-23fd84aece72 |
| DTW | ADAMS | MIKE | 3879ba60-827e-4535-bf4e-246ca8807ba1 |
| BUR | JONES | SAMANTHA | 3d8dc7d8-cd86-48f4-b364-d2f40f1ae05b |
| LAX | SHARMA | PANKAJ | 22d10aaa-32ac-4cd0-9bed-aa8e78a36d80 |
|---------------------------------------------------------------------------|
Description: used to disambiguate a table variable from a field or other identifiers
r = select value: 1
@r
|-------|
| value |
|-------|
| 1 |
|-------|
Description: Applies an alias to an expression or query
stocks =
|---------------------------------------------------------|
| exchange | symbol | lastSale | lastSaleTime |
|---------------------------------------------------------|
| NASDAQ | RY | 68.6234 | 2023-09-28T22:25:55.559Z |
| OTCBB | OUSVN | 0.7195 | 2023-09-28T22:25:59.404Z |
| NYSE | FTR | 40.7124 | 2023-09-28T22:26:21.811Z |
| OTCBB | TWVD | 0.0401 | 2023-09-28T22:26:10.017Z |
| OTCBB | GVHMN | 0.9648 | 2023-09-28T22:25:57.608Z |
| NASDAQ | DS | 155.021 | 2023-09-28T22:25:59.213Z |
|---------------------------------------------------------|
select count(*) as total,
avg(lastSale) as avgLastSale,
max(lastSale) as maxLastSale,
min(lastSale) as minLastSale,
sum(lastSale) as sumLastSale
from @stocks
|----------------------------------------------------------------------------|
| total | avgLastSale | maxLastSale | minLastSale | sumLastSale |
|----------------------------------------------------------------------------|
| 6 | 44.34686666666666 | 155.021 | 0.0401 | 266.08119999999997 |
|----------------------------------------------------------------------------|
Description: Removes a variable from the active scope
destroy stocks
Description: Creates a variable that automatically applies a CODEC function when mutated.
base64 = (value: String) => value.getBytes().base64()
let b64 : base64 = "Hello"
b64
SGVsbG8=
Description: Sets the active database
namespace 'stocks_demo'
__namespace__
stocks_demo.public
Description: Declares the default JVM package namespace
package "com.acme.skunkworks"
__package__
com.acme.skunkworks
Description: Resets the scope; wiping out all state
reset
Description: Sets the value of a variable
set x = { a: { b: { c : 98 } } }
x.a.b.c
98
Description: Table representation of the current scope
this
|----------------------------------------------------------------|
| name | kind | value |
|----------------------------------------------------------------|
| Random | Random$ | lollypop.lang.Random |
| WebSockets | WebSockets$ | lollypop.io.WebSockets$@1e23ee0e |
| stdout | PrintStream | java.io.PrintStream@b144175 |
| stdin | BufferedReader | java.io.BufferedReader@1ac3a6f |
| stderr | PrintStream | java.io.PrintStream@fee7ca |
| OS | OS | lollypop.lang.OS |
| π | Double | 3.141592653589793 |
| Nodes | Nodes | lollypop.io.Nodes@29c80149 |
|----------------------------------------------------------------|
Description: Creates a read-only variable
val greeting: String = 'Hello World'
Description: Creates a variable
var customer_id: Int = 5
Description: Searches the classpath via a class name pattern.
transpose(classPath("akka[.]dispatch[.](.*)D(.*)M(.*)S(.*)"))
|--------------------------------------------------------|
| classPath |
|--------------------------------------------------------|
| akka.dispatch.BoundedDequeBasedMessageQueueSemantics |
| akka.dispatch.DequeBasedMessageQueueSemantics |
| akka.dispatch.UnboundedDequeBasedMessageQueueSemantics |
|--------------------------------------------------------|
Description: Creates new date instance
DateTime()
2024-01-26T01:18:06.829Z
Description: Provides offline manual pages for instructions. Additionally, it's an internal database containing information about every loaded instruction.
help 's(.*)'
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | category | paradigm | description | example |
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| scaleTo | Transformation | Functional | Returns the the numeric expression truncated after `scale` decimal places. | scaleTo(0.567, 2) |
| scenario | Testing - Unit/Integration | Declarative | scenario-based test declaration | feature "State Inheritance" { scenario 'Create a contest' { val contest_id = "40d1857b-474c-4400-8f0 ... |
| select | Dataframe I/O | Declarative | Returns row(s) of data based on the expression and options | select symbol: 'GMTQ', exchange: 'OTCBB', lastSale: 0.1111, lastSaleTime: DateTime() |
| set | Scope and Session | Declarative | Sets the value of a variable | set x = { a: { b: { c : 98 } } } x.a.b.c |
| subtract | Dataframe I/O | Declarative | Computes the subtraction of two queries | from ( |------------------------------| | symbol | exchange | lastSale | |-------------------------- ... |
| sum | Aggregation and Sorting | Functional | Returns the sum of a numeric expression. | stocks = ( |-------------------| | symbol | lastSale | |-------------------| | VHLH | 153.2553 | | ... |
| sum | Aggregation and Sorting | Functional | Returns the sum of a numeric expression. | select total: sum(lastSale) from ( |-------------------| | symbol | lastSale | |-------------------| ... |
| superClassesOf | JVM and Reflection | Object-Oriented | Returns the super-classes extended by a class or instance | superClassesOf(classOf('java.util.ArrayList')) |
| switch | Transformation | Functional | Scala-inspired switch-case statement | value = 5.7 switch value case n => n < 5.0 then 'Yes - {{n}}' case n => n >= 5.0 and n <= 6.0 then ' ... |
| switch | Transformation | Functional | Scala-inspired switch-case statement | class StockQ(symbol: String, exchange: String, lastSale: Double) switch new StockQ("ABC", "AMEX", 78 ... |
| switch | Transformation | Functional | Scala-inspired switch-case statement | class StockQ(symbol: String, exchange: String, lastSale: Double) switch new StockQ('YORKIE', 'NYSE', ... |
| synchronized | System Tools | Procedural | Synchronizes access to an object; providing an exclusive read/write lock over it | bag = { message: null } synchronized(bag) { bag.message = 'Hello' } bag |
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Description: Provides offline manual pages for instructions. Additionally, it's an internal database containing information about every loaded instruction.
help 'select'
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | category | paradigm | description | example |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| select | Dataframe I/O | Declarative | Returns row(s) of data based on the expression and options | select symbol: 'GMTQ', exchange: 'OTCBB', lastSale: 0.1111, lastSaleTime: DateTime() |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Description: Provides offline manual pages for instructions. Additionally, it's an internal database containing information about every loaded instruction.
transpose(help('select'))
|----------------------------------------------------------------------------------------------------|
| name | value |
|----------------------------------------------------------------------------------------------------|
| name | select |
| category | Dataframe I/O |
| paradigm | Declarative |
| description | Returns row(s) of data based on the expression and options |
| example | select symbol: 'GMTQ', exchange: 'OTCBB', lastSale: 0.1111, lastSaleTime: DateTime() |
|----------------------------------------------------------------------------------------------------|
Description: Provides offline manual pages for instructions. Additionally, it's an internal database containing information about every loaded instruction.
select category, total: count(*)
from (help)
group by category
order by category
|------------------------------------|
| category | total |
|------------------------------------|
| Aggregation and Sorting | 25 |
| Concurrency | 10 |
| Control Flow | 21 |
| Dataframe I/O | 25 |
| Dataframe Management | 14 |
| Filtering and Matching | 25 |
| JVM and Reflection | 14 |
| REPL Tools | 32 |
| Scope and Session | 23 |
| System Tools | 17 |
| Testing - Unit/Integration | 5 |
| Transformation | 9 |
|------------------------------------|
Description: Provides offline manual pages for instructions. Additionally, it's an internal database containing information about every loaded instruction.
chart = { shape: "ring", title: "Help By Category" }
graph chart from (
select category, total: count(*)
from (help)
group by category
)
Description: Provides offline manual pages for instructions. Additionally, it's an internal database containing information about every loaded instruction.
chart = { shape: "pie3d", title: "Help By Paradigm" }
graph chart from (
select paradigm, total: count(*)
from (help)
group by paradigm
)
Description: Imports a JVM class
import 'java.util.Date'
java.util.Date
Description: incorporates the contents of an external file into current scope
include('./app/examples/src/main/lollypop/Stocks.sql')
java.io.PrintStream@b144175
Sampling 5 quotes:
---------------------------------------------------------|
exchange | symbol | lastSale | lastSaleTime |
---------------------------------------------------------|
NYSE | QL | 75.6786 | 2024-01-26T01:17:53.279Z |
NASDAQ | HXJ | 14.2979 | 2024-01-26T01:17:30.390Z |
NYSE | GPPU | 88.1739 | 2024-01-26T01:17:48.266Z |
NASDAQ | WKJ | 66.6476 | 2024-01-26T01:17:51.006Z |
AMEX | GCWNH | 55.1634 | 2024-01-26T01:17:17.802Z |
---------------------------------------------------------|
Description: installs a collection of components from a source.
lollypopComponents("com.lollypop.repl.gnu.Ls$")
ls "./app/examples/"
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | canonicalPath | lastModified | length | isDirectory | isFile | isHidden |
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| .DS_Store | /Users/ldaniels/GitHub/lollypop/app/examples/.DS_Store | 2023-11-12T05:53:49.722Z | 6148 | false | true | true |
| stocks-100k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-100k.csv | 2023-11-12T07:50:27.490Z | 4990190 | false | true | false |
| target | /Users/ldaniels/GitHub/lollypop/app/examples/target | 2023-07-05T21:57:46.435Z | 192 | true | false | false |
| companylist | /Users/ldaniels/GitHub/lollypop/app/examples/companylist | 2023-11-12T07:50:27.476Z | 128 | true | false | false |
| stocks-5k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-5k.csv | 2023-11-12T07:50:27.491Z | 249566 | false | true | false |
| src | /Users/ldaniels/GitHub/lollypop/app/examples/src | 2023-07-05T21:52:11.441Z | 160 | true | false | false |
| stocks.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks.csv | 2023-11-12T07:50:27.492Z | 336324 | false | true | false |
|-------------------------------------------------------------------------------------------------------------------------------------------------------|
Description: Returns a persistent object (e.g. table, view, et al) from disk via a namespace
from ns('lollypop.public.Stocks') limit 5
|-----------------------------------------------------------------------------|
| symbol | exchange | transactions |
|-----------------------------------------------------------------------------|
| AAPL | NASDAQ | EmbeddedInnerTableRowCollection(price, transactionTime) |
| AMD | NASDAQ | EmbeddedInnerTableRowCollection(price, transactionTime) |
| INTC | NYSE | EmbeddedInnerTableRowCollection(price, transactionTime) |
| AMZN | NASDAQ | EmbeddedInnerTableRowCollection(price, transactionTime) |
| SHMN | OTCBB | EmbeddedInnerTableRowCollection(price, transactionTime) |
|-----------------------------------------------------------------------------|
Description: Downloads a JVM dependency (jar) from a repository
require ['org.apache.spark:spark-core_2.13:3.3.0']
Description: Synchronizes access to an object; providing an exclusive read/write lock over it
bag = { message: null }
synchronized(bag) {
bag.message = 'Hello'
}
bag
{"message": "Hello"}
Description: Executes an instruction
trace set x = 1
Description: Assertion: if the expression evaluates to false, an exception is thrown.
total = 99
assert(total < 100, 'total must be less than 100')
true
[0.000750ms] AnyLiteral 1 ~> 1 <Integer>
[0.320084ms] SetAnyVariable set x = 1 ~> null <null>
Description: Assertion: if the expression evaluates to false, an exception is thrown.
total = 101
try
assert(total < 100, 'total must be less than 100')
catch e =>
stderr <=== e.getMessage()
java.io.PrintStream@fee7ca
total must be less than 100 on line 3 at 23
Description: Feature-based test declaration
namespace 'temp.examples'
// startup a listener node
node = Nodes.start()
port = node.port
// create a table
drop if exists Travelers
create table Travelers (id: UUID, lastName: String(32), firstName: String(32), destAirportCode: String(3))
insert into Travelers (id, lastName, firstName, destAirportCode)
|-------------------------------------------------------------------------------|
| id | lastName | firstName | destAirportCode |
|-------------------------------------------------------------------------------|
| 7bd0b461-4eb9-400a-9b63-713af85a43d0 | JONES | GARRY | SNA |
| 73a3fe49-df95-4a7a-9809-0bb4009f414b | JONES | DEBBIE | SNA |
| e015fc77-45bf-4a40-9721-f8f3248497a1 | JONES | TAMERA | SNA |
| 33e31b53-b540-45e3-97d7-d2353a49f9c6 | JONES | ERIC | SNA |
| e4dcba22-56d6-4e53-adbc-23fd84aece72 | ADAMS | KAREN | DTW |
| 3879ba60-827e-4535-bf4e-246ca8807ba1 | ADAMS | MIKE | DTW |
| 3d8dc7d8-cd86-48f4-b364-d2f40f1ae05b | JONES | SAMANTHA | BUR |
| 22d10aaa-32ac-4cd0-9bed-aa8e78a36d80 | SHARMA | PANKAJ | LAX |
|-------------------------------------------------------------------------------|
// create the webservice that reads from the table
node.api('/api/temp/examples', {
post: (id: UUID, firstName: String, lastName: String, destAirportCode: String) => {
insert into Travelers (id, firstName, lastName, destAirportCode)
values ($id, $firstName, $lastName, $destAirportCode)
},
get: (firstName: String, lastName: String) => {
select * from Travelers where firstName is $firstName and lastName is $lastName
},
put: (id: Long, name: String) => {
update subscriptions set name = $name where id is $id
},
delete: (id: UUID) => {
delete from Travelers where id is $id
}
})
// test the service
feature "Traveler information service" {
set __AUTO_EXPAND__ = true // Product classes are automatically expanded within the scope
scenario "Testing that DELETE requests produce the correct result" {
www delete "http://0.0.0.0:{{port}}/api/temp/examples"
<~ { id: '3879ba60-827e-4535-bf4e-246ca8807ba1' }
verify statusCode is 200
}
scenario "Testing that GET response contains specific field" {
www get "http://0.0.0.0:{{port}}/api/temp/examples?firstName=GARRY&lastName=JONES"
verify statusCode is 200
and body.size() >= 0
and body[0].id is '7bd0b461-4eb9-400a-9b63-713af85a43d0'
}
scenario "Testing that POST creates a new record" {
www post "http://0.0.0.0:{{port}}/api/temp/examples"
<~ { id: "119ff8a6-b569-4d54-80c6-03eb1c7f795d", firstName: "CHRIS", lastName: "DANIELS", destAirportCode: "DTW" }
verify statusCode is 200
}
scenario "Testing that we GET the record we previously created" {
www get "http://0.0.0.0:{{port}}/api/temp/examples?firstName=CHRIS&lastName=DANIELS"
verify statusCode is 200
and body matches [{
id: "119ff8a6-b569-4d54-80c6-03eb1c7f795d",
firstName: "CHRIS",
lastName: "DANIELS",
destAirportCode: "DTW"
}]
}
scenario "Testing what happens when a response does not match the expected value" {
www get "http://0.0.0.0:{{port}}/api/temp/examples?firstName=SAMANTHA&lastName=JONES"
verify statusCode is 200
and body.size() >= 0
and body[0].id is "7bd0b461-4eb9-400a-9b63-713af85a43d1"
and body[0].firstName is "SAMANTHA"
and body[0].lastName is "JONES"
and body[0].destAirportCode is "BUR"
}
}
{"passed": 4, "failed": 1}
Feature: Traveler information service
Passed: Testing that DELETE requests produce the correct result
[x] statusCode is 200
Passed: Testing that GET response contains specific field
[x] statusCode is 200
[x] (body.size()) >= 0
[x] ((body[0]).id) is "7bd0b461-4eb9-400a-9b63-713af85a43d0"
Passed: Testing that POST creates a new record
[x] statusCode is 200
Passed: Testing that we GET the record we previously created
[x] statusCode is 200
[x] body matches [{ id: "119ff8a6-b569-4d54-80c6-03eb1c7f795d", firstName: "CHRIS", lastName: "DANIELS", destAirportCode: "DTW" }]
Failed: Testing what happens when a response does not match the expected value
[x] statusCode is 200
[x] (body.size()) >= 0
[ ] ((body[0]).id) is "7bd0b461-4eb9-400a-9b63-713af85a43d1"
[x] ((body[0]).firstName) is "SAMANTHA"
[x] ((body[0]).lastName) is "JONES"
[x] ((body[0]).destAirportCode) is "BUR"
completed: passed: 4, failed: 1
Description: scenario-based test declaration
feature "State Inheritance" {
scenario 'Create a contest' {
val contest_id = "40d1857b-474c-4400-8f07-5e04cbacc021"
var counter = 1
stderr <=== "contest_id = {{contest_id}}, counter = {{counter}}\n"
verify contest_id is "40d1857b-474c-4400-8f07-5e04cbacc021"
and counter is 1
}
scenario 'Create a member' {
val member_id = "4264f8a5-6fa3-4a38-b3bb-30e2e0b826d1"
stderr <=== "member_id = {{member_id}}\n"
verify member_id is "4264f8a5-6fa3-4a38-b3bb-30e2e0b826d1"
}
scenario 'Inherit contest state' extends 'Create a contest' {
counter = counter + 1
stderr <=== "contest_id = {{contest_id}}, counter = {{counter}}\n"
verify contest_id is "40d1857b-474c-4400-8f07-5e04cbacc021"
and counter is 2
}
scenario 'Inherit contest and member state' extends ['Create a contest', 'Create a member'] {
counter = counter + 1
stderr <=== "contest_id = {{contest_id}}, member_id = {{member_id}}, counter = {{counter}}\n"
verify contest_id is "40d1857b-474c-4400-8f07-5e04cbacc021"
and member_id is "4264f8a5-6fa3-4a38-b3bb-30e2e0b826d1"
and counter is 3
}
}
{"passed": 4, "failed": 0}
Feature: State Inheritance
Passed: Create a contest
[x] contest_id is "40d1857b-474c-4400-8f07-5e04cbacc021"
[x] counter is 1
Passed: Create a member
[x] member_id is "4264f8a5-6fa3-4a38-b3bb-30e2e0b826d1"
Passed: Inherit contest state
[x] contest_id is "40d1857b-474c-4400-8f07-5e04cbacc021"
[x] counter is 2
Passed: Inherit contest and member state
[x] contest_id is "40d1857b-474c-4400-8f07-5e04cbacc021"
[x] member_id is "4264f8a5-6fa3-4a38-b3bb-30e2e0b826d1"
[x] counter is 3
completed: passed: 4, failed: 0
contest_id = 40d1857b-474c-4400-8f07-5e04cbacc021, counter = 1
member_id = 4264f8a5-6fa3-4a38-b3bb-30e2e0b826d1
contest_id = 40d1857b-474c-4400-8f07-5e04cbacc021, counter = 2
contest_id = 40d1857b-474c-4400-8f07-5e04cbacc021, member_id = 4264f8a5-6fa3-4a38-b3bb-30e2e0b826d1, counter = 3
Description: Verifies the current state of the scope
response = { id: 357 }
verify response.id is 357
^^^ 'Success!'
true
Description: A declarative way to write to OutputStream or Writer resources
import "java.io.File"
f = new File("./test1.json")
f <=== "Hello World\n"
f ===> stdout
java.io.PrintStream@b144175
Hello World
Description: A declarative way to write to OutputStream or Writer resources
import "java.io.File"
f = new File("app/core/src/test/resources/log4j.properties")
f ===> stdout
java.io.PrintStream@b144175
# Root logger option
log4j.rootLogger=INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Description: Monadic comprehension
import "scala.util.Success"
a = Success(75)
b = Success(25)
c = a =>> i => i * 2
c
Success(value=150)
Description: Monadic comprehension
import "scala.util.Success"
a = Success(75)
b = Success(25)
c = a =>> i =>
b =>> j => i + j
c
Success(value=Success(value=100))
Description: Returns the the numeric expression truncated after scale
decimal places.
scaleTo(0.567, 2)
0.56
Description: Scala-inspired switch-case statement
value = 5.7
switch value
case n => n < 5.0 then 'Yes - {{n}}'
case n => n >= 5.0 and n <= 6.0 then 'Maybe - {{n}}'
case n then 'No - {{n}}'
Maybe - 5.7
Description: Scala-inspired switch-case statement
class StockQ(symbol: String, exchange: String, lastSale: Double)
switch new StockQ("ABC", "AMEX", 78.23)
case p => p matches StockQ("ABC", "AMEX", _ => true) ~> p.lastSale
case _ ~> 0.0
78.23
Description: Scala-inspired switch-case statement
class StockQ(symbol: String, exchange: String, lastSale: Double)
switch new StockQ('YORKIE', 'NYSE', 999.99)
case p => p matches StockQ(_ => true, "OTCBB", _ => true) ~> 'OT'
case p => p matches StockQ(_ => true, "OTHER_OTC", _ => true) ~> 'OT'
case p => p matches StockQ(_ => true, "AMEX", _ => true) ~> 'AM'
case p => p matches StockQ(_ => true, "NASDAQ", _ => true) ~> 'ND'
case p => p matches StockQ(_ => true, "NYSE", _ => true) ~> 'NY'
case _ ~> 'NA'
NY