public RelationshipChainField fieldFor(long nodeId, RelationshipRecord rel) { if (rel.getFirstNode() == nodeId) { return first; } else if (rel.getSecondNode() == nodeId) { return second; } throw new IllegalArgumentException(format("%s does not reference node %d", rel, nodeId)); }
@Override public boolean visitRelationshipCommand(Command.RelationshipCommand command) throws IOException { RelationshipRecord record = command.getRecord(); byte flags = bitFlags( bitFlag(record.inUse(), Record.IN_USE.byteValue()), bitFlag(record.isCreated(), Record.CREATED_IN_TX)); channel.put(NeoCommandType.REL_COMMAND); channel.putLong(record.getId()); channel.put(flags); if (record.inUse()) { channel .putLong(record.getFirstNode()) .putLong(record.getSecondNode()) .putInt(record.getType()) .putLong(record.getFirstPrevRel()) .putLong(record.getFirstNextRel()) .putLong(record.getSecondPrevRel()) .putLong(record.getSecondNextRel()) .putLong(record.getNextProp()) .put( (byte) ((record.isFirstInFirstChain() ? 1 : 0) | (record.isFirstInSecondChain() ? 2 : 0))); } else { channel.putInt(record.getType()); } return false; }
@Override public boolean visitRelationshipCommand(Command.RelationshipCommand command) throws IOException { long id = channel.getLong(); byte inUseFlag = channel.get(); boolean inUse = false; if ((inUseFlag & Record.IN_USE.byteValue()) == Record.IN_USE.byteValue()) { inUse = true; } else if ((inUseFlag & Record.IN_USE.byteValue()) != Record.NOT_IN_USE.byteValue()) { throw new IOException("Illegal in use flag: " + inUseFlag); } RelationshipRecord record; if (inUse) { record = new RelationshipRecord(id, channel.getLong(), channel.getLong(), channel.getInt()); record.setInUse(inUse); record.setFirstPrevRel(channel.getLong()); record.setFirstNextRel(channel.getLong()); record.setSecondPrevRel(channel.getLong()); record.setSecondNextRel(channel.getLong()); record.setNextProp(channel.getLong()); /* * Logs for version 2.0 do not contain the proper values for the following two flags. Also, * the defaults won't do, because the pointers for prev in the fist record will not be interpreted * properly. So we need to set the flags explicitly here. * * Note that this leaves the prev field for the first record in the chain having a value of -1, * which is not correct, as it should contain the relationship count instead. However, we cannot * determine this value from the contents of the log alone. */ record.setFirstInFirstChain( record.getFirstPrevRel() == Record.NO_PREV_RELATIONSHIP.intValue()); record.setFirstInSecondChain( record.getSecondPrevRel() == Record.NO_PREV_RELATIONSHIP.intValue()); } else { record = new RelationshipRecord(id, -1, -1, -1); record.setInUse(false); } command.init(record); return false; }
/** * Keeps track of the given relationship and makes use of it later in {@link #accept(long)} and * {@link #apply(long, long)} * * @param deletedRelationship relationship that has been deleted in this transaction. */ public void deleted(RelationshipRecord deletedRelationship) { nodes.add(deletedRelationship.getFirstNode()); nodes.add(deletedRelationship.getSecondNode()); relationships.put(deletedRelationship.getId(), deletedRelationship); }