Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions qiita_core/metadata_map.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/usr/bin/env python

__author__ = "Jose Antonio Navas Molina"
__copyright__ = "Copyright 2013, The Qiita Project"
__credits__ = ["Jose Antonio Navas Molina"]
__license__ = "BSD"
__version__ = "0.1.0-dev"
__maintainer__ = "Jose Antonio Navas Molina"
__email__ = "josenavasmolina@gmail.edu"
__status__ = "Development"

from qiime.util import MetadataMap as QiimeMetadataMap


class MetadataMap(QiimeMetadataMap):
"""Extends the MetadataMap to include the id_ attribute"""

def __init__(self, **kwargs):
super(MetadataMap, self).__init__(kwargs)
self._id = None

def set_id(self, study_id, num):
"""Set the MetadataMap id"""
self._id = (study_id, num)

def get_id(self):
"""Returns the id of the MetadataMap"""
return self._id
23 changes: 9 additions & 14 deletions qiita_db/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,24 @@
__email__ = "josenavasmolina@gmail.edu"
__status__ = "Development"

from qiita_db.backends.sql import (SQLUser, SQLAnalysis, SQLStudy, SQLSample,
SQLJob)
from qiita_db.backends.fs import FSUser, FSAnalysis, FSStudy, FSSample, FSJob
from qiita_db.backends.dev import (DEVUser, DEVAnalysis, DEVStudy, DEVSample,
DEVJob)
from .backends.sql import (SQLUser, SQLAnalysis, SQLStudy, SQLSample, SQLJob,
SQLMetadataMap)
from .backends.fs import FSUser, FSAnalysis, FSStudy, FSSample, FSJob
from qiita_db.config import qiita_db_config

if BACKEND == "SQL":

if qiita_db_config.backend == "SQL":
UserStorage = SQLUser
AnalysisStorage = SQLAnalysis
StudyStorage = SQLStudy
SampleStorage = SQLSample
JobStorage = SQLJob
elif BACKEND == "FS":
MetadataMapStorage = SQLMetadataMap
elif qiita_db_config.backend == "FS":
UserStorage = FSUser
AnalysisStorage = FSAnalysis
StudyStorage = FSStudy
SampleStorage = FSSample
JobStorage = FSJob
elif BACKEND == "DEV":
UserStorage = DEVUser
AnalysisStorage = DEVAnalysis
StudyStorage = DEVStudy
SampleStorage = DEVSample
JobStorage = DEVJob
else:
raise ValueError("Backend not recognized: %s" % BACKEND)
raise ValueError("Backend not recognized: %s" % qiita_db_config.backend)
16 changes: 0 additions & 16 deletions qiita_db/backends/dev/__init__.py

This file was deleted.

17 changes: 0 additions & 17 deletions qiita_db/backends/dev/analysis_storage.py

This file was deleted.

17 changes: 0 additions & 17 deletions qiita_db/backends/dev/job_storage.py

This file was deleted.

17 changes: 0 additions & 17 deletions qiita_db/backends/dev/sample_storage.py

This file was deleted.

17 changes: 0 additions & 17 deletions qiita_db/backends/dev/study_storage.py

This file was deleted.

17 changes: 0 additions & 17 deletions qiita_db/backends/dev/user_storage.py

This file was deleted.

10 changes: 5 additions & 5 deletions qiita_db/backends/fs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
__email__ = "josenavasmolina@gmail.edu"
__status__ = "Development"

from qiita_db.backends.fs.user_storage.py import UserStorage as FSUser
from qiita_db.backends.fs.analysis_storage.py import AnalysisStorage as FSAnalysis
from qiita_db.backends.fs.study_storage.py import StudyStorage as FSStudy
from qiita_db.backends.fs.sample_storage.py import SampleStorage as FSSample
from qiita_db.backends.fs.job_storage.py import JobStorage as FSJob
from qiita_db.backends.fs.user_storage import UserStorage as FSUser
from qiita_db.backends.fs.analysis_storage import AnalysisStorage as FSAnalysis
from qiita_db.backends.fs.study_storage import StudyStorage as FSStudy
from qiita_db.backends.fs.sample_storage import SampleStorage as FSSample
from qiita_db.backends.fs.job_storage import JobStorage as FSJob
11 changes: 6 additions & 5 deletions qiita_db/backends/sql/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
__email__ = "josenavasmolina@gmail.edu"
__status__ = "Development"

from qiita_db.backends.sql.user_storage.py import UserStorage as SQLUser
from qiita_db.backends.sql.analysis_storage.py import AnalysisStorage as SQLAnalysis
from qiita_db.backends.sql.study_storage.py import StudyStorage as SQLStudy
from qiita_db.backends.sql.sample_storage.py import SampleStorage as SQLSample
from qiita_db.backends.sql.job_storage.py import JobStorage as SQLJob
from .user_storage import UserStorage as SQLUser
from .analysis_storage import AnalysisStorage as SQLAnalysis
from .study_storage import StudyStorage as SQLStudy
from .sample_storage import SampleStorage as SQLSample
from .job_storage import JobStorage as SQLJob
from .metadata_map_storage import MetadataMapStorage as SQLMetadataMap
10 changes: 7 additions & 3 deletions qiita_db/backends/sql/analysis_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,13 @@
__email__ = ""
__status__ = "Development"

from qiita_db.core.base_api import BaseStorageAPI
from qiita_db.backends.sql.base_sql import BaseSQLStorageAPI


class AnalysisStorage(BaseStorageAPI):
class AnalysisStorage(BaseSQLStorageAPI):
""""""
pass

def __init__(self):
""""""
super(AnalysisStorage, self).__init__()

