Added most operations to ReadMe

This commit is contained in:
Rolf Martin Glomsrud 2023-04-30 19:15:40 +02:00
parent d2411937dc
commit a64131327c
2 changed files with 44 additions and 2 deletions

View file

@ -8,6 +8,46 @@ Developement of a custom magic card search engine.
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:
1. (`CmcLT` Int)
- This function will find all cards with converted mana cost less than the Integer provided as input
2. (`CmcMT` Int)
- This function will find all cards with converted mana cost more than the Integer provided as input
3. (`CmcEQ` Int)
- This function will find all cards with converted mana cost equal to the Integer
4. (`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
5. (`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:
1. 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
2. left `union` right
- This operator will give the union of left and right
- Example: (SuperType Creature) union (SuperType Instant) = All Creatures and Instants
3. 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:
@ -19,4 +59,6 @@ This will not work:
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)`

View file

@ -60,7 +60,7 @@ cardToHtml :: Card -> String
cardToHtml (Card id_ scryfall_id lang name (Just oracle_text) (Just image_uri) type_line cmc) =
"<div class=\"card\" style=\"text-align:center\"><h2>" ++ unpack name ++ "</h2>" ++
"<img src=" ++ unpack image_uri ++ " width=\"200px\"/>"++
"<p style=\"width:200px\">" ++ unpack oracle_text ++ "<p>"++" </div>"
"<p style=\"width:205px;margin: 0 auto;font-size:12;\">" ++ unpack oracle_text ++ "<p>"++" </div>"
cardToHtml _ = "<h1>Could not load that card</h1>"