Skip to content

Commit df7e813

Browse files
authored
* add ability to use Θ in all field names & with PQL
1 parent 2674736 commit df7e813

8 files changed

+1044
-947
lines changed

idk/header.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const (
3232

3333
var (
3434
ErrNoFieldSpec = errors.New("no field spec in this header")
35-
ErrInvalidFieldName = errors.New("field name must match [a-z][a-z0-9_-]{0,229}")
35+
ErrInvalidFieldName = errors.New("field name must match [a-z][a-z0-9Θ_-]{0,229}")
3636
ErrParsingEpoch = "parsing epoch for "
3737
ErrDecodingConfig = "decoding config for field "
3838
)

idk/header_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,11 @@ func TestHeaderToField(t *testing.T) {
351351
input: "a__LookupText",
352352
exp: LookupTextField{NameVal: "a", DestNameVal: "a"},
353353
},
354+
{
355+
name: "theta",
356+
input: "fldΘnameΘ__String",
357+
exp: StringField{NameVal: "fldΘnameΘ", DestNameVal: "fldΘnameΘ"},
358+
},
354359
}
355360

356361
for _, test := range tests {

pilosa.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ var (
4747
ErrInvalidView = errors.New("invalid view")
4848
ErrInvalidCacheType = errors.New("invalid cache type")
4949

50-
ErrName = errors.New("invalid index or field name, must match [a-z][a-z0-9_-]* and contain at most 230 characters")
50+
ErrName = errors.New("invalid index or field name, must match [a-z][a-z0-9Θ_-]* and contain at most 230 characters")
5151

5252
// ErrFragmentNotFound is returned when a fragment does not exist.
5353
ErrFragmentNotFound = errors.New("fragment not found")
@@ -135,7 +135,7 @@ func newPreconditionFailedError(err error) PreconditionFailedError {
135135
}
136136

137137
// Regular expression to validate index and field names.
138-
var nameRegexp = regexp.MustCompile(`^[a-z][a-z0-9_-]{0,229}$`)
138+
var nameRegexp = regexp.MustCompile(`^[a-z][a-z0-9Θ_-]{0,229}$`)
139139

140140
// TimeFormat is the go-style time format used to parse string dates.
141141
const TimeFormat = "2006-01-02T15:04"

pilosa_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package pilosa_test
44

55
import (
6+
"fmt"
67
"strings"
78
"testing"
89

@@ -43,3 +44,28 @@ func TestAddressWithDefaults(t *testing.T) {
4344
}
4445
}
4546
}
47+
48+
func TestValidateName(t *testing.T) {
49+
tests := []struct {
50+
name string
51+
err error
52+
}{
53+
{name: "a_name", err: nil},
54+
{name: "a-name", err: nil},
55+
{name: "a-name-10", err: nil},
56+
{name: "A-name", err: fmt.Errorf("'A-name': %s", pilosa.ErrName)},
57+
{name: "-a-name", err: fmt.Errorf("'-a-name': %s", pilosa.ErrName)},
58+
{name: "8th_name", err: fmt.Errorf("'8th_name': %s", pilosa.ErrName)},
59+
{name: "Θ_name", err: fmt.Errorf("'Θ_name': %s", pilosa.ErrName)},
60+
{name: "a_NaMe", err: fmt.Errorf("'a_NaMe': %s", pilosa.ErrName)},
61+
{name: "indexΘname", err: nil},
62+
}
63+
for _, test := range tests {
64+
err := pilosa.ValidateName(test.name)
65+
if !(err == nil && test.err == nil) {
66+
if err.Error() != test.err.Error() {
67+
t.Errorf("expected error: %v, but got: %v", test.err, err)
68+
}
69+
}
70+
}
71+
}

pql/parser_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,20 @@ func TestParser_Parse(t *testing.T) {
307307
}
308308
}
309309
})
310+
311+
t.Run("ParseTheta", func(t *testing.T) {
312+
q, err := pql.ParseString(`Row(fldΘname=fldΘval)`)
313+
if err != nil {
314+
t.Fatal(err)
315+
} else if !reflect.DeepEqual(q.Calls[0],
316+
&pql.Call{
317+
Name: "Row",
318+
Args: map[string]interface{}{"fldΘname": "fldΘval"},
319+
},
320+
) {
321+
t.Fatalf("unexpected call: %#v", q.Calls[0])
322+
}
323+
})
310324
}
311325