20 changes: 20 additions & 0 deletions qiita_db/backends/sql/base_sql.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env python

__author__ = ""
__copyright__ = "Copyright 2013, The Qiita Project"
__credits__ = [""]
__license__ = "BSD"
__version__ = "0.1.0-dev"
__maintainer__ = ""
__email__ = ""
__status__ = "Development"

from qiita_db.core.base_api import BaseStorageAPI
from qiita_db.backends.sql.sql_connection import SQLConnectionHandler


class BaseSQLStorageAPI(BaseStorageAPI):
""""""
def __init__(self):
""""""
self.conn_handler = SQLConnectionHandler()
12 changes: 12 additions & 0 deletions qiita_db/backends/sql/connections.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
__author__ = "Jose Antonio Navas Molina"
__copyright__ = "Copyright 2013, The Qiita project"
__credits__ = ["Jose Antonio Navas Molina", "Adam Robbins-Pianka"]
__license__ = "BSD"
__version__ = "0.1.0-dev"
__maintainer__ = "Jose Antonio Navas Molina"
__email__ = "josenavasmolina@gmail.com"

from psycopg2 import connect

# Connect to the database
postgres = connect(user='defaultuser', database='qiime_md', host='localhost')
29 changes: 29 additions & 0 deletions qiita_db/backends/sql/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
__author__ = "Jose Antonio Navas Molina"
__copyright__ = "Copyright 2013, The Qiita project"
__credits__ = ["Jose Antonio Navas Molina"]
__license__ = "BSD"
__version__ = "0.1.0-dev"
__maintainer__ = "Jose Antonio Navas Molina"
__email__ = "josenavasmolina@gmail.com"

from qiita_db.core.exceptions import QiitaDBError


class QiitaDBSQLError(QiitaDBError):
"""Base class for all Qiita-db SQL backend errors"""
pass


class QiitaDBSQLExecutionError(QiitaDBSQLError):
"""Exception for error when executing SQL queries"""
pass


class QiitaDBSQLParseError(QiitaDBError):
"""Exception for error when parsing files"""
pass


class QiitaDBSQLConnectionError(QiitaDBError):
"""Exception for error when connecting to the db"""
pass
88 changes: 88 additions & 0 deletions qiita_db/backends/sql/metadata_map_storage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#!/usr/bin/env python
from __future__ import division

__author__ = "Jose Antonio Navas Molina"
__copyright__ = "Copyright 2013, The Qiita project"
__credits__ = ["Jose Antonio Navas Molina", "Adam Robbins-Pianka"]
__license__ = "BSD"
__version__ = "0.1.0-dev"
__maintainer__ = "Jose Antonio Navas Molina"
__email__ = "josenavasmolina@gmail.com"

from itertools import izip
from string import lower

from .base_sql import BaseSQLStorageAPI
from .util import quote_column_name, quote_data_value, get_datatypes


class MetadataMapStorage(BaseSQLStorageAPI):
""""""

def insert(self, metadata_map):
"""Inserts the MetadataMap in the backend storage"""
# Get the table name
table_name = "study_%s_%s" % metadata_map.get_id()
headers = metadata_map.CategoryNames()
datatypes = get_datatypes(metadata_map)

# Get the columns names in SQL safe
sql_safe_column_names = [quote_column_name(h) for h in headers]

# Get the column names paired with its datatype for SQL
columns = []
for column_name, datatype in izip(sql_safe_column_names, datatypes):
columns.append('%s %s' % (column_name, datatype))
# Get the columns in a comma-separated string
columns = ", ".join(columns)
# Create a table for the study
self.conn_handler.execute("create table %s (sampleid varchar, %s)" %
(table_name, columns))

# Add rows to the column_tables table
lc_table_name = lower(table_name)
quoted_lc_table_name = quote_data_value(lc_table_name)
column_tables_sql_template = ("insert into column_tables (column_name,"
" table_name, datatype) values (%s, " +
quoted_lc_table_name + ", %s)")
# The column names should be lowercase and quoted
quoted_lc_headers = [quote_data_value(lower(h)) for h in headers]
# Pair up the column names with its datatype
sql_args_list = [(column_name, datatype) for column_name, datatype in
izip(quoted_lc_headers, datatypes)]
self.conn_handler.executemany(column_tables_sql_template,
sql_args_list)

# Add rows into the study table
columns = ', '.join(sql_safe_column_names)
insert_sql_template = ('insert into ' + table_name + ' (sampleid, ' +
columns + ') values (%s' +
', %s' * len(sql_safe_column_names) + ' )')

sql_args_list = []
for sample_id in metadata_map.SampleIds():
data = metadata_map.getSampleMetadata(sample_id)
values = [scrub_data(sample_id)]
values += [scrub_data(data[header]) for header in headers]
sql_args_list.append(values)

sql_executemany(insert_sql_template, sql_args_list)

def update(self, metadata_map):
"""Updates the MetadataMap attributes in the backend storage"""
raise NotImplementedError("MetadataMapStorage.update not implemented")

def delete(self, md_id):
"""Deletes the MetadataMap with id=md_id from the SQL db"""
table_name = "study_%s_%s" % md_id
# Dropping table
self.conn_handler.execute('drop table %s' % table_name)
# Deleting rows from column_tables for the study
# The query should never fail; even when there are no rows for this
# study, the query will do nothing but complete successfully
self.conn_handler.execute("delete from column_tables where "
"table_name = %s", (table_name,))

def search(self, searchObject):
"""Retrieves all the objects that match searchObject queries"""
raise NotImplementedError("MetadataMapStorage.search not implemented")
Loading