

CREATE TABLE application (
	id                  INTEGER PRIMARY KEY AUTOINCREMENT,
    name                    TEXT,
    version		    TEXT,
    usage                   TEXT, 
    description		    TEXT,
    language                TEXT,
    paradigm                TEXT,
    algorithms              TEXT,
    lines_of_code	    TEXT,
    big_lil_endian	    TEXT,
    directives		    TEXT,
    memory_intensity	    TEXT,
    communication_intensity TEXT,
    cpu_intensity	    TEXT,
    os_requirements	    TEXT,
    other_requirements	    TEXT,
    spectral_or_physical_mesh	TEXT,
    static_or_adaptive_mesh	TEXT,
    structured_or_unstructured_mesh	TEXT,
    code_history	    TEXT,    
    primary_industry	    TEXT,
    primary_technology_area TEXT,
    rib_entry		    TEXT
);

CREATE TABLE experiment (
    id                  INTEGER PRIMARY KEY AUTOINCREMENT,
    application             INT         NOT NULL,
    name                    TEXT,
    sysinfo                 TEXT,
    configinfo		    TEXT,
    instruinfo		    TEXT,
    compilerinfo	    TEXT,
    FOREIGN KEY(application) REFERENCES application(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE trial (
    id                  INTEGER PRIMARY KEY AUTOINCREMENT,
    name                    TEXT,
    experiment              INT         NOT NULL,
    date                    TIMESTAMP,
    collectorid		    INT,
    node_count              INT,
    contexts_per_node       INT,
    threads_per_context     INT,
    FOREIGN KEY(experiment) REFERENCES experiment(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE metric (
    id                  INTEGER PRIMARY KEY AUTOINCREMENT,
    name                    TEXT        NOT NULL,
    trial                   INT		NOT NULL,
    FOREIGN KEY(trial) REFERENCES trial(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE interval_event (
    id                  INTEGER PRIMARY KEY AUTOINCREMENT,
    trial                   INT         NOT NULL,
    name                    TEXT        NOT NULL,
    group_name              TEXT,
    source_file		    TEXT,
    line_number		    INT,
    line_number_end	    INT,
    FOREIGN KEY(trial) REFERENCES trial(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE atomic_event (
    id                  INTEGER PRIMARY KEY AUTOINCREMENT,
    trial                   INT         NOT NULL,
    name                    TEXT        NOT NULL,
    group_name              TEXT,
    source_file		    TEXT,
    line_number		    INT,
    FOREIGN KEY(trial) REFERENCES trial(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE interval_location_profile (
    interval_event          INT         NOT NULL,
    node                    INT         NOT NULL,             
    context                 INT         NOT NULL,
    thread                  INT         NOT NULL,
    metric                  INT		NOT NULL,
    inclusive_percentage    DOUBLE PRECISION,
    inclusive               DOUBLE PRECISION,
    exclusive_percentage    DOUBLE PRECISION,
    exclusive               DOUBLE PRECISION,
    call                    DOUBLE PRECISION,
    subroutines             DOUBLE PRECISION,
    inclusive_per_call      DOUBLE PRECISION,
    sum_exclusive_squared   DOUBLE PRECISION,
    FOREIGN KEY(interval_event) REFERENCES interval_event(id) ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY(metric) REFERENCES metric(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE atomic_location_profile (
    atomic_event            INT         NOT NULL,
    node                    INT         NOT NULL,             
    context                 INT         NOT NULL,
    thread                  INT         NOT NULL,
    sample_count            INT,         
    maximum_value           DOUBLE PRECISION,
    minimum_value           DOUBLE PRECISION,
    mean_value              DOUBLE PRECISION,
    standard_deviation	    DOUBLE PRECISION,
    FOREIGN KEY(atomic_event) REFERENCES atomic_event(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE interval_total_summary (
    interval_event          INT         NOT NULL,
    metric                  INT		NOT NULL,
    inclusive_percentage    DOUBLE PRECISION,
    inclusive               DOUBLE PRECISION,
    exclusive_percentage    DOUBLE PRECISION,
    exclusive               DOUBLE PRECISION,
    call                    DOUBLE PRECISION,
    subroutines             DOUBLE PRECISION,
    inclusive_per_call      DOUBLE PRECISION,
    sum_exclusive_squared   DOUBLE PRECISION,
    FOREIGN KEY(interval_event) REFERENCES interval_event(id) ON DELETE NO ACTION ON UPDATE NO ACTION,
    FOREIGN KEY(metric) REFERENCES metric(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE interval_mean_summary (
    interval_event          INT         NOT NULL,
    metric                  INT		NOT NULL,
    inclusive_percentage    DOUBLE PRECISION,
    inclusive               DOUBLE PRECISION,
    exclusive_percentage    DOUBLE PRECISION,
    exclusive               DOUBLE PRECISION,
    call                    DOUBLE PRECISION,
    subroutines             DOUBLE PRECISION,
    inclusive_per_call      DOUBLE PRECISION,
    sum_exclusive_squared   DOUBLE PRECISION,
	FOREIGN KEY(interval_event) REFERENCES interval_event(id) ON DELETE NO ACTION ON UPDATE NO ACTION,
	FOREIGN KEY(metric) REFERENCES metric(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE machine_thread_map (
    id                  INTEGER PRIMARY KEY AUTOINCREMENT,
    trial                     INTEGER       NOT NULL,
    node                      INTEGER       NOT NULL,
    context                   INTEGER       NOT NULL,
    thread                    INTEGER       NOT NULL,
    process_id                INTEGER,
    thread_id                 INTEGER,
    cpu_index                 INTEGER,
    operating_system_name     TEXT,
    operating_system_version  TEXT,
    system_nodename           TEXT,
    system_architecthure      TEXT,
    system_num_processors     INTEGER,
    cpu_type                  TEXT,
    cpu_mhz                   TEXT,
    cpu_cache_size            INTEGER,
    cpu_cache_alignment       INTEGER,
    cpu_num_cores             INTEGER,
    FOREIGN KEY(trial) REFERENCES trial(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);


CREATE TABLE trace (
    trialid		    INT		NOT NULL,
    tracetype		    TEXT,
    tracefilename	    TEXT,
    nodeid		    INT,
    contextid		    INT,
    threadid		    INT,
    FOREIGN KEY(trialid) REFERENCES trial(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE tracesum (
    trialid	            INT		NOT NULL,
    tracetype		    TEXT,
    tracefilename	    TEXT,
    FOREIGN KEY(trialid) REFERENCES trial(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);


CREATE INDEX experiment_application_index on experiment (application);
CREATE INDEX trial_experiment_index on trial (experiment);
CREATE INDEX interval_event_trial_index on interval_event (trial);
CREATE INDEX interval_loc_interval_event_metric_index on interval_location_profile (interval_event, metric);
CREATE INDEX interval_total_interval_event_metric_index on interval_total_summary (interval_event, metric);
CREATE INDEX interval_mean_interval_event_metric_index on interval_mean_summary (interval_event, metric);
CREATE INDEX interval_loc_f_m_n_c_t_index on interval_location_profile (interval_event, metric, node, context, thread);
CREATE INDEX interval_loc_metric_index on interval_location_profile (metric);
CREATE INDEX atomic_event_trial_index on atomic_event(trial);
CREATE INDEX atomic_location_profile_index on atomic_location_profile(atomic_event);
