C#: Remove libraries and queries related to version history

The VCS relations are no longer populated, so there is no reason to keep them,
and the queries/libraries that use the relations.
This commit is contained in:
Tom Hvitved 2019-07-02 10:16:30 +02:00
Родитель 71c86fa69b
Коммит 9a24d3a69c
30 изменённых файлов: 0 добавлений и 1113 удалений

Просмотреть файл

@ -1,25 +0,0 @@
<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<overview>
<p>This metric measures the number of lines of text that have been added, deleted or modified in
files below this location in the tree.</p>
<p>Code churn is known to be a good predictor of defects in a code component. The idea is that
files, packages or projects that have experienced a disproportionately high amount of churn for the
amount of code involved may have been harder to write, and are thus likely to contain more defects.
</p>
</overview>
<recommendation>
<p>Although it is probably not possible to reduce the level of change for a component, components
with a high churn should be subject to more rigorous testing and review.</p>
</recommendation>
<references>
<li>N. Nagappan et al. <em>Change Bursts as Defect Predictors</em>. In Proceedings of the 21st IEEE International Symposium on Software Reliability Engineering, 2010.</li>
</references>
</qhelp>

Просмотреть файл

@ -1,21 +0,0 @@
/**
* @name Churned lines
* @description Number of churned lines, across the revision history in the database.
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @metricAggregate avg sum max
* @id cs/vcs/churn-per-file
*/
import csharp
import external.VCS
from File f, int n
where
n = sum(Commit entry, int churn |
churn = entry.getRecentChurnForFile(f) and not artificialChange(entry)
|
churn
)
select f, n order by n desc

Просмотреть файл

@ -1,6 +0,0 @@
<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<include src="HChurn.qhelp" />
</qhelp>

Просмотреть файл

@ -1,21 +0,0 @@
/**
* @name Added lines
* @description Number of added lines, across the revision history in the database.
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @metricAggregate avg sum max
* @id cs/vcs/added-lines-per-file
*/
import csharp
import external.VCS
from File f, int n
where
n = sum(Commit entry, int churn |
churn = entry.getRecentAdditionsForFile(f) and not artificialChange(entry)
|
churn
)
select f, n order by n desc

Просмотреть файл

@ -1,6 +0,0 @@
<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<include src="HChurn.qhelp" />
</qhelp>

Просмотреть файл

@ -1,21 +0,0 @@
/**
* @name Deleted lines
* @description Number of deleted lines, across the revision history in the database.
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @metricAggregate avg sum max
* @id cs/vcs/deleted-lines-per-file
*/
import csharp
import external.VCS
from File f, int n
where
n = sum(Commit entry, int churn |
churn = entry.getRecentDeletionsForFile(f) and not artificialChange(entry)
|
churn
)
select f, n order by n desc

Просмотреть файл

@ -1,21 +0,0 @@
<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<overview>
<p>This metric measures the number of different authors for files below this location in the tree.
This information is extracted from the version control system used to manage the source code.</p>
<p>Files that have been changed by a large number of different authors are by definition the
product of many minds. New authors working on a file may be less familiar with the design and
implementation of the code than the original authors, which can be a potential source of defects.
Furthermore, code that has been worked on by many people, if not carefully maintained, often ends
up lacking conceptual integrity.</p>
</overview>
<recommendation>
<p>Files with a high value for this metric should be given special attention in a code review, and
may ultimately be good candidates for refactoring/rewriting by an individual, experienced developer.
</p>
</recommendation>
</qhelp>

Просмотреть файл

@ -1,15 +0,0 @@
/**
* @name Number of authors (version control)
* @description The number of distinct authors (by version control history) below this location in the tree
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @metricAggregate avg min max
* @id cs/vcs/authors-per-file
*/
import csharp
import external.VCS
from File f
select f, count(Author author | author.getAnEditedFile() = f)

Просмотреть файл

@ -1,16 +0,0 @@
<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<overview>
<p>This metric measures the number of commits that have affected each file below this location in
the tree.</p>
<p>Files that have been changed a large number of times may have had a large number of defects in
the past and may have more in the future.</p>
</overview>
<recommendation>
<p>Files with a high value for this metric should be given special attention in a code review.</p>
</recommendation>
</qhelp>

Просмотреть файл

