|  | // Copyright 2020 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | import {IcLogEntry} from './log/ic.mjs'; | 
|  |  | 
|  | // For compatibility with console scripts: | 
|  | print = console.log; | 
|  |  | 
|  | export class Group { | 
|  | constructor(property, key, entry) { | 
|  | this.property = property; | 
|  | this.key = key; | 
|  | this.count = 1; | 
|  | this.entries = [entry]; | 
|  | this.percentage = undefined; | 
|  | this.groups = undefined; | 
|  | } | 
|  |  | 
|  | add(entry) { | 
|  | this.count++; | 
|  | this.entries.push(entry) | 
|  | } | 
|  |  | 
|  | createSubGroups() { | 
|  | // TODO: use Map | 
|  | this.groups = {}; | 
|  | for (const propertyName of IcLogEntry.propertyNames) { | 
|  | if (this.property == propertyName) continue; | 
|  | this.groups[propertyName] = Group.groupBy(this.entries, propertyName); | 
|  | } | 
|  | } | 
|  |  | 
|  | static groupBy(entries, property) { | 
|  | let accumulator = Object.create(null); | 
|  | let length = entries.length; | 
|  | for (let i = 0; i < length; i++) { | 
|  | let entry = entries[i]; | 
|  | let key = entry[property]; | 
|  | if (accumulator[key] == undefined) { | 
|  | accumulator[key] = new Group(property, key, entry); | 
|  | } else { | 
|  | let group = accumulator[key]; | 
|  | if (group.entries == undefined) console.log([group, entry]); | 
|  | group.add(entry) | 
|  | } | 
|  | } | 
|  | let result = []; | 
|  | for (let key in accumulator) { | 
|  | let group = accumulator[key]; | 
|  | group.percentage = Math.round(group.count / length * 100 * 100) / 100; | 
|  | result.push(group); | 
|  | } | 
|  | result.sort((a, b) => {return b.count - a.count}); | 
|  | return result; | 
|  | } | 
|  | } |