0
0
bleve/query_syntax.y

150 lines
2.4 KiB
Plaintext
Raw Normal View History

%{
package bleve
import "log"
func logDebugGrammar(format string, v ...interface{}) {
if debugParser {
log.Printf(format, v...)
}
}
%}
%union {
s string
n int
f float64}
%token STRING PHRASE PLUS MINUS COLON BOOST LPAREN RPAREN NUMBER STRING
%%
input:
searchParts {
logDebugGrammar("INPUT")
};
searchParts:
searchPart searchParts {
logDebugGrammar("SEARCH PARTS")
}
|
searchPart {
logDebugGrammar("SEARCH PART")
};
searchPart:
searchPrefix searchBase searchSuffix {
};
searchPrefix:
/* empty */ {
}
|
searchMustMustNot {
}
;
searchMustMustNot:
PLUS {
logDebugGrammar("PLUS")
parsingMust = true
}
|
MINUS {
logDebugGrammar("MINUS")
parsingMustNot = true
};
searchBase:
STRING {
str := $1.s
logDebugGrammar("STRING - %s", str)
q := NewMatchQuery(str)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
}
|
PHRASE {
phrase := $1.s
logDebugGrammar("PHRASE - %s", phrase)
q := NewMatchPhraseQuery(phrase)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
}
|
STRING COLON STRING {
field := $1.s
str := $3.s
logDebugGrammar("FIELD - %s STRING - %s", field, str)
q := NewMatchQuery(str).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
}
|
STRING COLON PHRASE {
field := $1.s
phrase := $3.s
logDebugGrammar("FIELD - %s PHRASE - %s", field, phrase)
q := NewMatchPhraseQuery(phrase).SetField(field)
if parsingMust {
parsingMustList.AddQuery(q)
parsingMust = false
} else if parsingMustNot {
parsingMustNotList.AddQuery(q)
parsingMustNot = false
} else {
parsingShouldList.AddQuery(q)
}
parsingLastQuery = q
};
searchBoost:
BOOST NUMBER {
boost := $2.f
if parsingLastQuery != nil {
switch parsingLastQuery := parsingLastQuery.(type) {
case *MatchQuery:
parsingLastQuery.SetBoost(boost)
case *MatchPhraseQuery:
parsingLastQuery.SetBoost(boost)
}
}
logDebugGrammar("BOOST %f", boost)
};
searchSuffix:
/* empty */ {
}
|
searchBoost {
};