CREATE TABLE application (
    id                      SERIAL          NOT NULL    PRIMARY KEY,
    name                    VARCHAR(100),
    version                 VARCHAR(100)    DEFAULT '1.0',
    description             TEXT, 
    language                VARCHAR(100),
    paradigm                VARCHAR(100),
    usage_text              TEXT,
    execution_options       TEXT,
    userdata                TEXT
);

CREATE TABLE experiment (
    id                      SERIAL          NOT NULL    PRIMARY KEY,
    application             INT             NOT NULL,
    name                    VARCHAR(100),
	system_name             VARCHAR(100),
	system_machine_type     VARCHAR(100),
	system_arch             VARCHAR(100),
	system_os               VARCHAR(100),
	system_memory_size      VARCHAR(100),
	system_processor_amt    VARCHAR(100),
	system_l1_cache_size    VARCHAR(100),
	system_l2_cache_size    VARCHAR(100),
    system_userdata         TEXT,
	compiler_cpp_name       VARCHAR(100),
	compiler_cpp_version    VARCHAR(100),
	compiler_cc_name        VARCHAR(100),
	compiler_cc_version     VARCHAR(100),
	compiler_java_dirpath   VARCHAR(100),
	compiler_java_version   VARCHAR(100),
    compiler_userdata       TEXT,
	configure_prefix        VARCHAR(100),
	configure_arch          VARCHAR(100),
	configure_cpp           VARCHAR(100),
	configure_cc            VARCHAR(100),
	configure_jdk           VARCHAR(100),
	configure_profile       VARCHAR(3),
    configure_userdata      TEXT,
    userdata                TEXT,
	FOREIGN KEY(application) REFERENCES application(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE trial (
    id                      SERIAL          NOT NULL    PRIMARY KEY,
    name                    VARCHAR(100),
    experiment              INT             NOT NULL,
    time                    TIMESTAMP       WITHOUT TIME ZONE,
    problem_definition      TEXT,
    node_count              INT,
    contexts_per_node       INT,
    threads_per_context     INT,
    userdata                TEXT,
	FOREIGN KEY(experiment) REFERENCES experiment(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE metric (
    id                      SERIAL          NOT NULL     PRIMARY KEY,
    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                      SERIAL          NOT NULL    PRIMARY KEY,
    trial                   INT             NOT NULL,
    name                    TEXT            NOT NULL,
    group_name              VARCHAR(50),
	FOREIGN KEY(trial) REFERENCES trial(id) ON DELETE NO ACTION ON UPDATE NO ACTION
);

CREATE TABLE atomic_event (
    id                      SERIAL           NOT NULL    PRIMARY KEY,
    trial                   INT              NOT NULL,
    name                    TEXT             NOT NULL,
    group_name              VARCHAR(50),
	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    DECIMAL,
    inclusive               DECIMAL,
    exclusive_percentage    DECIMAL,
    exclusive               DECIMAL,
    call                    DECIMAL,
    subroutines             DECIMAL,
    inclusive_per_call      DECIMAL,
	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           DECIMAL,
    minimum_value           DECIMAL,
    mean_value              DECIMAL,
    standard_deviation      DECIMAL,
	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    DECIMAL,
    inclusive               DECIMAL,
    exclusive_percentage    DECIMAL,
    exclusive               DECIMAL,
    call                    DECIMAL,
    subroutines             DECIMAL,
    inclusive_per_call      DECIMAL,
	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    DECIMAL,
    inclusive               DECIMAL,
    exclusive_percentage    DECIMAL,
    exclusive               DECIMAL,
    call                    DECIMAL,
    subroutines             DECIMAL,
    inclusive_per_call      DECIMAL,
	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 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);