@ -1,15 +0,0 @@
/**
* @name Number of file-level changes
* @description The number of file-level changes made (by version control history).
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @metricAggregate avg min max sum
* @id cs/vcs/commits-per-file
*/
import csharp
import external.VCS
from File f
select f, count(Commit svn | f = svn.getAnAffectedFile() and not artificialChange(svn))

Просмотреть файл

@ -1,28 +0,0 @@
<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<overview>
<p>This metric measures the average number of other files changed when a file itself is changed.
Files that cause a lot of other files to be changed may be too tightly bound to those other files.
</p>
<p>It is important to note that this metric is an average for all commits of a file. When picking
aggregation method to examine a directory of files in the source tree, this still applies. This
means that if you use the 'max' aggregation method on a directory you will be presented with the
metric for the file with the highest average number of co-commits across the files entire commit
history.</p>
</overview>
<recommendation>
<p>Files with a high value for this metric may have a widely used public API. Special care
should therefore be taken when updating it to ensure any other parts of the program that use the
API are also updated.</p>
<p>It is also possible that the file is too tightly coupled with other files. Examine the afferent
and efferent coupling metrics as well and consider the advice given.</p>
<p>A final possibility is that committers could be using single commits to introduce several
unrelated changes. If this is the case then commit practices should be reviewed.</p>
</recommendation>
</qhelp>

Просмотреть файл

@ -1,17 +0,0 @@
/**
* @name Number of co-committed files
* @description The average number of other files that are touched whenever a file is affected by a commit
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @metricAggregate avg min max
* @id cs/vcs/co-commits-per-file
*/
import csharp
import external.VCS
int committedFiles(Commit commit) { result = count(commit.getAnAffectedFile()) }
from File f
select f, avg(Commit commit | commit.getAnAffectedFile() = f | committedFiles(commit) - 1)

Просмотреть файл

@ -1,22 +0,0 @@
<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<overview>
<p>This metric measures the number of times files were recommitted after being committed once. A
change to a file is considered a recommit if it occurs within 5 days of a previous commit on the
same file.</p>
<p>Provided changes are not being committed until they are considered complete then a high number
of recommits might indicate that attempts to update some code proved difficult and had to be
reattempted several times.</p>
</overview>
<recommendation>
<p>A high value for this metric often indicates files that required several commits to implement a
change. These files would benefit from rigorous testing and review.</p>
<p>It is possible the recommits were several unrelated changes to a large and central source file.
If this is the case then splitting the file up should be considered.</p>
</recommendation>
</qhelp>

Просмотреть файл

@ -1,33 +0,0 @@
/**
* @name Number of file re-commits
* @description A re-commit is taken to mean a commit to a file that was touched less than five days ago.
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @metricAggregate avg min max
* @id cs/vcs/recommits-per-file
*/
import csharp
import external.VCS
predicate inRange(Commit first, Commit second) {
first.getAnAffectedFile() = second.getAnAffectedFile() and
first != second and
exists(int n |
n = first.getDate().daysTo(second.getDate()) and
n >= 0 and
n < 5
)
}
int recommitsForFile(File f) {
result = count(Commit recommit |
f = recommit.getAnAffectedFile() and
exists(Commit prev | inRange(prev, recommit))
)
}
from File f
where f.getExtension() = "c"
select f, recommitsForFile(f)

Просмотреть файл

@ -1,16 +0,0 @@
<!DOCTYPE qhelp PUBLIC
"-//Semmle//qhelp//EN"
"qhelp.dtd">
<qhelp>
<overview>
<p>This metric measures the number of recent changes to files that have occurred below this
location in the tree. A recent change is taken to mean a change that has occurred in the last 180
days. All code that has changed a great deal may be more than usually prone to defects, but this is
particularly true of code that has been changing dramatically in the recent past, because it has
not yet had a chance to be properly field-tested.</p>
</overview>
<recommendation>
<p>Files with a high value for this metric should be given special attention in a code review.</p>
</recommendation>
</qhelp>

Просмотреть файл

@ -1,19 +0,0 @@
/**
* @name Number of recent file changes
* @description Number of recent commits to this file
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @metricAggregate avg min max sum
* @id cs/vcs/recent-commits-per-file
*/
import csharp
import external.VCS
from File f, int n
where
n = count(Commit e |
e.getAnAffectedFile() = f and e.daysToNow() <= 180 and not artificialChange(e)
)
select f, n order by n desc

78
csharp/ql/src/external/VCS.qll поставляемый
Просмотреть файл

