class IndexRebuildStatusInfoContainer extends IgniteDataTransferObject {
    /** Empty group name. */
    public static final String EMPTY_GROUP_NAME = "no_group";

    /** */
    private static final long serialVersionUID = 0L;

    /** Group name. */
    private String groupName;

    /** Cache name. */
    private String cacheName;

    /** */
    private int indexBuildPartitionsLeftCount;

    /** Local partitions count. */
    private int totalPartitionsCount;

    /**
     * Empty constructor required for Serializable.
     */
    public IndexRebuildStatusInfoContainer() {
        // No-op.
    }

    /** */
    public IndexRebuildStatusInfoContainer(GridCacheContext<?, ?> cctx) {
        assert cctx != null;

        CacheConfiguration<?, ?> cfg = cctx.config();

        groupName = cfg.getGroupName() == null ? EMPTY_GROUP_NAME : cfg.getGroupName();
        cacheName = cfg.getName();
        indexBuildPartitionsLeftCount = cctx.cache().metrics0().getIndexBuildPartitionsLeftCount();
        totalPartitionsCount = cctx.topology().localPartitions().size();
    }

    /** {@inheritDoc} */
    @Override protected void writeExternalData(ObjectOutput out) throws IOException {
        U.writeString(out, groupName);
        U.writeString(out, cacheName);
        out.writeInt(indexBuildPartitionsLeftCount);
        out.writeInt(totalPartitionsCount);
    }

    /** {@inheritDoc} */
    @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
        groupName = U.readString(in);
        cacheName = U.readString(in);
        indexBuildPartitionsLeftCount = in.readInt();
        totalPartitionsCount = in.readInt();
    }

    /** {@inheritDoc} */
    @Override public boolean equals(Object o) {
        if (!(o instanceof IndexRebuildStatusInfoContainer))
            return false;

        IndexRebuildStatusInfoContainer other = (IndexRebuildStatusInfoContainer)o;

        return cacheName.equals(other.cacheName) && groupName.equals(other.groupName);
    }

    /** {@inheritDoc} */
    @Override public int hashCode() {
        return groupName.hashCode() * 17 + cacheName.hashCode() * 37;
    }

    /**
     * @return Group name.
     */
    public String groupName() {
        return groupName;
    }

    /**
     * @return Cache name.
     */
    public String cacheName() {
        return cacheName;
    }

    /**
     * @return Total local node partitions count.
     */
    public int totalPartitionsCount() {
        return totalPartitionsCount;
    }

    /**
     * @return The number of local node partitions that remain to be processed to complete indexing.
     */
    public int indexBuildPartitionsLeftCount() {
        return indexBuildPartitionsLeftCount;
    }

    /**
     * @return default string object representation without {@code IndexRebuildStatusInfoContainer} and brackets.
     */
    @Override public String toString() {<FILL_FUNCTION_BODY>}

    /**
     * @return Custom comparator.
     */
    public static Comparator<IndexRebuildStatusInfoContainer> comparator() {
        return Comparator.comparing(IndexRebuildStatusInfoContainer::groupName)
            .thenComparing(IndexRebuildStatusInfoContainer::cacheName);
    }
}

        float progress = (float)(totalPartitionsCount - indexBuildPartitionsLeftCount) / totalPartitionsCount;

        String dfltImpl = S.toString(
            IndexRebuildStatusInfoContainer.class,
            this,
            "progress",
            (int)(Math.max(0, progress) * 100) + "%"
        );

        return dfltImpl.substring(IndexRebuildStatusInfoContainer.class.getSimpleName().length() + 2,
            dfltImpl.length() - 1);
    
<methods>public non-sealed void <init>() ,public byte getProtocolVersion() ,public void readExternal(java.io.ObjectInput) throws java.io.IOException, java.lang.ClassNotFoundException,public void writeExternal(java.io.ObjectOutput) throws java.io.IOException<variables>private static final int MAGIC,protected static final byte V1,protected static final byte V2,protected static final byte V3,protected static final byte V4,protected static final byte V5,protected static final byte V6,protected static final byte V7,protected static final byte V8,protected static final byte V9,private static final long serialVersionUID