private Object readResolve() throws ObjectStreamException { return create(names); } }
/** * Create a new attribute set. * @param names The list of attributes. * @return The attribute set. */ public static AttributeSet create(TypedName<?>... names) { return create(Arrays.asList(names)); }
@Override public AttributeSet getAttributes() { if (attributes.isEmpty()) { return null; } List<TypedName<?>> attrs = new ArrayList<>(attributes.values()); if (!attrs.contains(CommonAttributes.ENTITY_ID)) { attrs.add(0, CommonAttributes.ENTITY_ID); } return AttributeSet.create(attrs); }
@Nullable @Override public AttributeSet getAttributes() { List<TypedName<?>> names = new ArrayList<>(); names.add(CommonAttributes.ENTITY_ID); if (columns != null) { columns.stream() .filter(n -> n != CommonAttributes.ENTITY_ID) .forEach(names::add); } else if (labeledColumns != null) { labeledColumns.values() .stream() .filter(n -> n != CommonAttributes.ENTITY_ID) .forEach(names::add); } return AttributeSet.create(names); }
@Override public Set<TypedName<?>> getTypedAttributeNames() { int missing = 0; int na = attributes.size(); for (int i = 0; i < na; i++) { if (attrStores[i].isNull(position)) { missing |= 1 << i; } } if (missing != 0) { AttributeSet set = attrSets.get(missing); if (set == null) { set = AttributeSet.create(IntStream.range(0, na) .filter(i -> !attrStores[i].isNull(position)) .mapToObj(attributes::getAttribute) .collect(Collectors.toList())); attrSets.put(missing, set); } return set; } return attributes; }
protected static BeanEntityLayout makeLayout(Class<? extends AbstractBeanEntity> type) { BeanEntityLayout res = cache.get(type); if (res != null) { return res; } DynamicClassLoader dlc = new DynamicClassLoader(type.getClassLoader()); Map<String, BeanAttributeGetter> attrs = new HashMap<>(); List<TypedName<?>> names = new ArrayList<>(); for (Method m: type.getMethods()) { EntityAttribute annot = m.getAnnotation(EntityAttribute.class); if (annot != null) { BeanAttributeGetter gfunc = generateGetter(dlc, type, m); attrs.put(annot.value(), gfunc); names.add(TypedName.create(annot.value(), TypeToken.of(m.getGenericReturnType()))); } } AttributeSet aset = AttributeSet.create(names); ImmutableList.Builder<BeanAttributeGetter> mhlb = ImmutableList.builder(); for (String name: aset.nameSet()) { mhlb.add(attrs.get(name)); } res = new BeanEntityLayout(aset, mhlb.build()); cache.put(type, res); return res; }
@Override public Entity build() { Preconditions.checkState(type != null, "Entity type not set"); Preconditions.checkState(idSet, "ID not set"); if (attributes.isEmpty() || attributes.keySet().equals(Collections.singleton(CommonAttributes.ENTITY_ID))) { return new BareEntity(type, id); } else { List<TypedName<?>> names = new ArrayList<>(attributes.size()); names.add(CommonAttributes.ENTITY_ID); for (Attribute<?> a: attributes.values()) { names.add(a.getTypedName()); } assert names.lastIndexOf(CommonAttributes.ENTITY_ID) == 0; AttributeSet aset = AttributeSet.create(names); Object[] values = new Object[aset.size()]; for (Attribute<?> a: attributes.values()) { int i = aset.lookup(a.getTypedName()); values[i-1] = a.getValue(); } return new BasicEntity(type, id, aset, values); } } }
@Test public void testInternCache() { AttributeSet attrs = AttributeSet.create(CommonAttributes.ENTITY_ID, CommonAttributes.USER_ID, CommonAttributes.ITEM_ID); AttributeSet a2 = AttributeSet.create(CommonAttributes.ENTITY_ID, CommonAttributes.USER_ID, CommonAttributes.ITEM_ID); assertThat(a2, sameInstance(attrs)); }
@Test public void testNameSet() { AttributeSet attrs = AttributeSet.create(CommonAttributes.ENTITY_ID); assertThat(attrs.nameSet(), contains("id")); assertThat(attrs.nameSet().contains("id"), equalTo(true)); assertThat(attrs.nameSet().contains("foo"), equalTo(false)); }
@Test public void testLookupByName() { AttributeSet attrs = AttributeSet.create(CommonAttributes.ENTITY_ID); assertThat(attrs.lookup("id"), equalTo(0)); assertThat(attrs.lookup("foobat"), equalTo(-1)); }
@Test public void testMultiple() { AttributeSet attrs = AttributeSet.create(TypedName.create("abbr", String.class), CommonAttributes.ENTITY_ID, CommonAttributes.USER_ID); assertThat(attrs.nameSet(), contains("id", "abbr", "user")); } }
@Test public void testBasicSingleAttribute() { AttributeSet attrs = AttributeSet.create(CommonAttributes.ENTITY_ID); assertThat(attrs.size(), equalTo(1)); assertThat(attrs.lookup(CommonAttributes.ENTITY_ID), equalTo(0)); assertThat(attrs.lookup(CommonAttributes.ITEM_ID), equalTo(-1)); assertThat(attrs, contains(CommonAttributes.ENTITY_ID)); assertThat(attrs.contains(CommonAttributes.ENTITY_ID), equalTo(true)); assertThat(attrs.contains(CommonAttributes.NAME), equalTo(false)); }
@Test public void testEmptyBuilder() { EntityCollection ec = EntityCollection.newBuilder(CommonTypes.USER, AttributeSet.create(CommonAttributes.ENTITY_ID)) .build(); assertThat(ec.size(), equalTo(0)); assertThat(ec.lookup(42), nullValue()); assertThat(ec.getType(), equalTo(CommonTypes.USER)); assertThat(ec.idSet(), hasSize(0)); }
@Test public void testGroupEntities() { EntityFactory efac = new EntityFactory(); Rating r1 = efac.rating(100, 200, 3.5); Rating r2 = efac.rating(100, 201, 4.0); Rating r3 = efac.rating(101, 200, 2.0); EntityCollection ec = EntityCollection.newBuilder(CommonTypes.RATING, AttributeSet.create(CommonAttributes.ENTITY_ID, CommonAttributes.USER_ID, CommonAttributes.ITEM_ID, CommonAttributes.RATING)) .add(r1) .add(r2) .add(r3) .addIndex(CommonAttributes.USER_ID) .build(); Map<Long,List<Entity>> groups = ec.grouped(CommonAttributes.USER_ID); assertThat(groups.keySet(), containsInAnyOrder(100L, 101L)); assertThat(groups, hasEntry(equalTo(101L), contains(r3))); assertThat(groups, hasEntry(equalTo(100L), containsInAnyOrder(r1, r2))); groups = ec.grouped(CommonAttributes.ITEM_ID); assertThat(groups.keySet(), containsInAnyOrder(200L, 201L)); assertThat(groups, hasEntry(equalTo(201L), contains(r2))); assertThat(groups, hasEntry(equalTo(200L), containsInAnyOrder(r1, r3))); }
/** * Create a new attribute set. * @param names The list of attributes. * @return The attribute set. */ public static AttributeSet create(TypedName<?>... names) { return create(Arrays.asList(names)); }
@Test public void testAddEntity() { EntityCollection ec = EntityCollection.newBuilder(CommonTypes.USER, AttributeSet.create(CommonAttributes.ENTITY_ID)) .add(Entities.create(CommonTypes.USER, 42)) .build(); assertThat(ec.size(), equalTo(1)); assertThat(ec.lookup(42), equalTo(Entities.create(CommonTypes.USER, 42))); assertThat(ec.lookup(70), nullValue()); assertThat(Lists.newArrayList(ec), contains(Entities.create(CommonTypes.USER, 42))); assertThat(ec.find(CommonAttributes.ENTITY_ID, 42L), contains(Entities.create(CommonTypes.USER, 42))); assertThat(ec.getType(), equalTo(CommonTypes.USER)); assertThat(ec.idSet(), contains(42L)); }
@Test public void testFindEntity() { Entity rating = Entities.newBuilder(CommonTypes.RATING) .setId(37) .setAttribute(CommonAttributes.USER_ID, 10L) .setAttribute(CommonAttributes.ITEM_ID, 203L) .setAttribute(CommonAttributes.RATING, 3.5) .build(); EntityCollection ec = EntityCollection.newBuilder(CommonTypes.RATING, AttributeSet.create(CommonAttributes.ENTITY_ID, CommonAttributes.USER_ID, CommonAttributes.ITEM_ID, CommonAttributes.RATING)) .add(rating) .build(); assertThat(ec.getType(), equalTo(CommonTypes.RATING)); assertThat(ec.size(), equalTo(1)); // assertThat(ec.lookup(37), instanceOf(Rating.class)); assertThat(ec.lookup(37), equalTo(rating)); assertThat(Lists.newArrayList(ec), contains(rating)); assertThat(ec.find(CommonAttributes.USER_ID, 10L), contains(rating)); assertThat(ec.find(CommonAttributes.ITEM_ID, 10L), hasSize(0)); }
@Override public AttributeSet getAttributes() { if (attributes.isEmpty()) { return null; } List<TypedName<?>> attrs = new ArrayList<>(attributes.values()); if (!attrs.contains(CommonAttributes.ENTITY_ID)) { attrs.add(0, CommonAttributes.ENTITY_ID); } return AttributeSet.create(attrs); }
@Test public void testFindIndexedEntity() { Entity rating = Entities.newBuilder(CommonTypes.RATING) .setId(37) .setAttribute(CommonAttributes.USER_ID, 10L) .setAttribute(CommonAttributes.ITEM_ID, 203L) .setAttribute(CommonAttributes.RATING, 3.5) .build(); EntityCollection ec = EntityCollection.newBuilder(CommonTypes.RATING, AttributeSet.create(CommonAttributes.ENTITY_ID, CommonAttributes.USER_ID, CommonAttributes.ITEM_ID, CommonAttributes.RATING)) .addIndex(CommonAttributes.USER_ID) .add(rating) .build(); assertThat(ec.getType(), equalTo(CommonTypes.RATING)); assertThat(ec.size(), equalTo(1)); assertThat(ec.lookup(37), equalTo(rating)); assertThat(Lists.newArrayList(ec), contains(rating)); assertThat(ec.find(CommonAttributes.USER_ID, 10L), contains(rating)); assertThat(ec.find(CommonAttributes.ITEM_ID, 10L), hasSize(0)); }
@Test public void testIndexEntityAfterAddStarted() { Entity rating = Entities.newBuilder(CommonTypes.RATING) .setId(37) .setAttribute(CommonAttributes.USER_ID, 10L) .setAttribute(CommonAttributes.ITEM_ID, 203L) .setAttribute(CommonAttributes.RATING, 3.5) .build(); EntityCollection ec = EntityCollection.newBuilder(CommonTypes.RATING, AttributeSet.create(CommonAttributes.ENTITY_ID, CommonAttributes.USER_ID, CommonAttributes.ITEM_ID, CommonAttributes.RATING)) .add(rating) .addIndex(CommonAttributes.USER_ID) .build(); assertThat(ec.getType(), equalTo(CommonTypes.RATING)); assertThat(ec.size(), equalTo(1)); assertThat(ec.lookup(37), equalTo(rating)); assertThat(Lists.newArrayList(ec), contains(rating)); assertThat(ec.find(CommonAttributes.USER_ID, 10L), contains(rating)); assertThat(ec.find(CommonAttributes.ITEM_ID, 10L), hasSize(0)); }