@ -1,78 +0,0 @@
import csharp
class Commit extends @svnentry {
Commit() {
svnaffectedfiles(this, _, _) and
exists(date svnDate, date snapshotDate |
svnentries(this, _, _, svnDate, _) and
snapshotDate(snapshotDate) and
svnDate <= snapshotDate
)
}
string toString() { result = this.getRevisionName() }
string getRevisionName() { svnentries(this, result, _, _, _) }
string getAuthor() { svnentries(this, _, result, _, _) }
date getDate() { svnentries(this, _, _, result, _) }
int getChangeSize() { svnentries(this, _, _, _, result) }
string getMessage() { svnentrymsg(this, result) }
string getAnAffectedFilePath(string action) {
exists(File rawFile | svnaffectedfiles(this, rawFile, action) |
result = rawFile.getAbsolutePath()
)
}
string getAnAffectedFilePath() { result = getAnAffectedFilePath(_) }
File getAnAffectedFile(string action) { svnaffectedfiles(this, result, action) }
File getAnAffectedFile() { exists(string action | result = this.getAnAffectedFile(action)) }
predicate isRecent() { recentCommit(this) }
int daysToNow() {
exists(date now | snapshotDate(now) | result = getDate().daysTo(now) and result >= 0)
}
int getRecentAdditionsForFile(File f) { svnchurn(this, f, result, _) }
int getRecentDeletionsForFile(File f) { svnchurn(this, f, _, result) }
int getRecentChurnForFile(File f) {
exists(int added, int deleted | svnchurn(this, f, added, deleted) and result = added + deleted)
}
}
class Author extends string {
Author() { exists(Commit e | this = e.getAuthor()) }
Commit getACommit() { result.getAuthor() = this }
File getAnEditedFile() { result = this.getACommit().getAnAffectedFile() }
}
predicate recentCommit(Commit e) {
exists(date snapshotDate, date commitDate, int days |
snapshotDate(snapshotDate) and
e.getDate() = commitDate and
days = commitDate.daysTo(snapshotDate) and
days >= 0 and
days <= 60
)
}
date firstChange(File f) {
result = min(Commit e, date toMin | f = e.getAnAffectedFile() and toMin = e.getDate() | toMin)
}
predicate firstCommit(Commit e) {
not exists(File f | f = e.getAnAffectedFile() | firstChange(f) < e.getDate())
}
predicate artificialChange(Commit e) { firstCommit(e) or e.getChangeSize() >= 50000 }

Просмотреть файл

@ -1,17 +0,0 @@
/**
* @name Filter: only files recently edited
* @description Filter a defect query to only include results in files that have been changed recently, and modify the message.
* @deprecated
*/
import csharp
import external.DefectFilter
import external.VCS
private predicate recent(File file) {
exists(Commit e | file = e.getAnAffectedFile() | e.isRecent())
}
from DefectResult res
where recent(res.getFile())
select res, "Recent: " + res.getMessage()

Просмотреть файл

@ -1,34 +0,0 @@
/**
* @name Files edited in pairs
* @description Files that are usually committed at the same time can be dangerous: it can indicate the files are too closely tied, and can create problems if someone forgets to edit the other file.
* @kind problem
* @problem.severity recommendation
* @deprecated
*/
import csharp
import external.VCS
int numberOfCommitsWith(File a, File b) {
result = count(Commit e | a = e.getAnAffectedFile() and b = e.getAnAffectedFile()) and
a != b
}
int totalCommits(File a) { result = count(Commit e | a = e.getAnAffectedFile()) }
int percentagePairedCommits(File f, File with) {
exists(int paired, int total |
paired = numberOfCommitsWith(f, with) and
total = totalCommits(f) and
result = (100 * paired) / total and
result > 0
)
}
from File f, File other, int percent, int total
where
percent = percentagePairedCommits(f, other) and
total = totalCommits(f) and
percent >= 70 and
total >= 4
select f, "This file is usually edited together with " + other + " (" + percent + "% of commits)."

Просмотреть файл

@ -1,20 +0,0 @@
/**
* @name Large files currently edited
* @description Files with many lines of code that are actively being developed are candidates for refactoring.
* @kind problem
* @problem.severity warning
* @deprecated
*/
import csharp
import external.VCS
from File f, int numRecent, int loc
where
numRecent = strictcount(Commit e | f = e.getAnAffectedFile() and e.isRecent()) and
loc = f.getNumberOfLinesOfCode() and
loc > 500 and
numRecent > 0
select f,
"Large file (" + loc.toString() + " lines of code) actively being edited (" + numRecent.toString()
+ " recent commits)."

