/** * A shortcut for resolve(contextRecord.getId(), idGenerator). */ public RecordId resolve(Record contextRecord, IdGenerator idGenerator) { return resolve(contextRecord.getId(), idGenerator); }
private static void extract(Object value, LinkCollector collector, FieldType ctxField, RecordId ctxRecord, LRepository repository) throws RepositoryException, InterruptedException { if (value instanceof List) { List list = (List)value; for (Object item : list) { extract(item, collector, ctxField, ctxRecord, repository); } } else if (value instanceof Record) { extractRecord((Record)value, collector, ctxField, ctxRecord, repository); } else if (value instanceof Link) { RecordId recordId = ((Link)value).resolve(ctxRecord, repository.getIdGenerator()); collector.addLink(recordId, ctxField.getId()); } else { throw new RuntimeException("Encountered an unexpected kind of object from a link field: " + value.getClass().getName()); } } }
@Override public void follow(IndexUpdateBuilder indexUpdateBuilder, FollowCallback callback) throws RepositoryException, IOException, InterruptedException { if (!indexUpdateBuilder.getSystemFields().isSystemField(fieldType.getName())) { indexUpdateBuilder.addDependency(fieldType.getId()); } IdGenerator idGenerator = indexUpdateBuilder.getRepository().getIdGenerator(); RecordContext ctx = indexUpdateBuilder.getRecordContext(); LRepository repository = indexUpdateBuilder.getRepository(); // FIXME: it's more efficient to read all records at once // but make sure missing records are also treated (handled here via null linkedRecord in case of RecordNotFoundException if (ctx.record != null) { List links = IndexerUtils.flatList(ctx.record, fieldType); for (Link link: (List<Link>)links) { RecordId linkedRecordId = link.resolve(ctx.contextRecord, idGenerator); Record linkedRecord = null; String tableName = link.getTable() != null ? link.getTable() : indexUpdateBuilder.getTable(); LTable table = repository.getTable(tableName); try { linkedRecord = VersionTag.getIdRecord(linkedRecordId, indexUpdateBuilder.getVTag(), table, repository); } catch (RecordNotFoundException rnfe) { // ok, continue with null value } catch (VersionNotFoundException e) { // ok, continue with null value } indexUpdateBuilder.push(linkedRecord, new Dep(linkedRecordId, Collections.<String>emptySet())); callback.call(); indexUpdateBuilder.pop(); } } }