public PageView getHistogram()

in analysis/heap-dump/impl/src/main/java/org/eclipse/jifa/hda/impl/HeapDumpAnalyzerImpl.java [1526:1632]


    public PageView<Model.Histogram.Item> getHistogram(Model.Histogram.Grouping groupingBy,
                                                       int[] ids, String sortBy, boolean ascendingOrder,
                                                       String searchText, SearchType searchType,
                                                       int page, int pageSize) {
        return $(() -> {
            Map<String, Object> args = new HashMap<>();
            if (ids != null) {
                args.put("objects", Helper.buildHeapObjectArgument(ids));
            }
            IResult result = queryByCommand(context, "histogram -groupBy " + groupingBy.name(), args);
            switch (groupingBy) {
                case BY_CLASS:
                    Histogram h = (Histogram) result;
                    List<ClassHistogramRecord> records =
                            (List<ClassHistogramRecord>) h.getClassHistogramRecords();
                    return PageViewBuilder.<ClassHistogramRecord, Model.Histogram.Item>fromList(records)
                                          .beforeMap(record -> $(() -> record
                                                  .calculateRetainedSize(context.snapshot, true, true, Helper.VOID_LISTENER)))
                                          .paging(new PagingRequest(page, pageSize))
                                          .map(record -> new Model.Histogram.Item(record.getClassId(), record.getLabel(),
                                                                                  Model.Histogram.ItemType.CLASS,
                                                                                  record.getNumberOfObjects(),
                                                                                  record.getUsedHeapSize(),
                                                                                  record.getRetainedHeapSize()))
                                          .sort(Model.Histogram.Item.sortBy(sortBy, ascendingOrder))
                                          .filter(createPredicate(searchText, searchType))
                                          .done();
                case BY_CLASSLOADER:
                    Histogram.ClassLoaderTree ct = (Histogram.ClassLoaderTree) result;
                    @SuppressWarnings("unchecked")
                    PageViewBuilder<? extends XClassLoaderHistogramRecord, Model.Histogram.Item> builder =
                            PageViewBuilder.fromList((List<? extends XClassLoaderHistogramRecord>) ct.getElements());
                    return builder
                            .beforeMap(record -> $(() -> record.calculateRetainedSize(context.snapshot, true, true,
                                                                                      Helper.VOID_LISTENER)))
                            .paging(new PagingRequest(page, pageSize))
                            .map(record ->
                                         new Model.Histogram.Item(record.getClassLoaderId(), record.getLabel(),
                                                                  Model.Histogram.ItemType.CLASS_LOADER,
                                                                  record.getNumberOfObjects(),
                                                                  record.getUsedHeapSize(),
                                                                  record.getRetainedHeapSize())
                                )
                            .sort(Model.Histogram.Item.sortBy(sortBy, ascendingOrder))
                            .filter(createPredicate(searchText, searchType))
                            .done();
                case BY_SUPERCLASS:
                    Histogram.SuperclassTree st = (Histogram.SuperclassTree) result;
                    return PageViewBuilder.<HistogramRecord, Model.Histogram.Item>fromList(
                                                  (List<HistogramRecord>) st.getElements())
                                          .paging(new PagingRequest(page, pageSize))
                                          .map(e -> {
                                              Model.Histogram.Item item = new Model.Histogram.Item();
                                              int objectId = st.getContext(e).getObjectId();
                                              item.setType(Model.Histogram.ItemType.SUPER_CLASS);
                                              item.setObjectId(objectId);
                                              item.setLabel((String) st.getColumnValue(e, 0));
                                              item.setNumberOfObjects((Long) st.getColumnValue(e, 1));
                                              item.setShallowSize(((Bytes) st.getColumnValue(e, 2)).getValue());
                                              return item;
                                          })
                                          .sort(Model.Histogram.Item.sortBy(sortBy, ascendingOrder))
                                          .filter(createPredicate(searchText, searchType))
                                          .done();
                case BY_PACKAGE:
                    Histogram.PackageTree pt = (Histogram.PackageTree) result;
                    return
                            PageViewBuilder.<HistogramRecord, Model.Histogram.Item>fromList(
                                                   (List<HistogramRecord>) pt.getElements())
                                           .paging(new PagingRequest(page, pageSize))
                                           .map(e -> {

                                               Model.Histogram.Item item = new Model.Histogram.Item();
                                               String label = (String) pt.getColumnValue(e, 0);
                                               item.setLabel(label);

                                               if (e instanceof XClassHistogramRecord) {
                                                   int objectId = pt.getContext(e).getObjectId();
                                                   item.setObjectId(objectId);
                                                   item.setType(Model.Histogram.ItemType.CLASS);
                                               } else {
                                                   item.setObjectId(label.hashCode());
                                                   item.setType(Model.Histogram.ItemType.PACKAGE);
                                               }

                                               if (label.matches("^int(\\[\\])*") || label.matches("^char(\\[\\])*") ||
                                                   label.matches("^byte(\\[\\])*") || label.matches("^short(\\[\\])*") ||
                                                   label.matches("^boolean(\\[\\])*") ||
                                                   label.matches("^double(\\[\\])*") ||
                                                   label.matches("^float(\\[\\])*") || label.matches("^long(\\[\\])*") ||
                                                   label.matches("^void(\\[\\])*")) {
                                                   item.setType(Model.Histogram.ItemType.CLASS);
                                               }
                                               item.setNumberOfObjects((Long) pt.getColumnValue(e, 1));
                                               item.setShallowSize(((Bytes) pt.getColumnValue(e, 2)).getValue());

                                               return item;
                                           })
                                           .sort(Model.Histogram.Item.sortBy(sortBy, ascendingOrder))
                                           .filter(createPredicate(searchText, searchType))
                                           .done();
                default:
                    throw new AnalysisException("Should not reach here");
            }

        });
    }