Просмотреть файл

@ -1,25 +0,0 @@
/**
* @name Poorly documented files with many authors
* @description Files with many authors are more error-prone, so the documentation requirements are stricter for those files.
* @kind problem
* @problem.severity warning
* @deprecated
*/
import csharp
import external.VCS
predicate fileCommentRatio(File f, float ratio) {
ratio = 100.0 * (f.getNumberOfLinesOfComments().(float) / f.getNumberOfLinesOfCode().(float))
}
from File f, int numAuthors, float docPercent
where
numAuthors = strictcount(Author a | f = a.getAnEditedFile()) and
fileCommentRatio(f, docPercent) and
docPercent < 20.0 and
numAuthors >= 3 and
f.getNumberOfLinesOfCode() > 150
select f,
"Poorly documented file (" + docPercent.floor().toString() + "% comments) with " +
numAuthors.toString() + " authors."

Просмотреть файл

@ -1,17 +0,0 @@
/**
* @name Number of authors
* @description Number of distinct authors for each file
* @treemap.warnOn highValues
* @metricType file
* @metricAggregate avg
* @deprecated
*/
import csharp
import external.VCS
from File f, int n
where
n = count(Author author | author.getAnEditedFile() = f) and
f.fromSource()
select f, n order by n desc

Просмотреть файл

@ -1,17 +0,0 @@
/**
* @name Number of commits
* @description Number of commits for each file
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @deprecated
*/
import csharp
import external.VCS
from File f, int n
where
n = count(Commit svn | f = svn.getAnAffectedFile()) and
n > 1
select f, n order by n desc

Просмотреть файл

@ -1,17 +0,0 @@
/**
* @name Recent activity
* @description Number of recent commits to this file
* @kind treemap
* @treemap.warnOn highValues
* @metricType file
* @deprecated
*/
import csharp
import external.VCS
from File f, int n
where
n = count(Commit e | e.getAnAffectedFile() = f and e.isRecent()) and
n > 0
select f, n order by n desc

13
csharp/ql/src/external/tests/DefectFilter.ql поставляемый
Просмотреть файл

@ -1,13 +0,0 @@
/**
* @name Defect filter
* @description Only include results in large files (200) lines of code, and change the message.
* @deprecated
*/
import csharp
import external.DefectFilter
import external.VCS
from DefectResult res
where res.getFile().getNumberOfLinesOfCode() > 200
select res, "Large files: " + res.getMessage()

19
csharp/ql/src/external/tests/DefectFromSVN.ql поставляемый
Просмотреть файл

@ -1,19 +0,0 @@
/**
* @name Defect from SVN
* @description A test case for creating a defect from SVN data.
* @kind problem
* @problem.severity warning
* @deprecated
*/
import csharp
import external.ExternalArtifact
import external.VCS
predicate numCommits(File f, int i) { i = count(Commit e | e.getAnAffectedFile() = f) }
predicate maxCommits(int i) { i = max(File f, int j | numCommits(f, j) | j) }
from File f, int i
where numCommits(f, i) and maxCommits(i)
select f, "This file has " + i + " commits."

17
csharp/ql/src/external/tests/MetricFromSVN.ql поставляемый
Просмотреть файл

@ -1,17 +0,0 @@
/**
* @name Metric from SVN
* @description Find number of commits for a file
* @treemap.warnOn lowValues
* @metricType file
* @kind treemap
* @deprecated
*/
import csharp
import external.VCS
predicate numCommits(File f, int i) { i = count(Commit e | e.getAnAffectedFile() = f) }
from File f, int i
where numCommits(f, i)
select f, i

Просмотреть файл

@ -1,18 +0,0 @@
/**
* @name Filter: only files recently edited
* @description Filter a defect query to only include results in files that have been changed recently, and modify the message.
* @kind problem
* @id cs/recently-changed-file-filter
*/
import csharp
import external.DefectFilter
import external.VCS
private predicate recent(File file) {
exists(Commit e | file = e.getAnAffectedFile() | e.isRecent())
}
from DefectResult res
where recent(res.getFile())
select res, res.getMessage()

Просмотреть файл

