app | ||
Config | ||
data | ||
src | ||
test | ||
.gitignore | ||
CHANGELOG.md | ||
LICENSE | ||
mtgsearch.cabal | ||
package.yaml | ||
README.md | ||
Setup.hs | ||
stack.yaml | ||
stack.yaml.lock |
mtgsearch
Developement of a custom magic card search engine.
DSL
Will be a language based in set theory, where queries can be combined, negated etc etc. Example.
I had to simplify the DSL a lot in order to have time. I have never written a lexer or parser before. So doing that in a language i am not that familiar with (haskell) proved to be quite difficult. Therefore in this section i will relay exactly how this DSL works.
It essentially is a Query Language, with similar properties as SQL. (It uses SQL at the bottom
layer). So we have split the two Sets
we can to into the following.
Query
A query is a very simple way of saying, limit all the cards in magic the gathering with the set limitation. Example there exists a Query function SuperType
that takes in a string. This function will then match all cards type_line
and return only those containing a match.
Operator
This is an operator between two sets. Example of an operator is the intersect
operator. This takes two Sets
and returns only the cards that exist in both. Example of a query using intersect
:
(SuperType Creature) intersect (SuperType Legendary)
This query will only return Legendary Creatures, (Note: In theory you can write only (SuperType Legendary Creature) and it will return the same, however it is recommended to limit the SuperType search to only one word)
Avalible Query functions:
- (
CmcLT
Int)- This function will find all cards with converted mana cost less than the Integer provided as input
- (
CmcMT
Int)- This function will find all cards with converted mana cost more than the Integer provided as input
- (
CmcEQ
Int)- This function will find all cards with converted mana cost equal to the Integer
- (
SuperType
String)- This function will find all cards with the String value in its type_field.
- NOTE: It is recommended to only use one word at a time and rather use set operators for better matching
- (
Color
Char)- This function allows to find all cards of specific color.
- VALID INPUT: [W,R,G,B,U] where U = Blue and B = Black
Avalible Operators:
- left
intersect
right- This operator will give the intersect of whatever is to the left and right of it.
- Example: (SuperType Creature) intersect (Color R) = All Red Creatures
- left
union
right- This operator will give the union of left and right
- Example: (SuperType Creature) union (SuperType Instant) = All Creatures and Instants
- left
minus
right- This operator will give you all cards present in left but not in right
- Example: (SuperType Creature) union (SuperType Legendary) = All non Legendary Creatures
Lexer
This languages lexer is very dumb. Therefore you the user has to be very verbose with your parenthesis. Example:
This will not work:
(IS Instant) union (Color Red) union (Color Green)
However this will
((IS Instant) union (Color Red)) union (Color Green)
The outer parenthesis is not needed, ex SuperType Creature
is equivalent to (SuperType Creature)