Skip to content
Snippets Groups Projects
util.h 2.81 KiB
Newer Older
#ifndef UTIL_H
#define UTIL_H

#include <stdio.h>
#include <stdlib.h>
JasonJPu's avatar
JasonJPu committed
#include <stdbool.h>
JasonJPu's avatar
JasonJPu committed
#include <string.h>
JasonJPu's avatar
JasonJPu committed
#include <assert.h>
JasonJPu's avatar
JasonJPu committed
// Basic building blocks that contain char values
JasonJPu's avatar
JasonJPu committed
typedef struct atom {
	char* val;
} atom;

JasonJPu's avatar
JasonJPu committed
// A linked list like structure
JasonJPu's avatar
JasonJPu committed
// car points to element the node is holding
// cdr points to next cons cell in list or null
JasonJPu's avatar
JasonJPu committed
// is_atom determines if car is an atom
JasonJPu's avatar
JasonJPu committed
typedef struct cons_cell {
    void* car;
JasonJPu's avatar
JasonJPu committed
    struct cons_cell* cdr;
	bool is_atom;
JasonJPu's avatar
JasonJPu committed
} cons_cell;

JasonJPu's avatar
JasonJPu committed
// Creates a cons_cell
JasonJPu's avatar
JasonJPu committed
cons_cell* create_cons_cell(void* car, cons_cell* cdr);
JasonJPu's avatar
JasonJPu committed
// Creates an atom
JasonJPu's avatar
JasonJPu committed
atom* create_atom(char* val);
JasonJPu's avatar
JasonJPu committed
// Creates a cons_cell that has an atom as its car
JasonJPu's avatar
JasonJPu committed
cons_cell* create_cons_cell_w_atom(char* val, cons_cell* cdr);
JasonJPu's avatar
JasonJPu committed

JasonJPu's avatar
JasonJPu committed
/*

Below comment block are functions that implement the following relational 
algebra expressions for SQL queries:

<ra> := (comp <op> <term> <term> <ra>)
        | (atom <table> <var>)
        | (union-all <ra> <ra>)
        | (cross <ra> <ra>)
        | (proj ((rename <col> <col>)) <ra>)
        | (not <ra> <ra>)
        | (elim <ra>)
        | (limit n <ra> <ra>)
        | (eval <ra> <ra>)

<term> := <col> | <const>
<col> := <spcol> | <scol>
<spcol> := <var> "." <pf>   // for SQLP
<scol> := <var> "." <attr>  // for SQL
<pf> := <attr> <attr>
<var> := identifier
<attr> := identifier
<table> := identifier
<term> := identifier
<const> := identifier
<op> := [GT, GE, EQ, LE, LT]

*/

JasonJPu's avatar
JasonJPu committed
// The following are all helper functions to create the 
// various relational algebra expressions
JasonJPu's avatar
JasonJPu committed
cons_cell* create_spcol(cons_cell* var, cons_cell* pf);
cons_cell* create_pf(cons_cell* attr, cons_cell* next_attr);
cons_cell* create_table(char *table);
JasonJPu's avatar
JasonJPu committed
cons_cell* create_term(cons_cell *term);
cons_cell* create_constant(char* constant);
JasonJPu's avatar
JasonJPu committed
cons_cell* create_col(char *col);
cons_cell* create_attr(char *attr);
cons_cell* create_var(char *var);
JasonJPu's avatar
JasonJPu committed
cons_cell* create_op(char *op);
cons_cell* create_comp_operator(cons_cell* op, cons_cell* term1, cons_cell* term2, cons_cell* ra);
JasonJPu's avatar
JasonJPu committed
cons_cell* create_atom_operator(cons_cell* table, cons_cell* var);
JasonJPu's avatar
JasonJPu committed
cons_cell* create_union_all_operator(cons_cell* ra1, cons_cell* ra2);
cons_cell* create_cross_operator(cons_cell* ra1, cons_cell* ra2);
JasonJPu's avatar
JasonJPu committed
cons_cell* create_rename_operator(cons_cell* table, cons_cell* var);
cons_cell* create_assign_operator(cons_cell* table, cons_cell* var);
JasonJPu's avatar
JasonJPu committed
cons_cell* create_proj_operator(cons_cell* assign, cons_cell* ra);
cons_cell* create_not_operator(cons_cell* ra1, cons_cell* ra2);
cons_cell* create_limit_operator(cons_cell* ra1, cons_cell* ra2);
cons_cell* create_elim_operator(cons_cell* ra1, cons_cell* ra2);
cons_cell* create_eval_operator(cons_cell* logic, cons_cell* cross);

JasonJPu's avatar
JasonJPu committed
// Prints an in order traversal of the tree
JasonJPu's avatar
JasonJPu committed
void print_cons_tree(cons_cell *root);

void print_cons_tree_helper(cons_cell *root, int indent);