@ -204,33 +204,6 @@ tokens(
int endLine: int ref,
int endColumn: int ref);
/*
* Version history
*/
svnentries(
int id: @svnentry,
varchar(500) revision: string ref,
varchar(500) author: string ref,
date revisionDate: date ref,
int changeSize: int ref);
svnaffectedfiles(
int id: @svnentry ref,
int file: @file ref,
varchar(500) action: string ref);
svnentrymsg(
int id: @svnentry ref,
varchar(500) message: string ref
)
svnchurn(
int commit: @svnentry ref,
int file: @file ref,
int addedLines: int ref,
int deletedLines: int ref);
/*
* C# dbscheme
*/

Просмотреть файл

@ -32,10 +32,6 @@
<v>124007</v>
</e>
<e>
<k>@svnentry</k>
<v>0</v>
</e>
<e>
<k>@location_default</k>
<v>7339237</v>
</e>
@ -8258,494 +8254,6 @@
</dependencies>
</relation>
<relation>
<name>svnentries</name>
<cardinality>0</cardinality>
<columnsizes>
<e>
<k>id</k>
<v>0</v>
</e>
<e>
<k>revision</k>
<v>0</v>
</e>
<e>
<k>author</k>
<v>0</v>
</e>
<e>
<k>revisionDate</k>
<v>0</v>
</e>
<e>
<k>changeSize</k>
<v>0</v>
</e>
</columnsizes>
<dependencies>
<dep>
<src>id</src>
<trg>revision</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>id</src>
<trg>author</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>id</src>
<trg>revisionDate</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>id</src>
<trg>changeSize</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>revision</src>
<trg>id</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>revision</src>
<trg>author</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>revision</src>
<trg>revisionDate</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>revision</src>
<trg>changeSize</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>author</src>
<trg>id</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>author</src>
<trg>revision</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>author</src>
<trg>revisionDate</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>author</src>
<trg>changeSize</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>revisionDate</src>
<trg>id</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>revisionDate</src>
<trg>revision</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>revisionDate</src>
<trg>author</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>revisionDate</src>
<trg>changeSize</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>changeSize</src>
<trg>id</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>changeSize</src>
<trg>revision</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>changeSize</src>
<trg>author</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>changeSize</src>
<trg>revisionDate</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
</dependencies>
</relation>
<relation>
<name>svnaffectedfiles</name>
<cardinality>0</cardinality>
<columnsizes>
<e>
<k>id</k>
<v>0</v>
</e>
<e>
<k>file</k>
<v>0</v>
</e>
<e>
<k>action</k>
<v>0</v>
</e>
</columnsizes>
<dependencies>
<dep>
<src>id</src>
<trg>file</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>id</src>
<trg>action</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>file</src>
<trg>id</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>file</src>
<trg>action</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>action</src>
<trg>id</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>action</src>
<trg>file</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
</dependencies>
</relation>
<relation>
<name>svnentrymsg</name>
<cardinality>0</cardinality>
<columnsizes>
<e>
<k>id</k>
<v>0</v>
</e>
<e>
<k>message</k>
<v>0</v>
</e>
</columnsizes>
<dependencies>
<dep>
<src>id</src>
<trg>message</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>message</src>
<trg>id</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
</dependencies>
</relation>
<relation>
<name>svnchurn</name>
<cardinality>0</cardinality>
<columnsizes>
<e>
<k>commit</k>
<v>0</v>
</e>
<e>
<k>file</k>
<v>0</v>
</e>
<e>
<k>addedLines</k>
<v>0</v>
</e>
<e>
<k>deletedLines</k>
<v>0</v>
</e>
</columnsizes>
<dependencies>
<dep>
<src>commit</src>
<trg>file</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>commit</src>
<trg>addedLines</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>commit</src>
<trg>deletedLines</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>file</src>
<trg>commit</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>file</src>
<trg>addedLines</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>file</src>
<trg>deletedLines</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>addedLines</src>
<trg>commit</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>addedLines</src>
<trg>file</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>addedLines</src>
<trg>deletedLines</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>deletedLines</src>
<trg>commit</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>deletedLines</src>
<trg>file</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
<dep>
<src>deletedLines</src>
<trg>addedLines</trg>
<val>
<hist>
<budget>12</budget>
<bs/>
</hist>
</val>
</dep>
</dependencies>
</relation>
<relation>
<name>locations_default</name>
<cardinality>7339237</cardinality>
<columnsizes>