/** * Create a new entity builder that is initialized with a copy of an entity. * @param e The entity. * @return An entity builder initialized to build a copy of {@code e}. */ public static EntityBuilder copyBuilder(Entity e) { EntityBuilder eb = newBuilder(e.getType(), e.getId()); for (TypedName a: e.getTypedAttributeNames()) { eb.setAttribute(a, e.get(a)); } return eb; }
@Nonnull @Override public MetricResult measureUserRecList(Recommender rec, TestUser user, int targetLength, List<Long> recommendations, Mean context) { if (recommendations == null) { return MetricResult.empty(); } Long2DoubleMap ratings = new Long2DoubleOpenHashMap(); for (Entity e: user.getTestHistory()) { long item = e.getLong(CommonAttributes.ITEM_ID); Object av = e.get(gainAttribute); if (av instanceof Number) { ratings.put(item, ((Number) av).doubleValue()); } else { throw new IllegalArgumentException("value " + av + " for attribute " + gainAttribute + " is not numeric"); } } List<Long> ideal = ratings.keySet() .stream() .sorted(LongUtils.keyValueComparator(ratings).reversed()) .limit(targetLength >= 0 ? targetLength : ratings.size()) .collect(Collectors.toList()); double idealGain = computeDCG(ideal, ratings); double gain = computeDCG(recommendations, ratings); double score = gain / idealGain; synchronized (context) { context.increment(score); } return MetricResult.singleton(columnName, score); }
@Test public void testConfigureItemJSON() throws IOException, URISyntaxException { URI baseURI = TextEntitySourceTest.class.getResource("header-ratings.csv").toURI(); JsonNode node = reader.readTree("{\"file\": \"items.json\", \"format\": \"json\", \"entity_type\": \"item\"}"); TextEntitySource fr = TextEntitySource.fromJSON("test", node, baseURI); try (ObjectStream<Entity> stream = fr.openStream()) { Entity first = stream.readObject(); assertThat(first.getType(), equalTo(CommonTypes.ITEM)); assertThat(first.getId(), equalTo(42L)); assertThat(first.get(CommonAttributes.ENTITY_ID), equalTo(42L)); assertThat(first.get(CommonAttributes.NAME), equalTo("woozle")); Entity second = stream.readObject(); assertThat(second.getType(), equalTo(CommonTypes.ITEM)); assertThat(second.getId(), equalTo(37L)); assertThat(second.get(CommonAttributes.ENTITY_ID), equalTo(37L)); assertThat(second.get(CommonAttributes.NAME), equalTo("heffalump")); assertThat(stream.readObject(), nullValue()); } }
@Test public void testConfigureReader() throws IOException { ObjectReader reader = new ObjectMapper().reader(); JsonNode json = reader.readTree("{\"entity_type\": \"item\"}"); EntityFormat fmt = JSONEntityFormat.fromJSON(null, ClassLoaders.inferDefault(), json); assertThat(fmt.getEntityType(), equalTo(CommonTypes.ITEM)); LineEntityParser lep = fmt.makeParser(Collections.EMPTY_LIST); Entity res = lep.parse("{\"id\": 204, \"name\": \"hamster\", \"extra\": \"wumpus\"}"); assertThat(res, notNullValue()); assertThat(res.getId(), equalTo(204L)); assertThat(res.get(CommonAttributes.NAME), equalTo("hamster")); assertThat(res.get("extra"), (Matcher) equalTo("wumpus")); }
@Test public void testBareEntity() { EntityBuilder eb = Entities.newBuilder(CommonTypes.USER, 42); Entity e = eb.build(); assertThat(e, notNullValue()); assertThat(e.getType(), equalTo(CommonTypes.USER)); assertThat(e.getId(), equalTo(42L)); assertThat(e.getTypedAttributeNames(), contains((TypedName) CommonAttributes.ENTITY_ID)); assertThat(e.getAttributeNames(), contains("id")); assertThat(e.get(CommonAttributes.ENTITY_ID), equalTo(42L)); assertThat(e.get("id"), equalTo((Object) 42L)); }
assertThat(first.getType(), equalTo(EntityType.forName("rating"))); assertThat(first.getId(), equalTo(1L)); assertThat(first.get(CommonAttributes.ENTITY_ID), equalTo(1L)); assertThat(first.get(CommonAttributes.USER_ID), equalTo(10L)); assertThat(first.get(CommonAttributes.ITEM_ID), equalTo(20L)); assertThat(first.get(CommonAttributes.RATING), equalTo(3.5)); assertThat(first.hasAttribute(CommonAttributes.TIMESTAMP), equalTo(false)); assertThat(second.getType(), equalTo(EntityType.forName("rating"))); assertThat(second.getId(), equalTo(2L)); assertThat(second.get(CommonAttributes.ENTITY_ID), equalTo(2L)); assertThat(second.get(CommonAttributes.USER_ID), equalTo(11L)); assertThat(second.get(CommonAttributes.ITEM_ID), equalTo(20L)); assertThat(second.get(CommonAttributes.RATING), equalTo(4.0)); assertThat(second.hasAttribute(CommonAttributes.TIMESTAMP), equalTo(false));
assertThat(pc, notNullValue()); assertThat(pc.getId(), equalTo(1001L)); assertThat(pc.get(CommonAttributes.ITEM_ID), equalTo(42L)); assertThat(pc.get(CommonAttributes.COUNT), equalTo(10)); assertThat(pc, notNullValue()); assertThat(pc.getId(), equalTo(1010L)); assertThat(pc.get(CommonAttributes.ITEM_ID), equalTo(78L)); assertThat(pc.get(CommonAttributes.COUNT), equalTo(2));
@Test public void testAttributeSetters() { EntityBuilder eb = Entities.newBuilder(CommonTypes.USER) .setAttribute(CommonAttributes.ENTITY_ID, 42L); Entity e = eb.build(); assertThat(e, notNullValue()); assertThat(e.getType(), equalTo(CommonTypes.USER)); assertThat(e.getId(), equalTo(42L)); assertThat(e.getTypedAttributeNames(), contains((TypedName) CommonAttributes.ENTITY_ID)); assertThat(e.getAttributeNames(), contains("id")); assertThat(e.hasAttribute("user"), equalTo(false)); assertThat(e.hasAttribute(CommonAttributes.USER_ID), equalTo(false)); assertThat(e.get(CommonAttributes.ENTITY_ID), equalTo(42L)); }
assertThat(first.getType(), equalTo(EntityType.forName("rating"))); assertThat(first.getId(), equalTo(101L)); assertThat(first.get(CommonAttributes.ENTITY_ID), equalTo(101L)); assertThat(first.get(CommonAttributes.ITEM_ID), equalTo(10L)); assertThat(first.get(CommonAttributes.USER_ID), equalTo(20L)); assertThat(first.get(CommonAttributes.RATING), equalTo(3.5)); assertThat(first.hasAttribute(CommonAttributes.TIMESTAMP), equalTo(false)); assertThat(second.getType(), equalTo(EntityType.forName("rating"))); assertThat(second.getId(), equalTo(109L)); assertThat(second.get(CommonAttributes.ENTITY_ID), equalTo(109L)); assertThat(second.get(CommonAttributes.ITEM_ID), equalTo(11L)); assertThat(second.get(CommonAttributes.USER_ID), equalTo(20L)); assertThat(second.get(CommonAttributes.RATING), equalTo(4.0)); assertThat(second.hasAttribute(CommonAttributes.TIMESTAMP), equalTo(false));
@Test public void testBasicParseLine() { DelimitedColumnEntityFormat format = new DelimitedColumnEntityFormat(); format.setDelimiter(","); EntityType pcType = EntityType.forName("pop_count"); format.setEntityType(pcType); format.addColumn(CommonAttributes.ITEM_ID); format.addColumn(CommonAttributes.COUNT); assertThat(format.getAttributes(), containsInAnyOrder(CommonAttributes.ENTITY_ID, CommonAttributes.ITEM_ID, CommonAttributes.COUNT)); LineEntityParser parser = format.makeParser(Collections.<String>emptyList()); assertThat(parser, notNullValue()); Entity pc = parser.parse("42,10"); assertThat(pc, notNullValue()); assertThat(pc.getId(), equalTo(1L)); assertThat(pc.get(CommonAttributes.ITEM_ID), equalTo(42L)); assertThat(pc.get(CommonAttributes.COUNT), equalTo(10)); // make sure the ID (row count) advances pc = parser.parse("78,2"); assertThat(pc, notNullValue()); assertThat(pc.getId(), equalTo(2L)); assertThat(pc.get(CommonAttributes.ITEM_ID), equalTo(78L)); assertThat(pc.get(CommonAttributes.COUNT), equalTo(2)); }
@Test public void testBasicEntity() { Entity e = Entities.newBuilder(CommonTypes.USER, 42) .setAttribute(CommonAttributes.NAME, "HACKEM MUCHE") .build(); assertThat(e, notNullValue()); assertThat(e.getType(), equalTo(CommonTypes.USER)); assertThat(e.getId(), equalTo(42L)); assertThat(e.getTypedAttributeNames(), containsInAnyOrder((TypedName) CommonAttributes.NAME, CommonAttributes.ENTITY_ID)); assertThat(e.getAttributeNames(), containsInAnyOrder("name", "id")); assertThat(e.get("name"), equalTo((Object) "HACKEM MUCHE")); assertThat(e.get(CommonAttributes.NAME), equalTo("HACKEM MUCHE")); assertThat(e.hasAttribute("name"), equalTo(true)); assertThat(e.hasAttribute("user"), equalTo(false)); assertThat(e.hasAttribute(CommonAttributes.NAME), equalTo(true)); assertThat(e.hasAttribute(CommonAttributes.USER_ID), equalTo(false)); assertThat(e.get(CommonAttributes.ENTITY_ID), equalTo(42L)); } }
assertThat(first.getType(), equalTo(EntityType.forName("rating"))); assertThat(first.getId(), equalTo(1L)); assertThat(first.get(CommonAttributes.ENTITY_ID), equalTo(1L)); assertThat(first.get(CommonAttributes.ITEM_ID), equalTo(20L)); assertThat(first.get(CommonAttributes.USER_ID), equalTo(10L)); assertThat(first.get(CommonAttributes.RATING), equalTo(3.5)); assertThat(first.hasAttribute(CommonAttributes.TIMESTAMP), equalTo(false)); assertThat(second.getType(), equalTo(EntityType.forName("rating"))); assertThat(second.getId(), equalTo(2L)); assertThat(second.get(CommonAttributes.ENTITY_ID), equalTo(2L)); assertThat(second.get(CommonAttributes.ITEM_ID), equalTo(20L)); assertThat(second.get(CommonAttributes.USER_ID), equalTo(11L)); assertThat(second.get(CommonAttributes.RATING), equalTo(4.0)); assertThat(second.hasAttribute(CommonAttributes.TIMESTAMP), equalTo(false));
@Test public void testThingFields() { JSONEntityFormat fmt = new JSONEntityFormat(); fmt.setEntityType(CommonTypes.ITEM); fmt.addAttribute(CommonAttributes.ENTITY_ID); fmt.addAttribute("title", CommonAttributes.NAME); LineEntityParser lep = fmt.makeParser(Collections.EMPTY_LIST); Entity res = lep.parse("{\"id\": 204, \"title\": \"hamster\", \"extra\": \"wumpus\"}"); assertThat(res, notNullValue()); assertThat(res.getId(), equalTo(204L)); assertThat(res.get(CommonAttributes.NAME), equalTo("hamster")); assertThat(res.hasAttribute("extra"), equalTo(false)); }
/** * Create a new entity builder that is initialized with a copy of an entity. * @param e The entity. * @return An entity builder initialized to build a copy of {@code e}. */ public static EntityBuilder copyBuilder(Entity e) { EntityBuilder eb = newBuilder(e.getType(), e.getId()); for (TypedName a: e.getTypedAttributeNames()) { eb.setAttribute(a, e.get(a)); } return eb; }
assertThat(first.getType(), equalTo(EntityType.forName("rating"))); assertThat(first.getId(), equalTo(101L)); assertThat(first.get(CommonAttributes.ENTITY_ID), equalTo(101L)); assertThat(first.get(CommonAttributes.ITEM_ID), equalTo(10L)); assertThat(first.get(CommonAttributes.USER_ID), equalTo(20L)); assertThat(first.get(CommonAttributes.RATING), equalTo(3.5)); assertThat(first.hasAttribute(CommonAttributes.TIMESTAMP), equalTo(false)); assertThat(second.getType(), equalTo(EntityType.forName("rating"))); assertThat(second.getId(), equalTo(109L)); assertThat(second.get(CommonAttributes.ENTITY_ID), equalTo(109L)); assertThat(second.get(CommonAttributes.ITEM_ID), equalTo(11L)); assertThat(second.get(CommonAttributes.USER_ID), equalTo(20L)); assertThat(second.get(CommonAttributes.RATING), equalTo(4.0)); assertThat(second.hasAttribute(CommonAttributes.TIMESTAMP), equalTo(false));
@Test public void testParseLineWithBaseId() { DelimitedColumnEntityFormat format = new DelimitedColumnEntityFormat(); format.setDelimiter(","); format.setBaseId(42); EntityType pcType = EntityType.forName("pop_count"); format.setEntityType(pcType); format.addColumn(CommonAttributes.ITEM_ID); format.addColumn(CommonAttributes.COUNT); assertThat(format.getAttributes(), containsInAnyOrder(CommonAttributes.ENTITY_ID, CommonAttributes.ITEM_ID, CommonAttributes.COUNT)); LineEntityParser parser = format.makeParser(Collections.<String>emptyList()); assertThat(parser, notNullValue()); Entity pc = parser.parse("42,10"); assertThat(pc, notNullValue()); assertThat(pc.getId(), equalTo(43L)); assertThat(pc.get(CommonAttributes.ITEM_ID), equalTo(42L)); assertThat(pc.get(CommonAttributes.COUNT), equalTo(10)); // make sure the ID (row count) advances pc = parser.parse("78,2"); assertThat(pc, notNullValue()); assertThat(pc.getId(), equalTo(44L)); assertThat(pc.get(CommonAttributes.ITEM_ID), equalTo(78L)); assertThat(pc.get(CommonAttributes.COUNT), equalTo(2)); }
@Test public void testHeaderParseLine() { DelimitedColumnEntityFormat format = new DelimitedColumnEntityFormat(); format.setDelimiter(","); format.setHeader(true); assertThat(format.usesHeader(), equalTo(true)); assertThat(format.getHeaderLines(), equalTo(1)); EntityType pcType = EntityType.forName("pop_count"); format.setEntityType(pcType); format.addColumn("song", CommonAttributes.ITEM_ID); format.addColumn("plays", CommonAttributes.COUNT); assertThat(format.getAttributes(), containsInAnyOrder(CommonAttributes.ENTITY_ID, CommonAttributes.ITEM_ID, CommonAttributes.COUNT)); LineEntityParser parser = format.makeParser(Collections.singletonList("song,plays")); assertThat(parser, notNullValue()); Entity pc = parser.parse("42,10"); assertThat(pc, notNullValue()); assertThat(pc.getId(), equalTo(1L)); assertThat(pc.get(CommonAttributes.ITEM_ID), equalTo(42L)); assertThat(pc.get(CommonAttributes.COUNT), equalTo(10)); // make sure the ID (row count) advances pc = parser.parse("78,2"); assertThat(pc, notNullValue()); assertThat(pc.getId(), equalTo(2L)); assertThat(pc.get(CommonAttributes.ITEM_ID), equalTo(78L)); assertThat(pc.get(CommonAttributes.COUNT), equalTo(2)); }
@Test public void testConfigureReaderCompoundField() throws IOException { TypeToken<List<String>> sl = TypeUtils.makeListType(TypeToken.of(String.class)); TypedName<List<String>> tlName = TypedName.create("tags", sl); ObjectReader reader = new ObjectMapper().reader(); JsonNode json = reader.readTree("{\"entity_type\": \"item\", \"attributes\": {\"id\": \"long\", \"title\": {\"name\": \"name\", \"type\": \"string\"}, \"tags\": \"string[]\"}}"); JSONEntityFormat fmt = JSONEntityFormat.fromJSON(null, ClassLoaders.inferDefault(), json); assertThat(fmt.getEntityType(), equalTo(CommonTypes.ITEM)); assertThat(fmt.getDefinedAttributes(), hasEntry("id", (TypedName) CommonAttributes.ENTITY_ID)); assertThat(fmt.getDefinedAttributes(), hasEntry("title", (TypedName) CommonAttributes.NAME)); assertThat(fmt.getDefinedAttributes(), hasEntry("tags", (TypedName) tlName)); assertThat(fmt.getDefinedAttributes().size(), equalTo(3)); assertThat(fmt.getAttributes(), containsInAnyOrder(CommonAttributes.ENTITY_ID, CommonAttributes.NAME, tlName)); LineEntityParser lep = fmt.makeParser(Collections.EMPTY_LIST); Entity res = lep.parse("{\"id\": 204, \"title\": \"hamster\", \"tags\": [\"foo\", \"bar\"]}"); assertThat(res, notNullValue()); assertThat(res.getId(), equalTo(204L)); assertThat(res.get(CommonAttributes.NAME), equalTo("hamster")); assertThat(res.get(tlName), contains("foo", "bar")); } }