diff --git a/web/api/js/codechecker-api-node/dist/codechecker-api-6.58.0.tgz b/web/api/js/codechecker-api-node/dist/codechecker-api-6.58.0.tgz deleted file mode 100644 index a8cf8ab10b..0000000000 Binary files a/web/api/js/codechecker-api-node/dist/codechecker-api-6.58.0.tgz and /dev/null differ diff --git a/web/api/js/codechecker-api-node/dist/codechecker-api-6.59.0.tgz b/web/api/js/codechecker-api-node/dist/codechecker-api-6.59.0.tgz new file mode 100644 index 0000000000..cf22568075 Binary files /dev/null and b/web/api/js/codechecker-api-node/dist/codechecker-api-6.59.0.tgz differ diff --git a/web/api/js/codechecker-api-node/package.json b/web/api/js/codechecker-api-node/package.json index 0bfd792add..86e4a596e9 100644 --- a/web/api/js/codechecker-api-node/package.json +++ b/web/api/js/codechecker-api-node/package.json @@ -1,6 +1,6 @@ { "name": "codechecker-api", - "version": "6.58.0", + "version": "6.59.0", "description": "Generated node.js compatible API stubs for CodeChecker server.", "main": "lib", "homepage": "https://github.com/Ericsson/codechecker", diff --git a/web/api/py/codechecker_api/dist/codechecker_api.tar.gz b/web/api/py/codechecker_api/dist/codechecker_api.tar.gz index 3875d3ef7f..7176e7e5ca 100644 Binary files a/web/api/py/codechecker_api/dist/codechecker_api.tar.gz and b/web/api/py/codechecker_api/dist/codechecker_api.tar.gz differ diff --git a/web/api/py/codechecker_api/setup.py b/web/api/py/codechecker_api/setup.py index b369453448..fc9d400def 100644 --- a/web/api/py/codechecker_api/setup.py +++ b/web/api/py/codechecker_api/setup.py @@ -8,7 +8,7 @@ with open('README.md', encoding='utf-8', errors="ignore") as f: long_description = f.read() -api_version = '6.58.0' +api_version = '6.59.0' setup( name='codechecker_api', diff --git a/web/api/py/codechecker_api_shared/dist/codechecker_api_shared.tar.gz b/web/api/py/codechecker_api_shared/dist/codechecker_api_shared.tar.gz index 4d607e2b2f..8fcb4c4967 100644 Binary files a/web/api/py/codechecker_api_shared/dist/codechecker_api_shared.tar.gz and b/web/api/py/codechecker_api_shared/dist/codechecker_api_shared.tar.gz differ diff --git a/web/api/py/codechecker_api_shared/setup.py b/web/api/py/codechecker_api_shared/setup.py index a4c2e70d02..90f09bf34e 100644 --- a/web/api/py/codechecker_api_shared/setup.py +++ b/web/api/py/codechecker_api_shared/setup.py @@ -8,7 +8,7 @@ with open('README.md', encoding='utf-8', errors="ignore") as f: long_description = f.read() -api_version = '6.58.0' +api_version = '6.59.0' setup( name='codechecker_api_shared', diff --git a/web/api/report_server.thrift b/web/api/report_server.thrift index 359372e28a..0913c321ab 100644 --- a/web/api/report_server.thrift +++ b/web/api/report_server.thrift @@ -391,6 +391,7 @@ struct ReportFilter { // have "value1" OR "value2" for "key1" AND have "value3" for "key2". 22: optional list annotations, 23: optional list reportStatus, // Specifying the status of the filtered reports. + 24: bool byReportChanges // TODO } struct RunReportCount { @@ -455,6 +456,7 @@ struct CompareData { 2: DiffType diffType, 3: list runTag, // Ids of the run history tags. 4: optional i64 openReportsDate, // Open reports date in unix time format. + 5: bool byReportChanges, // TODO } // This type is used to get line content information for the given file at the diff --git a/web/codechecker_web/shared/version.py b/web/codechecker_web/shared/version.py index e5d544a750..2ac2d84ae7 100644 --- a/web/codechecker_web/shared/version.py +++ b/web/codechecker_web/shared/version.py @@ -18,7 +18,7 @@ # The newest supported minor version (value) for each supported major version # (key) in this particular build. SUPPORTED_VERSIONS = { - 6: 58 + 6: 59 } # Used by the client to automatically identify the latest major and minor diff --git a/web/requirements.txt b/web/requirements.txt index b827484521..0729884bd5 100644 --- a/web/requirements.txt +++ b/web/requirements.txt @@ -1,5 +1,5 @@ lxml==5.2.2 -sqlalchemy==1.3.23 +sqlalchemy==1.4.45 alembic==1.5.5 portalocker==2.2.1 psutil==5.8.0 diff --git a/web/requirements_py/db_pg8000/requirements.txt b/web/requirements_py/db_pg8000/requirements.txt index 1e1ab10084..52f2c200ec 100644 --- a/web/requirements_py/db_pg8000/requirements.txt +++ b/web/requirements_py/db_pg8000/requirements.txt @@ -1,5 +1,5 @@ lxml==5.2.2 -sqlalchemy==1.3.23 +sqlalchemy==1.4.45 alembic==1.5.5 pg8000==1.15.2 psutil==5.8.0 diff --git a/web/requirements_py/db_psycopg2/requirements.txt b/web/requirements_py/db_psycopg2/requirements.txt index 92a328e8fd..0469fe93ad 100644 --- a/web/requirements_py/db_psycopg2/requirements.txt +++ b/web/requirements_py/db_psycopg2/requirements.txt @@ -1,5 +1,5 @@ lxml==5.2.2 -sqlalchemy==1.3.23 +sqlalchemy==1.4.45 alembic==1.5.5 psycopg2-binary==2.8.6 psutil==5.8.0 diff --git a/web/server/codechecker_server/api/report_server.py b/web/server/codechecker_server/api/report_server.py index f3e2a7a6b5..00bf776ef0 100644 --- a/web/server/codechecker_server/api/report_server.py +++ b/web/server/codechecker_server/api/report_server.py @@ -26,8 +26,9 @@ import sqlalchemy from sqlalchemy.sql.expression import or_, and_, not_, func, \ - asc, desc, union_all, select, bindparam, literal_column, case, cast -from sqlalchemy.orm import contains_eager + asc, desc, union_all, select, bindparam, literal_column, case, cast, \ + except_, intersect +from sqlalchemy.orm import contains_eager, aliased import codechecker_api_shared from codechecker_api.codeCheckerDBAccess_v6 import constants, ttypes @@ -227,6 +228,14 @@ def process_report_filter( cmp_filter_expr, join_tables = process_cmp_data_filter( session, run_ids, report_filter, cmp_data) + if cmp_filter_expr is not None: + print("---------------____") + print("--------cmp_filter_expr-------____") + print(cmp_filter_expr) + print(cmp_filter_expr.compile().params) + print("---------------____") + print("---------------____") + if cmp_filter_expr is not None: AND.append(cmp_filter_expr) @@ -640,10 +649,8 @@ def get_open_reports_date_filter_query_old(tbl=Report, date=RunHistory.time): return tbl.detected_at <= date -def get_diff_bug_id_query(session, run_ids, tag_ids, open_reports_date): +def get_diff_bug_id_query_impl(q, run_ids, tag_ids, open_reports_date): """ Get bug id query for diff. """ - q = session.query(Report.bug_id.distinct()) - if run_ids: q = q.filter(Report.run_id.in_(run_ids)) if not tag_ids and not open_reports_date: @@ -662,6 +669,15 @@ def get_diff_bug_id_query(session, run_ids, tag_ids, open_reports_date): return q +def get_diff_bug_id_query(session, run_ids, tag_ids, open_reports_date): + """ Get bug id query for diff. """ + q = session.query(Report.bug_id.distinct().label("id")) + return get_diff_bug_id_query_impl(q, run_ids, tag_ids, open_reports_date) + +def get_diff_bug_id_query_with_length(session, run_ids, tag_ids, open_reports_date): + """ Get bug id query for diff. """ + q = session.query(Report.bug_id.distinct().label("id"), Report.path_length.label("length")) + return get_diff_bug_id_query_impl(q, run_ids, tag_ids, open_reports_date) def get_diff_bug_id_filter(run_ids, tag_ids, open_reports_date): """ Get bug id filter for diff. """ @@ -736,30 +752,45 @@ def process_cmp_data_filter(session, run_ids, report_filter, cmp_data): return and_(diff_filter), join_tables - query_base = get_diff_bug_id_query(session, run_ids, base_tag_ids, - base_open_reports_date) - query_base_runs = get_diff_run_id_query(session, run_ids, base_tag_ids) + if cmp_data.byReportChanges is not None and cmp_data.byReportChanges: + query_base = get_diff_bug_id_query_with_length(session, run_ids, base_tag_ids, + base_open_reports_date) - query_new = get_diff_bug_id_query(session, cmp_data.runIds, - cmp_data.runTag, - cmp_data.openReportsDate) + query_new = get_diff_bug_id_query_with_length(session, cmp_data.runIds, + cmp_data.runTag, + cmp_data.openReportsDate) + + else: + query_base = get_diff_bug_id_query(session, run_ids, base_tag_ids, + base_open_reports_date) + + query_new = get_diff_bug_id_query(session, cmp_data.runIds, + cmp_data.runTag, + cmp_data.openReportsDate) + + query_base_runs = get_diff_run_id_query(session, run_ids, base_tag_ids) query_new_runs = get_diff_run_id_query(session, cmp_data.runIds, cmp_data.runTag) if cmp_data.diffType == DiffType.NEW: - return and_(Report.bug_id.in_(query_new.except_(query_base)), - Report.run_id.in_(query_new_runs)), [Run] + query_bug_list = except_(query_new, query_base) + query_run_list = query_new_runs + elif cmp_data.diffType == DiffType.RESOLVED: - return and_(Report.bug_id.in_(query_base.except_(query_new)), - Report.run_id.in_(query_base_runs)), [Run] + query_bug_list = except_(query_base, query_new) + query_run_list = query_base_runs + elif cmp_data.diffType == DiffType.UNRESOLVED: - return and_(Report.bug_id.in_(query_base.intersect(query_new)), - Report.run_id.in_(query_new_runs)), [Run] + query_bug_list = intersect(query_base, query_new) + query_run_list = query_new_runs + else: raise codechecker_api_shared.ttypes.RequestFailed( codechecker_api_shared.ttypes.ErrorCode.DATABASE, 'Unsupported diff type: ' + str(cmp_data.diffType)) + return and_(Report.bug_id.in_(select(query_bug_list.c.id)), + Report.run_id.in_(query_run_list)), [Run] def process_run_history_filter(query, run_ids, run_history_filter): """ @@ -1160,15 +1191,13 @@ def get_analysis_statistics_query(session, run_ids, run_history_ids=None): query = session.query(AnalyzerStatistic, Run.id) if run_ids: - # Subquery to get analyzer statistics only for these run history id's. history_ids_subq = session.query( func.max(AnalyzerStatistic.run_history_id)) \ .filter(RunHistory.run_id.in_(run_ids)) \ .outerjoin( RunHistory, RunHistory.id == AnalyzerStatistic.run_history_id) \ - .group_by(RunHistory.run_id) \ - .subquery() + .group_by(RunHistory.run_id) query = query.filter( AnalyzerStatistic.run_history_id.in_(history_ids_subq)) @@ -1844,8 +1873,10 @@ def getDiffResultsHash(self, run_ids, report_hashes, diff_type, new_hashes_query = union_all(*[ select([bindparam('bug_id' + str(i), h) .label('bug_id')]) - for i, h in enumerate(chunk)]) - q = select([new_hashes_query]).except_(base_hashes) + for i, h in enumerate(chunk)]).subquery() + q = select([new_hashes_query]) \ + .except_(base_hashes) \ + .subquery() new_hashes.extend([res[0] for res in session.query(q)]) return new_hashes diff --git a/web/server/codechecker_server/migrations/report/versions/080349e895d7_add_check_command_to_run_history.py b/web/server/codechecker_server/migrations/report/versions/080349e895d7_add_check_command_to_run_history.py index c6b6080c7c..7f2e73e3b6 100644 --- a/web/server/codechecker_server/migrations/report/versions/080349e895d7_add_check_command_to_run_history.py +++ b/web/server/codechecker_server/migrations/report/versions/080349e895d7_add_check_command_to_run_history.py @@ -19,7 +19,7 @@ def upgrade(): op.add_column('run_histories', - sa.Column('check_command', sa.Binary(), nullable=True)) + sa.Column('check_command', sa.LargeBinary(), nullable=True)) def downgrade(): diff --git a/web/server/codechecker_server/migrations/report/versions/3793e361a752_source_components.py b/web/server/codechecker_server/migrations/report/versions/3793e361a752_source_components.py index 39273ec486..eb182963d3 100644 --- a/web/server/codechecker_server/migrations/report/versions/3793e361a752_source_components.py +++ b/web/server/codechecker_server/migrations/report/versions/3793e361a752_source_components.py @@ -21,7 +21,7 @@ def upgrade(): op.create_table( 'source_components', sa.Column('name', sa.String(), nullable=False), - sa.Column('value', sa.Binary(), nullable=False), + sa.Column('value', sa.LargeBinary(), nullable=False), sa.Column('description', sa.Text(), nullable=True), sa.Column('username', sa.String(), nullable=True), sa.PrimaryKeyConstraint('name', name=op.f('pk_source_components')) diff --git a/web/server/codechecker_server/migrations/report/versions/39f9e96071c0_analyzer_statistics.py b/web/server/codechecker_server/migrations/report/versions/39f9e96071c0_analyzer_statistics.py index d7e4617379..2975433b81 100644 --- a/web/server/codechecker_server/migrations/report/versions/39f9e96071c0_analyzer_statistics.py +++ b/web/server/codechecker_server/migrations/report/versions/39f9e96071c0_analyzer_statistics.py @@ -22,10 +22,10 @@ def upgrade(): sa.Column('id', sa.Integer(), nullable=False), sa.Column('run_history_id', sa.Integer(), nullable=True), sa.Column('analyzer_type', sa.String(), nullable=True), - sa.Column('version', sa.Binary(), nullable=True), + sa.Column('version', sa.LargeBinary(), nullable=True), sa.Column('successful', sa.Integer(), nullable=True), sa.Column('failed', sa.Integer(), nullable=True), - sa.Column('failed_files', sa.Binary(), nullable=True), + sa.Column('failed_files', sa.LargeBinary(), nullable=True), sa.ForeignKeyConstraint( ['run_history_id'], ['run_histories.id'], name=op.f('fk_analyzer_statistics_run_history_id_' diff --git a/web/server/codechecker_server/migrations/report/versions/75ae226b5d88_review_status_for_each_report.py b/web/server/codechecker_server/migrations/report/versions/75ae226b5d88_review_status_for_each_report.py index 0c8730af42..7d6fc4afdb 100644 --- a/web/server/codechecker_server/migrations/report/versions/75ae226b5d88_review_status_for_each_report.py +++ b/web/server/codechecker_server/migrations/report/versions/75ae226b5d88_review_status_for_each_report.py @@ -44,7 +44,7 @@ def decode_file_content(content): 'review_status_is_in_source', sa.Boolean(), server_default='0', nullable=True) col_rs_message = sa.Column( - 'review_status_message', sa.Binary(), nullable=True) + 'review_status_message', sa.LargeBinary(), nullable=True) conn = op.get_bind() diff --git a/web/server/codechecker_server/migrations/report/versions/82ca43f05c10_initial_schema.py b/web/server/codechecker_server/migrations/report/versions/82ca43f05c10_initial_schema.py index 19a8e3fbd3..4888d1d89e 100644 --- a/web/server/codechecker_server/migrations/report/versions/82ca43f05c10_initial_schema.py +++ b/web/server/codechecker_server/migrations/report/versions/82ca43f05c10_initial_schema.py @@ -23,7 +23,7 @@ def upgrade(): sa.Column('id', sa.Integer(), nullable=False), sa.Column('bug_hash', sa.String(), nullable=False), sa.Column('author', sa.String(), nullable=False), - sa.Column('message', sa.Binary(), nullable=False), + sa.Column('message', sa.LargeBinary(), nullable=False), sa.Column('created_at', sa.DateTime(), nullable=False), sa.PrimaryKeyConstraint('id', name=op.f('pk_comments')) ) @@ -40,7 +40,7 @@ def upgrade(): op.create_table( 'file_contents', sa.Column('content_hash', sa.String(), nullable=False), - sa.Column('content', sa.Binary(), nullable=True), + sa.Column('content', sa.LargeBinary(), nullable=True), sa.PrimaryKeyConstraint('content_hash', name=op.f('pk_file_contents')) ) @@ -54,7 +54,7 @@ def upgrade(): name='review_status'), nullable=False), sa.Column('author', sa.String(), nullable=False), - sa.Column('message', sa.Binary(), nullable=False), + sa.Column('message', sa.LargeBinary(), nullable=False), sa.Column('date', sa.DateTime(), nullable=False), sa.PrimaryKeyConstraint('bug_hash', name=op.f('pk_review_statuses')) ) diff --git a/web/server/codechecker_server/migrations/report/versions/ad2a567e513a_git_blame_info.py b/web/server/codechecker_server/migrations/report/versions/ad2a567e513a_git_blame_info.py index f9b2ab2cae..dcc0e56f73 100644 --- a/web/server/codechecker_server/migrations/report/versions/ad2a567e513a_git_blame_info.py +++ b/web/server/codechecker_server/migrations/report/versions/ad2a567e513a_git_blame_info.py @@ -24,7 +24,7 @@ def upgrade(): sa.Column('tracking_branch', sa.String(), nullable=True)) op.add_column('file_contents', - sa.Column('blame_info', sa.Binary(), nullable=True)) + sa.Column('blame_info', sa.LargeBinary(), nullable=True)) def downgrade(): diff --git a/web/server/codechecker_server/migrations/report/versions/dabc6998b8f0_analysis_info_table.py b/web/server/codechecker_server/migrations/report/versions/dabc6998b8f0_analysis_info_table.py index 4023c1d86d..c2e516d023 100644 --- a/web/server/codechecker_server/migrations/report/versions/dabc6998b8f0_analysis_info_table.py +++ b/web/server/codechecker_server/migrations/report/versions/dabc6998b8f0_analysis_info_table.py @@ -27,7 +27,7 @@ def upgrade(): analysis_info_tbl = op.create_table( 'analysis_info', sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), - sa.Column('analyzer_command', sa.Binary(), nullable=True), + sa.Column('analyzer_command', sa.LargeBinary(), nullable=True), sa.PrimaryKeyConstraint('id', name=op.f('pk_analysis_info')) ) diff --git a/web/server/vue-cli/package-lock.json b/web/server/vue-cli/package-lock.json index d908b8c278..6bb529cff2 100644 --- a/web/server/vue-cli/package-lock.json +++ b/web/server/vue-cli/package-lock.json @@ -11,7 +11,7 @@ "@mdi/font": "^6.5.95", "chart.js": "^2.9.4", "chartjs-plugin-datalabels": "^0.7.0", - "codechecker-api": "file:../../api/js/codechecker-api-node/dist/codechecker-api-6.58.0.tgz", + "codechecker-api": "file:../../api/js/codechecker-api-node/dist/codechecker-api-6.59.0.tgz", "codemirror": "^5.65.0", "date-fns": "^2.28.0", "js-cookie": "^3.0.1", @@ -5113,10 +5113,9 @@ } }, "node_modules/codechecker-api": { - "version": "6.58.0", - "resolved": "file:../../api/js/codechecker-api-node/dist/codechecker-api-6.58.0.tgz", - "integrity": "sha512-N6qK5cnLt32jnJlSyyGMmW6FCzybDljyH1RrGOZ1Gk9n1vV7WluJbC9InYWsZ5lbK7xVyIrphTKXhqC4ARKF6g==", - "license": "SEE LICENSE IN LICENSE", + "version": "6.59.0", + "resolved": "file:../../api/js/codechecker-api-node/dist/codechecker-api-6.59.0.tgz", + "integrity": "sha512-EoTeUAO97FhS9eaGnLUEpsemJXWVU7un3gRAXwKqSCrfjJZyVSIUGh1aMqicdMW9J0iYdbtNfEP7KcoQXgSkTQ==", "dependencies": { "thrift": "0.13.0-hotfix.1" } @@ -21145,8 +21144,8 @@ "dev": true }, "codechecker-api": { - "version": "file:../../api/js/codechecker-api-node/dist/codechecker-api-6.58.0.tgz", - "integrity": "sha512-N6qK5cnLt32jnJlSyyGMmW6FCzybDljyH1RrGOZ1Gk9n1vV7WluJbC9InYWsZ5lbK7xVyIrphTKXhqC4ARKF6g==", + "version": "file:../../api/js/codechecker-api-node/dist/codechecker-api-6.59.0.tgz", + "integrity": "sha512-EoTeUAO97FhS9eaGnLUEpsemJXWVU7un3gRAXwKqSCrfjJZyVSIUGh1aMqicdMW9J0iYdbtNfEP7KcoQXgSkTQ==", "requires": { "thrift": "0.13.0-hotfix.1" } diff --git a/web/server/vue-cli/package.json b/web/server/vue-cli/package.json index 2239777668..f31789b897 100644 --- a/web/server/vue-cli/package.json +++ b/web/server/vue-cli/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "@mdi/font": "^6.5.95", - "codechecker-api": "file:../../api/js/codechecker-api-node/dist/codechecker-api-6.58.0.tgz", + "codechecker-api": "file:../../api/js/codechecker-api-node/dist/codechecker-api-6.59.0.tgz", "chart.js": "^2.9.4", "chartjs-plugin-datalabels": "^0.7.0", "codemirror": "^5.65.0", diff --git a/web/server/vue-cli/src/components/Report/ReportFilter/Filters/ComparedToDiffTypeFilter.vue b/web/server/vue-cli/src/components/Report/ReportFilter/Filters/ComparedToDiffTypeFilter.vue index f051f81100..31d26a270c 100644 --- a/web/server/vue-cli/src/components/Report/ReportFilter/Filters/ComparedToDiffTypeFilter.vue +++ b/web/server/vue-cli/src/components/Report/ReportFilter/Filters/ComparedToDiffTypeFilter.vue @@ -11,6 +11,11 @@ @clear="clear(true)" @input="setSelectedItems" > + + +