[ 
https://issues.apache.org/jira/browse/GOSSIP-63?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15901229#comment-15901229
 ] 

ASF GitHub Bot commented on GOSSIP-63:
--------------------------------------

Github user edwardcapriolo commented on a diff in the pull request:

    https://github.com/apache/incubator-gossip/pull/41#discussion_r104914004
  
    --- Diff: src/main/java/org/apache/gossip/crdt/GrowOnlyCounter.java ---
    @@ -0,0 +1,94 @@
    +package org.apache.gossip.crdt;
    +
    +
    +import java.lang.annotation.ElementType;
    +import java.util.HashMap;
    +import java.util.Map;
    +
    +public class GrowOnlyCounter implements CrdtCounter<Long, GrowOnlyCounter> 
{
    +
    +
    +    private final Map<String, Long> counters = new HashMap<>();
    +    private final String myID;
    +
    +    public GrowOnlyCounter(String myID) {
    +        this.myID = myID;
    +        counters.putIfAbsent(myID, 0L);
    +    }
    +
    +    private GrowOnlyCounter(String myID, Long count) {
    +        this.myID = myID;
    +        counters.putIfAbsent(myID, count);
    +    }
    +
    +    private GrowOnlyCounter(String myID, Map<String, Long> counters) {
    +        this.myID = myID;
    +        this.counters.putAll(counters);
    +    }
    +
    +
    +    @Override
    +    public GrowOnlyCounter merge(GrowOnlyCounter other) {
    +        //System.out.println(other);
    +        this.counters.putIfAbsent(other.myID, 
other.counters.get(other.myID));
    +        Map<String , Long> updatedCounter = new HashMap<>();
    +        for (Map.Entry<String, Long> entry : this.counters.entrySet()) {
    +            String key = entry.getKey();
    +            Long value = entry.getValue();
    +
    +            if(other.counters.containsKey(key)){
    +                Long newValue = Math.max(value,other.counters.get(key));
    +                updatedCounter.put(key,newValue);
    +            }else {
    +                updatedCounter.put(key,value);
    +            }
    +
    +        }
    +
    +        return new GrowOnlyCounter(myID,updatedCounter);
    +    }
    +
    +    @Override
    +    public Long value() {
    +        Long globalCount = 0L;
    +        for (Long increment : counters.values()) {
    +            globalCount += increment;
    +        }
    +        return globalCount;
    +    }
    +
    +    @Override
    +    public GrowOnlyCounter optimize() {
    +        return new GrowOnlyCounter(myID, counters.get(myID));
    +    }
    +
    +    @Override
    +    public boolean equals(Object obj) {
    +
    +        GrowOnlyCounter other = (GrowOnlyCounter) obj;
    +
    +        return value().longValue() == other.value().longValue();
    +    }
    +
    +    public void increase() {
    +        counters.replace(myID, counters.get(myID) + 1);
    +    }
    +
    +    public void increaseBy(int count) {
    --- End diff --
    
    Type should be immutable remove this.


> Implement Crdt G-Counter
> ------------------------
>
>                 Key: GOSSIP-63
>                 URL: https://issues.apache.org/jira/browse/GOSSIP-63
>             Project: Gossip
>          Issue Type: New Feature
>            Reporter: Edward Capriolo
>




--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to