Skip to content

ostap/comp

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Introduction

comp is a tool for querying information from files. Its main goal is to provide a unified interface to the variety of data representations found in public data sets. To achieve this goal comp introduces a small query language with type coercion (e.g. "2" + 2 == 4) and a powerful iteration mechanism based on list comprehensions.

$ comp '"2" + 2'
4
$ comp '[i | i <- [1, 2, 3], i != 2]'
[ 1, 3 ]
$ comp '[i * j | i <- [1, 2, 3], j <- [10, 20]]'
[ 10, 20, 20, 40, 30, 60 ]

Query files from the command line:

$ curl https://api.github.com/repos/torvalds/linux/commits > commits.json
$ comp -f commits.json '[ i.commit.author.name | i <- commits ]'
$ cat commits.json | comp -f @json '[ i.commit.author.name | i <- in ]'

Syntax Overview

comp defines the following types:

  • scalar - 53, 3.14, "hello", true
  • list - [10, 20, 30], ["a", "b"]
  • object - {id: 123, name: "hello"}

and the following operators:

  • ! - not
  • * / - multiply, divide
  • + - ++ - addition, subtraction, string concatenation
  • < <= > >= - less than [or equal], greater than [or equal]
  • == != =~ - [not] equal, regular expression match
  • && || - logical and, logical or

For example, the following expressions:

"2.14" + 1
8 / 2
3 < 3.14 && 3.14 > 3.13
"hello" ++ " world"

will produce:

3.14
4
true
"hello world"

Iterations are formulated as list comprehensions:

[ e | g1, g2, ..., gN ]

pronounced as "a list of all e where g1 and g2 ... and gN", where e represents an expression and gX is either an iteration over a list or a boolean expression:

[i*2 | i <- [1, 2, 3], i != 2]
[i*j | i <- [1, 2, 3], j <- [10, 20]]

will produce:

[1, 6]
[10, 20, 20, 40, 30, 60]

Build & Test

$ go tool yacc -o y.go -p "comp_" grammar.y
$ go test .
$ go build -o comp .
$ ./comp

Acknowledgements

comp language borrows ideas from other programming languages (Haskell, JavaScript and probably others), but its core - the application of comprehensions to formulate queries - is based on a research paper by Peter Buneman "Comprehension Syntax". I explored this paper thanks to feedback provided by Ted Leung after the Emerging Languages Camp regarding Bandicoot. comp tool was originally developed as a backend to serve public data sets at mingle.io.

About

a tool for querying files in various formats

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published