312326
func TestUnquote(t *testing.T) {

pql/pql.peg

+5-5
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Call <- "Set" {p.startCall("Set")} open col comma args (comma time)? close {p.e
2020
/ "Sum" {p.startCall("Sum")} open posfield (comma allargs)? close {p.endCall()}
2121
/ "Range" {p.startCall("Range")} open field eq value comma 'from='? {p.addField("from")} timefmt {p.addVal(text)} comma 'to='? sp {p.addField("to")} timefmt {p.addVal(text)} close {p.endCall()}
2222
/ < IDENT > { p.startCall(text) } open allargs comma? close { p.endCall() }
23-
ivyExpr <- ( '(' / '_' / '/' / '[' / ']' /'.' / '=' / '&' / '<'/ '>' /',' / ')' / '^' / '!' / '|' / [*+] / '-' / '?' / [[A-Z]] / [0-9] / '#' / [ \t\n] )*
23+
ivyExpr <- ( '(' / '_' / '/' / '[' / ']' /'.' / '=' / '&' / '<'/ '>' /',' / ')' / '^' / '!' / '|' / [*+] / '-' / '?' / [[A-Z]] / [0-9] / '#' / [ \t\n] / 'Θ')*
2424
ivyprogram <- '"'? <ivyExpr> '"' { p.addPosStr("_ivy", text) }
2525
ivyprogram2 <- '"'? <ivyExpr> '"' { p.addPosStr("_ivyReduce", text) }
2626

@@ -55,16 +55,16 @@ item <- 'null' &(comma / close) { p.addVal(nil) }
5555
/ timestampfmt { p.addTimestampVal(text) }
5656
/ < decimal > { p.addNumVal(text) }
5757
/ < IDENT > { p.startCall(text) } open allargs comma? close { p.addVal(p.endCall()) }
58-
/ < ([[A-Z]] / [0-9] / '-' / '_' / ':')+ > { p.addVal(text) }
58+
/ < ([[A-Z]] / [0-9] / '-' / '_' / ':' / 'Θ')+ > { p.addVal(text) }
5959
/ < '"' doublequotedstring '"' > { p.addVal(text) }
6060
/ < '\'' singlequotedstring '\'' > { p.addVal(text) }
6161

6262
doublequotedstring <- ( '\\"' / '\\\\' / '\\n' / '\\t' / [^"\\] )*
6363
singlequotedstring <- ( '\\\'' / '\\\\' / '\\n' / '\\t' / [^'\\] )*
6464

65-
variable <- ( [[A-Z]] / '_' ) ( [[A-Z]] / [0-9] / '_' / '-' )*
65+
variable <- ( [[A-Z]] / '_' ) ( [[A-Z]] / [0-9] / '_' / '-' / 'Θ')*
6666

67-
fieldExpr <- ( [[A-Z]] / '_' / '$' ) ( [[A-Z]] / [0-9] / '_' / '-' )*
67+
fieldExpr <- ( [[A-Z]] / '_' / '$' ) ( [[A-Z]] / [0-9] / '_' / '-' / 'Θ')*
6868
field <- <fieldExpr / reserved> { p.addField(text) }
6969
reserved <- '_row' / '_col' / '_start' / '_end' / '_timestamp' / '_field'
7070
posfield <- 'field='? <fieldExpr> { p.addPosStr("_field", text) }
@@ -79,7 +79,7 @@ eq <- sp '=' sp
7979
comma <- sp ',' sp
8080
lbrack <- '[' sp
8181
rbrack <- sp ']' sp
82-
IDENT <- [[A-Z]] ([[A-Z]] / [0-9])*
82+
IDENT <- [[A-Z]] ([[A-Z]] / [0-9] / 'Θ')*
8383
digits <- [0-9]+
8484
signedDigits <- '-'? digits
8585
decimal <- signedDigits ('.' digits?)?

0 commit comments

Comments
 (0)