| @@ -18,12 +18,14 @@ class Codelet(object): | |||||
| code was last modified. | code was last modified. | ||||
| :ivar rank: (float) A quanitification of the source code's quality, as | :ivar rank: (float) A quanitification of the source code's quality, as | ||||
| per available ratings (stars, forks, upvotes, etc.). | per available ratings (stars, forks, upvotes, etc.). | ||||
| :ivar symbols: (dict) Dictionary containing dictionaries of functions, classes, | |||||
| variable definitions, etc. | |||||
| :ivar symbols: (dict) Dictionary containing dictionaries of functions, | |||||
| classes, variable definitions, etc. | |||||
| :ivar origin: (tuple) 3-tuple of (site_name, site_url, image_blob), as | |||||
| added by the database. | |||||
| """ | """ | ||||
| def __init__(self, name, code, filename, language, authors, code_url, | def __init__(self, name, code, filename, language, authors, code_url, | ||||
| date_created, date_modified, rank): | |||||
| date_created, date_modified, rank, symbols=None, origin=None): | |||||
| """ | """ | ||||
| Create a Codelet instance. | Create a Codelet instance. | ||||
| @@ -36,6 +38,8 @@ class Codelet(object): | |||||
| :param date_created: see :attr:`self.date_created` | :param date_created: see :attr:`self.date_created` | ||||
| :param date_modified: see :attr:`self.date_modified` | :param date_modified: see :attr:`self.date_modified` | ||||
| :param rank: see :attr:`self.rank` | :param rank: see :attr:`self.rank` | ||||
| :param symbols: see :attr:`self.symbols` | |||||
| :param origin: see :attr:`self.origin` | |||||
| :type name: see :attr:`self.name` | :type name: see :attr:`self.name` | ||||
| :type code: see :attr:`self.code` | :type code: see :attr:`self.code` | ||||
| @@ -46,6 +50,8 @@ class Codelet(object): | |||||
| :type date_created: see :attr:`self.date_created` | :type date_created: see :attr:`self.date_created` | ||||
| :type date_modified: see :attr:`self.date_modified` | :type date_modified: see :attr:`self.date_modified` | ||||
| :type rank: see :attr:`self.rank` | :type rank: see :attr:`self.rank` | ||||
| :type symbols: see :attr:`self.symbols` | |||||
| :type origin: see :attr:`self.origin` | |||||
| """ | """ | ||||
| self.name = name | self.name = name | ||||
| @@ -57,3 +63,5 @@ class Codelet(object): | |||||
| self.date_created = date_created | self.date_created = date_created | ||||
| self.date_modified = date_modified | self.date_modified = date_modified | ||||
| self.rank = rank | self.rank = rank | ||||
| self.symbols = symbols or {} | |||||
| self.origin = origin or (None, None, None) | |||||
| @@ -65,10 +65,30 @@ class Database(object): | |||||
| num_results = 0 # TODO: NotImplemented | num_results = 0 # TODO: NotImplemented | ||||
| return ids, num_results | return ids, num_results | ||||
| def _get_codelets_from_ids(self, cursor, ids): | |||||
| def _get_codelets_from_ids(self, ids): | |||||
| """Return a list of Codelet objects given a list of codelet IDs.""" | """Return a list of Codelet objects given a list of codelet IDs.""" | ||||
| # TODO: remember that codelets need an origin field | |||||
| raise NotImplementedError() # TODO | |||||
| query = """SELECT * | |||||
| FROM codelets | |||||
| INNER JOIN code ON codelet_code_id = code_id | |||||
| INNER JOIN origins ON codelet_origin = origin_id | |||||
| WHERE codelet_id = ?""" | |||||
| with self._conn.cursor(oursql.DictCursor) as cursor: | |||||
| cursor.executemany(query, [(id,) for id in ids]) | |||||
| for row in cursor.fetchone(): | |||||
| if row["origin_url_base"]: | |||||
| url = row["codelet_url"] | |||||
| else: | |||||
| url = row["origin_url_base"] + row["codelet_url"] | |||||
| origin = (row["origin_name"], row["origin_url"], | |||||
| row["origin_image"]) | |||||
| authors = NotImplemented # TODO: list of 3-tuples (author_name, author_url or None) | |||||
| symbols = NotImplemented # TODO: dict of {sym_type: (name, decls, uses)} | |||||
| yield Codelet( | |||||
| row["codelet_name"], row["code_code"], None, | |||||
| row["code_lang"], authors, url, | |||||
| row["codelet_date_created"], row["codelet_date_modified"], | |||||
| row["codelet_rank"], symbols, origin) | |||||
| def _decompose_url(self, cursor, url): | def _decompose_url(self, cursor, url): | ||||
| """Break up a URL into an origin (with a URL base) and a suffix.""" | """Break up a URL into an origin (with a URL base) and a suffix.""" | ||||
| @@ -133,7 +153,8 @@ class Database(object): | |||||
| num_mnt = num_results / (10 ** num_exp) | num_mnt = num_results / (10 ** num_exp) | ||||
| cursor.execute(query2, (cache_id, num_mnt, num_exp)) | cursor.execute(query2, (cache_id, num_mnt, num_exp)) | ||||
| cursor.executemany(query3, [(cache_id, c_id) for c_id in ids]) | cursor.executemany(query3, [(cache_id, c_id) for c_id in ids]) | ||||
| return (num_results, self._get_codelets_from_ids(cursor, ids)) | |||||
| codelet_gen = self._get_codelets_from_ids(ids) | |||||
| return (num_results, list(codelet_gen)) | |||||
| def insert(self, codelet): | def insert(self, codelet): | ||||
| """ | """ | ||||
| @@ -33,15 +33,13 @@ class Tree(object): | |||||
| """ | """ | ||||
| return repr(self) | return repr(self) | ||||
| def build_query(self, page=1, page_size=10, pretty=False): | |||||
| def build_query(self, page=1, page_size=10): | |||||
| """Convert the query tree into a parameterized SQL SELECT statement. | """Convert the query tree into a parameterized SQL SELECT statement. | ||||
| :param page: The page number to get results for. | :param page: The page number to get results for. | ||||
| :type page: int | :type page: int | ||||
| :param page_size: The number of results per page. | :param page_size: The number of results per page. | ||||
| :type page_size: int | :type page_size: int | ||||
| :param pretty: Whether to pretty-print the SQL query or not. | |||||
| :type pretty: bool | |||||
| :return: SQL query data. | :return: SQL query data. | ||||
| :rtype: 2-tuple of (SQL statement string, query parameter tuple) | :rtype: 2-tuple of (SQL statement string, query parameter tuple) | ||||
| @@ -67,6 +65,5 @@ class Tree(object): | |||||
| joins = " ".join(get_table_joins(tables)) | joins = " ".join(get_table_joins(tables)) | ||||
| offset = (page - 1) * page_size | offset = (page - 1) * page_size | ||||
| ## TODO: handle pretty | |||||
| query = QUERY_TEMPLATE % (score, joins, cond, page_size, offset) | query = QUERY_TEMPLATE % (score, joins, cond, page_size, offset) | ||||
| return query, tuple(arglist * 2 if need_ranks else arglist) | return query, tuple(arglist * 2 if need_ranks else arglist) | ||||