Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added lexer for parsing GSQL files #1866

Merged
merged 6 commits into from Aug 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions pygments/lexers/_mapping.py
Expand Up @@ -175,6 +175,7 @@
'GAPLexer': ('pygments.lexers.algebra', 'GAP', ('gap',), ('*.g', '*.gd', '*.gi', '*.gap'), ()),
'GDScriptLexer': ('pygments.lexers.gdscript', 'GDScript', ('gdscript', 'gd'), ('*.gd',), ('text/x-gdscript', 'application/x-gdscript')),
'GLShaderLexer': ('pygments.lexers.graphics', 'GLSL', ('glsl',), ('*.vert', '*.frag', '*.geo'), ('text/x-glslsrc',)),
'GSQLLexer': ('pygments.lexers.gsql', 'GSQL', ('gsql',), ('*.gsql',), ()),
'GasLexer': ('pygments.lexers.asm', 'GAS', ('gas', 'asm'), ('*.s', '*.S'), ('text/x-gas',)),
'GcodeLexer': ('pygments.lexers.gcodelexer', 'g-code', ('gcode',), ('*.gcode',), ()),
'GenshiLexer': ('pygments.lexers.templates', 'Genshi', ('genshi', 'kid', 'xml+genshi', 'xml+kid'), ('*.kid',), ('application/x-genshi', 'application/x-kid')),
Expand Down
92 changes: 92 additions & 0 deletions pygments/lexers/gsql.py
@@ -0,0 +1,92 @@
"""
pygments.lexers.gsql
~~~~~~~~~~~~~~~~~~~~~~~

Lexers for TigerGraph GSQL graph query language

:copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""

import re

from pygments.lexer import RegexLexer, include, bygroups, using, this, words
from pygments.token import Keyword, Punctuation, Comment, Operator, Name,\
String, Number, Whitespace, Token


__all__ = ["GSQLLexer"]

class GSQLLexer(RegexLexer):

"""
For `GSQL <https://docs.tigergraph.com/dev/gsql-ref>`_ queries (version 3.x).
.. versionadded:: 2.10
"""

name = 'GSQL'
aliases = ['gsql']
filenames = ['*.gsql']

flags = re.MULTILINE | re.IGNORECASE

tokens = {
'root': [
include('comment'),
include('keywords'),
include('clauses'),
include('accums'),
include('relations'),
include('strings'),
include('whitespace'),
include('barewords'),
include('operators'),
],
'comment': [
(r'.*\#.*\n', Comment.Single),
(r'.*\/\*\s*.*\s*\*\/', Comment.Multiline),
],
'keywords': [
(words((
'ACCUM', 'AND', 'ANY', 'API', 'AS', 'ASC', 'AVG', 'BAG', 'BATCH', 'BETWEEN', 'BOOL', 'BOTH',
'BREAK', 'BY', 'CASE', 'CATCH', 'COALESCE', 'COMPRESS', 'CONTINUE', 'COUNT',
'CREATE', 'DATETIME', 'DATETIME_ADD', 'DATETIME_SUB', 'DELETE', 'DESC', 'DISTRIBUTED', 'DO',
'DOUBLE', 'EDGE', 'ELSE', 'END', 'ESCAPE', 'EXCEPTION', 'FALSE', 'FILE', 'FILTER', 'FLOAT', 'FOREACH', 'FOR',
'FROM', 'GRAPH', 'GROUP', 'GSQL_INT_MAX', 'GSQL_INT_MIN', 'GSQL_UINT_MAX', 'HAVING', 'IF',
'IN', 'INSERT', 'INT', 'INTERPRET', 'INTERSECT', 'INTERVAL', 'INTO', 'IS', 'ISEMPTY', 'JSONARRAY', 'JSONOBJECT', 'LASTHOP',
'LEADING', 'LIKE', 'LIMIT', 'LIST', 'LOAD_ACCUM', 'LOG', 'MAP', 'MATCH', 'MAX', 'MIN', 'MINUS', 'NOT',
'NOW', 'NULL', 'OFFSET', 'OR', 'ORDER', 'PATH', 'PER', 'PINNED', 'POST_ACCUM', 'POST-ACCUM', 'PRIMARY_ID', 'PRINT',
'QUERY', 'RAISE', 'RANGE', 'REPLACE', 'RESET_COLLECTION_ACCUM', 'RETURN', 'RETURNS', 'RUN', 'SAMPLE', 'SELECT', 'SELECT_VERTEX',
'SET', 'SRC', 'STATIC', 'STRING', 'SUM', 'SYNTAX', 'TARGET', 'TAGSTGT', 'THEN', 'TO', 'TO_CSV', 'TO_DATETIME', 'TRAILING', 'TRIM', 'TRUE',
'TRY', 'TUPLE', 'TYPEDEF', 'UINT', 'UNION', 'UPDATE', 'VALUES', 'VERTEX', 'WHEN', 'WHERE', 'WHILE', 'WITH'), prefix=r'(?<!\.)', suffix=r'\b'), Token.Keyword)
],
'clauses': [
(words(('accum', 'having', 'limit', 'order', 'postAccum', 'sample', 'where')), Name.Builtin)
],
'accums': [
(words(('andaccum', 'arrayaccum', 'avgaccum', 'bagaccum', 'bitwiseandaccum',
'bitwiseoraccum', 'groupbyaccum', 'heapaccum', 'listaccum', 'MapAccum',
'maxaccum', 'minaccum', 'oraccum', 'setaccum', 'sumaccum')), Name.Builtin),
],
'relations': [
(r'(-\s?)(\(.*\:\w?\))(\s?-)', bygroups(Operator, using(this), Operator)),
(r'->|<-', Operator),
(r'[.*{}]', Punctuation),
],
'strings': [
(r'"(?:\\[tbnrf\'"\\]|[^\\"])*"', String),
(r'@{1,2}\w+', Name.Variable),
(r'(\<\w+)?\<(\w+\>?\,?\s?)+\>+', Name.Constant),
],
'whitespace': [
(r'\s+', Whitespace),
],
'barewords': [
(r'[a-z]\w*', Name),
(r'(\d+\.\d+|\d+)', Number),
],
'operators': [
(r'[^0-9|\/|\-](\-\=|\+\=|\*\=|\\\=|\=|\=\=|\=\=\=|\+|\-|\*|\\|\+\=|\>|\<)[^\>|\/]', Operator),
(r'(\(|\)|\,|\;|\=|\-|\+|\*|\/|\>|\<|\:)', Operator),
],
}
223 changes: 223 additions & 0 deletions tests/examplefiles/gsql/test.gsql
@@ -0,0 +1,223 @@
CREATE QUERY Member_Likeness(VERTEX <motionMember> m1, STRING inDate) FOR GRAPH motionData {
# TYPEDEF TUPLE <x FLOAT, y FLOAT> XYPair;
MapAccum<VERTEX<motionMember>, MapAccum<STRING, FLOAT>> @@likenessAccum;
MapAccum<VERTEX<motionMember>, FLOAT> @@BirthYearAccum;
MapAccum<VERTEX<motionMember>, FLOAT> @@HeightAccum;
MapAccum<VERTEX<motionMember>, FLOAT> @@WeightAccum;
ListAccum<VERTEX<location>> @@MemLocAccum;
MapAccum<VERTEX<motionMember>, FLOAT> @@LocAccum;
MapAccum<VERTEX<motionMember>, BagAccum<VERTEX<incentive>>> @@DayIncentives;
MapAccum<VERTEX<motionMember>, MapAccum<STRING, FLOAT>> @@MemberStats;
BagAccum<VERTEX<incentive>> @MemberIncentives;
AvgAccum @@StepsAccum;
AvgAccum @@BoutsAccum;
AvgAccum @@MilesAccum;

# Universal Vars
INT lastMax = 0;
INT lastMin = 1000;
FLOAT mult;

# Age Vars
INT ageRange;
INT birthYear;

# Height Vars
INT heightRange;
INT height;

# Height Vars
INT weightRange;
INT weight;

# Location Vars
FLOAT locRange;
VERTEX memLoc;

# Activity Vars
DATETIME lastRecording;

# lastRecording = to_datetime("2018-05-19");
lastRecording = to_datetime(inDate);

/*

test comment block

*/


members = {motionMember.*};

birthYear = Get_Birth_Year(m1);
height = m1.Height;
weight = m1.Weight;
temp = SELECT loc FROM members:member -(:e) - location: loc
WHERE member == m1
ACCUM
@@MemLocAccum += loc;
FOREACH loc in @@MemLocAccum DO
memLoc = loc;
END;

PRINT memLoc;
PRINT birthYear;
PRINT height;
PRINT weight;

results = SELECT member FROM members:member
ACCUM
@@BirthYearAccum += (member -> abs(Get_Birth_Year(member) - birthYear));

FOREACH (member,bys) in @@BirthYearAccum DO
IF bys > lastMax THEN
lastMax = bys;
END;
IF bys < lastMin THEN
lastMin = bys;
END;
END;

ageRange = lastMax - lastMin;
print ageRange;
mult = 1.0/ageRange;


FOREACH (member,bys) in @@BirthYearAccum DO
bys = 1 - bys * mult;
@@likenessAccum += (member -> ("age" -> bys));
END;

lastMax = 0;
lastMin = 1000;
mult = 0;

results = SELECT member FROM members:member
ACCUM
@@HeightAccum += (member -> abs(member.Height - height));

FOREACH (member,heights) in @@HeightAccum DO
IF heights < height THEN
IF heights > lastMax THEN
lastMax = heights;
END;
IF heights < lastMin THEN
lastMin = heights;
END;
END;
END;

heightRange = lastMax - lastMin;
print heightRange;
mult = 1.0/heightRange;


FOREACH (member,heights) in @@HeightAccum DO
IF heights < height THEN
heights = 1 - heights * mult;
ELSE
heights = 0;
END;
@@likenessAccum += (member -> ("height" -> heights));
END;

lastMax = 0;
lastMin = 1000;
mult = 0;

results = SELECT member FROM members:member
ACCUM
@@WeightAccum += (member -> abs(member.Weight - weight));

FOREACH (member,weights) in @@WeightAccum DO
IF weights < weight THEN
IF weights > lastMax THEN
lastMax = weights;
END;
IF weights < lastMin THEN
lastMin = weights;
END;
END;
END;

weightRange = lastMax - lastMin;
print weightRange;
mult = 1.0/weightRange;


FOREACH (member,weights) in @@WeightAccum DO
IF weights < weight THEN
weights = 1 - weights * mult;
ELSE
weights = 0;
END;
@@likenessAccum += (member -> ("weight" -> weights));
END;

lastMax = 0;
lastMin = 1000;
mult = 0;

resultsLoc = SELECT loc FROM members:member -(:e) - location: loc
ACCUM
@@LocAccum += (member -> Check_Distance(loc,memLoc));
FOREACH (member,loc) in @@LocAccum DO
IF loc < 5800 THEN
IF loc > lastMax THEN
lastMax = ceil(loc);
END;
IF loc < lastMin THEN
lastMin = floor(loc);
END;
END;
END;

PRINT lastMax;
PRINT lastMin;

locRange = lastMax - lastMin;
print locRange;
mult = 1.0/locRange;

FOREACH (member,loc) in @@LocAccum DO
IF loc > 5800 THEN
loc = -1;
ELSE
loc = 1 - loc * mult;
END;
@@likenessAccum += (member -> ("distance" -> loc));
END;

lastMax = 0;
lastMin = 1000;
mult = 0;

incentives = {incentive.*};

incentives = SELECT incent FROM incentives:incent - (:e) - lookupRule:rule WHERE
rule.RuleName == "Tenacity" AND incent.IncentiveDate > datetime_sub(lastRecording, INTERVAL 1 MONTH) AND incent.IncentiveDate < lastRecording;

members = SELECT member FROM incentives:incent - (:e) - motionMember:member
ACCUM
@@DayIncentives += (member -> (incent));

FOREACH (member, incent) IN @@DayIncentives DO
@@StepsAccum = 0;
FOREACH Incentive IN incent DO
@@StepsAccum += Incentive.TotalSteps;
@@BoutsAccum += Incentive.TotalBouts;
@@MilesAccum += Incentive.Miles;
END;
@@MemberStats += (member -> ("stepsAvg" -> @@StepsAccum));
@@MemberStats += (member -> ("stepsSlope" -> Linear_Regression(incent, 1)));
# @@MemberStats += (member -> ("boutsAvg" -> @@BoutsAccum));
# @@MemberStats += (member -> ("boutsSlope" -> Linear_Regression(incent, 2)));
@@MemberStats += (member -> ("milesAvg" -> @@MilesAccum));
@@MemberStats += (member -> ("milesSlope" -> Linear_Regression(incent, 3)));
END;


PRINT @@MemberStats;
PRINT @@likenessAccum;

}