1+ // List git file directories and their statistics
2+
3+ MATCH (git_file :File &Git &! Repository )
4+ WHERE git_file .deletedAt IS NULL // filter out deleted files
5+ ORDER BY git_file .relativePath
6+ WITH percentileDisc (git_file .createdAtEpoch , 0.5 ) AS medianCreatedAtEpoch
7+ ,percentileDisc (git_file .lastModificationAtEpoch , 0.5 ) AS medianLastModificationAtEpoch
8+ ,collect (git_file ) AS git_files
9+ UNWIND git_files AS git_file
10+ WITH *
11+ ,datetime .fromepochMillis (coalesce (git_file .createdAtEpoch , medianCreatedAtEpoch )) AS fileCreatedAtTimestamp
12+ ,datetime .fromepochMillis (coalesce (git_file .lastModificationAtEpoch , medianLastModificationAtEpoch )) AS fileLastModificationAtTimestamp
13+ WITH * , split (git_file .relativePath , '/' ) AS pathElements
14+ WITH * , pathElements [- 1 ] AS fileName
15+ MATCH (git_repository :Git &Repository )- [ : HAS_FILE ] -> (git_file )
16+ MATCH (git_commit :Git &Commit )- [ : CONTAINS_CHANGE ] -> (git_change :Git &Change )- [ ] -> (git_file )
17+ WITH pathElements
18+ ,fileCreatedAtTimestamp
19+ ,fileLastModificationAtTimestamp
20+ ,fileName
21+ ,git_file .relativePath AS fileRelativePath
22+ ,max (git_repository .name ) AS repository
23+ ,max (git_commit .sha ) AS maxCommitSha
24+ ,COUNT (DISTINCT git_commit .sha ) AS commitCount
25+ ,COUNT (DISTINCT git_commit .author ) AS authorCount
26+ ,date (max (git_commit .date )) AS lastCommitDate
27+ UNWIND pathElements AS pathElement
28+ WITH *
29+ ,coalesce (nullif (split (fileRelativePath , '/' + pathElement )[0 ], fileRelativePath ), '' ) AS parent
30+ WITH *
31+ ,coalesce (nullif (parent ,'' ) + '/' , '' ) + pathElement AS directory
32+ WHERE pathElement <> fileName
33+ WITH repository AS gitRepositoryName
34+ ,directory AS directoryPath
35+ ,split (directory , '/' )[- 1 ] AS directoryName
36+ ,parent AS directoryParentPath
37+ ,split (parent , '/' )[- 1 ] AS directoryParentName
38+ ,size (split (directory , '/' )) AS directoryPathLength
39+ ,count (DISTINCT fileRelativePath ) AS fileCount
40+ ,max (date (fileCreatedAtTimestamp ) ) AS lastCreationDate
41+ ,max (date (fileLastModificationAtTimestamp )) AS lastModificationDate
42+ ,sum (commitCount ) AS commitCount
43+ ,sum (authorCount ) AS authorCount
44+ ,max (maxCommitSha ) AS maxCommitSha
45+ ,max (lastCommitDate ) AS lastCommitDate
46+ ,duration .inDays (max (lastCommitDate ), date ()).days AS daysSinceLastCommit
47+ ,duration .inDays (max (fileCreatedAtTimestamp ), datetime ()).days AS daysSinceLastCreation
48+ ,duration .inDays (max (fileLastModificationAtTimestamp ), datetime ()).days AS daysSinceLastModification
49+ // The final results are grouped by the statistic values like file count,...
50+ RETURN gitRepositoryName
51+ ,fileCount
52+ ,lastCreationDate
53+ ,lastModificationDate
54+ ,commitCount
55+ ,authorCount
56+ ,maxCommitSha
57+ ,lastCommitDate
58+ ,daysSinceLastCommit
59+ ,daysSinceLastCreation
60+ ,daysSinceLastModification
61+ ,collect (directoryPath )[- 1 ] AS directoryPath
62+ ,apoc .text .join (collect (directoryName ), '/' ) AS directoryName
63+ ,collect (directoryParentPath )[0 ] AS directoryParentPath
64+ ,collect (directoryParentName )[0 ] AS directoryParentName
65+ ,max (directoryPathLength ) AS directoryPathLength
66+ ,count (DISTINCT directoryPath ) AS combinedDirectoriesCount
0 commit comments