---
# System prepended metadata

title: API Design

---

# API Design

## PKB
### PKB
enum class EntityType { VARIABLE, PROCEDURE, STATEMENT };
enum class StmtType { ASSIGNMENT, PRINT, READ, IF, WHILE };


Gets all ids that satisfy the predicate
`vector<int> getAllIds(function<bool(int)> predicate);`

Gets id of the EntityType with the specified name (proc name, var name, statement number)
`optional<int> getId(string name, EntityType type);
  EntityData getEntityData(int id);`

Adds new entity with the specified name, EntityType, and StmtType)
`int addNewEntity(string name, EntityType type,
                   optional<StmtType> StmtType = nullopt);` 

Sets the relations between two entities
```
void setModifies(int lhs, int rhs);
void setUses(int lhs, int rhs);
void setParent(int lhs, int rhs, bool isMultiLevel);
void setFollow(int lhs, int rhs, bool isMultiLevel);
```

Predicates to check the type of the entity given the id
```
bool isStatement(int id);
bool isProcedure(int id);
bool isVariable(int id);
```

Predicates to check the type of the stmt given the id
```
bool isAssignment(int id);
bool isPrint(int id);
bool isRead(int id);
bool isIf(int id);
bool isWhile(int id);
```

Predicates to check the relation between two entities given the ids
```
bool isModifies(int lhs, int rhs);
bool isUses(int lhs, int rhs);
bool isParent(int lhs, int rhs, bool isMultiLevel);
bool isFollow(int lhs, int rhs, bool isMultiLevel);
```

Predicates to check the whether the statement fulfilss the pattern
```
bool isPattern(int stmtId, optional<int> lhsId, string rhsPattern, bool isRhsFullMatch);
bool isPattern(int stmtId, int lhsId);
```

## Source Processor

`void setPKB(shared_ptr<pkbns::PKB> _pkb);`
`void setLexer(shared_ptr<Lexer> _lexer);`

`void runWithFilename(string filename);`
`void runWithSource(string source);`

## PQL
### PQL
Sets the PKB pointer to be used by the PQL
`void setPKB(shared_ptr<pkbns::PKB> _pkb);`

Runs PQL to evaluate the query string, returns the list of strings
`list<string> run(const string &query);`

### PQL Parser
Constructs PQL Parser
`PQLParser();`

Tokenizes the query string into tokens recognized by the PQL parser
`void runLexer(string query);`

Parses the tokens to get the selected synonym, list of declared synonyms, list of relations, and list of patterns
`void runParser(string &selectedSynonym, vector<Synonym> &synonyms,
                 vector<Relation> &relations, vector<Pattern> &patterns);`

### PQL Evaluator
Constructs PQL Evaluator
`PQLEvaluator(shared_ptr<pkbns::PKB> _pkb) : pkb(_pkb){};`

Gets the list of values of the selected synonym fulfilling the relations and patterns condition
`list<string> evalQuery(string &selectedSynonym, vector<Synonym> &synonyms,
                         vector<Relation> &relations,
                         vector<Pattern> &patterns);`