TagDictionary { public int intern(TagCollection tags, TagSetEncoder encoder) { TagSet ts = new TagSet(tags); Integer id = tagSetDic.remove(ts); if (id != null) { tagSetDic.put(ts, id); return id; } else if (tagSetDic.size() < limit) { id = tagSetDic.size(); encodeTag(id, ts, encoder); return id; } else { id = evict(); encodeTag(id, ts, encoder); return id; } } TagDictionary(int limit); int intern(TagCollection tags, TagSetEncoder encoder);  }
@Test public void empty_tag_set() { int id = dic.intern(tags(), encoder); assertThat(id).isEqualTo(0); assertThat(encoder.toString()).isEqualTo(""); }
@Test public void tag_set_matching() { int id1 = dic.intern(tags("A", "1"), encoder); int id2 = dic.intern(tags("A", "1"), encoder); assertThat(id1).isEqualTo(id2); }
@Test public void tag_encoding() { int id1 = dic.intern(tags("A", "1"), encoder); int id2 = dic.intern(tags("A", "2"), encoder); int id3 = dic.intern(tags("B", "1", "A", "1"), encoder); assertThat(id1).isEqualTo(1); assertThat(id2).isEqualTo(2); assertThat(id3).isEqualTo(3); assertThat(encoder.toString()).isEqualTo( "[1,0] +A:1! [2,0] +A:2! [3,1] +B:1!"); }
@Test public void tag_eviction() { int id1 = dic.intern(tags("A", "1"), encoder); int id2 = dic.intern(tags("A", "2"), encoder); int id3 = dic.intern(tags("B", "1", "A", "1", "A", "2"), encoder); int id11 = dic.intern(tags("A", "1"), encoder); int id4 = dic.intern(tags("B", "1", "A", "2", "C", "1"), encoder); int id5 = dic.intern(tags("C", "1", "B", "1"), encoder); assertThat(id1).isEqualTo(1); assertThat(id2).isEqualTo(2); assertThat(id3).isEqualTo(3); assertThat(id11).isEqualTo(1); assertThat(id4).isEqualTo(2); assertThat(id5).isEqualTo(1); assertThat(encoder.toString()).isEqualTo( "[1,0] +A:1! [2,0] +A:2! [3,1] +A:2 +B:1! [2,3] -A:1 +C:1! [1,2] -A!"); }
@Test public void tag_key_override() { int id1 = dic.intern(tags("A", "long", "B", "2"), encoder); int id2 = dic.intern(tags("A", "long", "B", "1"), encoder); int id3 = dic.intern(tags("A", "long", "B", "3"), encoder); assertThat(id1).isEqualTo(1); assertThat(id2).isEqualTo(2); assertThat(id3).isEqualTo(3); assertThat(encoder.toString()).isEqualTo( "[1,0] +A:long +B:2! [2,1] +B:1 -B! [3,1] -B +B:3!"); }