calibre-db
Version:
<description>
194 lines • 7.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeStatement = exports.Statement = void 0;
const tslib_1 = require("tslib");
const squel_1 = (0, tslib_1.__importDefault)(require("squel"));
function _concat(t1, t2, link, prop, fields, sep = '|') {
const [f1, f2] = fields;
const c = `${t1}_${prop}`;
return `(SELECT GROUP_CONCAT(${c}, '${sep}') FROM (SELECT DISTINCT ${t1}.${prop} ${c} FROM ${link} JOIN ${t1} ON ${link}.${f1} = ${t1}.id WHERE ${link}.${f2} = ${t2}.id))`;
}
function concat_simple(t, t2, f, prop, distinct = true) {
// @ts-ignore
distinct = (distinct ? ' DISTINCT' : '');
const c = `${t}_${f}`;
return `(SELECT GROUP_CONCAT(${c}, '|') FROM (SELECT${distinct} ${t}.${prop} ${c} FROM ${t} WHERE ${t}.${f} = ${t2}.id))`;
}
function concat(f1, f2, prop, dir = false, sep = '|') {
const t1 = f1.replace(/s$/, '') + 's';
const t2 = f2.replace(/s$/, '') + 's';
const link = (dir ? `${t1}_${t2}` : `${t2}_${t1}`) + '_link';
const fields = [f1, f2];
return _concat(t1, t2, link, prop, fields, sep);
}
class Statement {
constructor() {
this._query = squel_1.default.select({ separator: "\n" });
}
bookFields() {
this._query
.field('books.id', 'book_id')
.field('books.title', 'book_title')
.field('books.sort', 'book_sort')
.field('books.author_sort', 'author_sort')
.field('books.has_cover', 'book_has_cover')
.field('books.pubdate', 'book_date')
.field('books.path', 'book_path')
.field('books.isbn', 'book_isbn')
.field('books.series_index', 'book_series_index')
.field('books.uuid', 'book_uuid')
.field('books.timestamp', 'book_timestamp')
.field('books.last_modified', 'book_last_modified');
return this;
}
authorBrowserFields() {
this._query
.field('tag_browser_authors.count', 'authors_books_count');
return this;
}
authorFields() {
this._query
.field('authors.id', 'author_id')
.field('authors.name', 'author_name')
.field('authors.sort', 'author_sort');
return this;
}
tagFields() {
this._query
.field('tags.name', 'tag_name')
.field('tags.id', 'tag_id')
.field('tags.count', 'tag_books_count');
return this;
}
seriesFields() {
this._query
.field('series.id', 'series_id')
.field('series.name', 'series_name')
.field('series.sort', 'series_sort');
return this;
}
sumData() {
this._query
.field(concat_simple('data', 'books', 'book', 'id'), 'data_id')
.field(concat_simple('data', 'books', 'book', 'format'), 'data_format')
.field(concat_simple('data', 'books', 'book', 'uncompressed_size'), 'data_size')
.field(concat_simple('data', 'books', 'book', 'name', false), 'data_name');
//.field("GROUP_CONCAT(DISTINCT data.format)",'data_format')
//.field("GROUP_CONCAT(DISTINCT data.uncompressed_size)",'data_size')
//.join('data')
//.where('data.book = books.id');
return this;
}
sumBooks(_from = "author" /* author */) {
this._query
.field(concat('book', _from, 'id', true), 'book_id')
.field(concat('book', _from, 'title', true), 'book_title')
.field(concat('book', _from, 'sort', true), 'book_sort')
.field(concat('book', _from, 'has_cover', true), 'book_has_cover')
.field(concat('book', _from, 'pubdate', true), 'book_pubdate')
.field(concat('book', _from, 'path', true), 'book_path')
.field(concat('book', _from, 'series_index', true), 'book_series_index');
/*
.field("GROUP_CONCAT(DISTINCT books.id)",'books_id')
.field("GROUP_CONCAT(DISTINCT books.title)",'books_name')
.field("GROUP_CONCAT(DISTINCT books.sort)",'books_sort')
.field("GROUP_CONCAT(DISTINCT books.has_cover)",'books_has_cover')
.field("GROUP_CONCAT(DISTINCT books.pubdate)",'books_pubdate')
.field("GROUP_CONCAT(DISTINCT books.path)",'books_path')
.field("GROUP_CONCAT(DISTINCT books.series_index)",'books_series_index')
*/
return this;
}
sumSeries() {
this._query
.field(concat('series', 'book', 'id'), 'series_id')
.field(concat('series', 'book', 'name'), 'series_name')
.field(concat('series', 'book', 'sort'), 'series_sort');
/*
.field("GROUP_CONCAT(DISTINCT series.id)",'series_id')
.field("GROUP_CONCAT(DISTINCT series.name)",'series_name')
.field("GROUP_CONCAT(DISTINCT series.sort)",'series_sort')
*/
return this;
}
sumTags() {
this._query
//.field('tags.name','tag_names')
.field(concat('tag', 'book', 'id'), 'tag_id')
.field(concat('tag', 'book', 'name'), 'tag_name');
return this;
}
sumAuthor() {
this._query
.field(concat('author', 'book', 'id'), 'author_id')
.field(concat('author', 'book', 'name'), 'author_name')
.field(concat('author', 'book', 'sort'), 'author_sort');
return this;
}
commentTags() {
this._query
.field('comments.text', 'comment');
return this;
}
appendComments() {
this._query
.left_join('comments', null, 'comments.book = books.id');
return this;
}
appendSeries() {
this._query
.join('books_series_link', null, 'books_series_link.book = books.id')
.join('series', null, 'series.id = books_series_link.series');
return this;
}
appendBookFromTag() {
this._query
.join('books_tags_link', null, 'books_tags_link.tag = tags.id')
.join('books', null, 'books.id = books_tags_link.book');
return this;
}
appendBookFromSeries() {
this._query
.left_join('books_series_link', null, 'books_series_link.series = series.id')
.left_join('books', null, 'books.id = books_series_link.book');
return this;
}
appendBookFromAuthor() {
this._query
.join('books_authors_link', null, 'books_authors_link.author = authors.id')
.join('books', null, 'books.id = books_authors_link.book');
return this;
}
appendTagFromBook() {
this._query
.join('books_tags_link', null, 'books_tags_link.book = books.id')
.join('tags', null, 'tags.id = books_tags_link.tag');
return this;
}
appendAuthorFromBook() {
this._query
//.left_join('comments',null,'comments.book = books.id')
.field('authors.name', 'author_name')
.join('books_authors_link', null, 'books_authors_link.book = books.id')
.join('authors', null, 'authors.id = books_authors_link.author');
return this;
}
appendAuthorBrowser() {
this._query
.join('tag_browser_authors', null, 'tag_browser_authors.id = authors.id');
return this;
}
toString() {
return this._query.toString();
}
query() {
return this._query;
}
}
exports.Statement = Statement;
function makeStatement() {
return new Statement();
}
exports.makeStatement = makeStatement;
exports.default = makeStatement;
//# sourceMappingURL=Statement.js.map