Esempio n. 1
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldContainFedRelationshipUpdate() throws Exception
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
        public virtual void ShouldContainFedRelationshipUpdate()
        {
            OnlineIndexUpdates onlineIndexUpdates = new OnlineIndexUpdates(_nodeStore, _relationshipStore, _indexingService, _propertyPhysicalToLogicalConverter);

            long relId = 0;
            RelationshipRecord inUse    = GetRelationship(relId, true, ENTITY_TOKEN);
            Value propertyValue         = Values.of("hej");
            long  propertyId            = CreateRelationshipProperty(inUse, propertyValue, 1);
            RelationshipRecord notInUse = GetRelationship(relId, false, ENTITY_TOKEN);

            _relationshipStore.updateRecord(inUse);

            Command.RelationshipCommand relationshipCommand = new Command.RelationshipCommand(inUse, notInUse);
            PropertyRecord propertyBlocks = new PropertyRecord(propertyId);

            propertyBlocks.RelId = relId;
            Command.PropertyCommand propertyCommand = new Command.PropertyCommand(_recordAccess.getIfLoaded(propertyId).forReadingData(), propertyBlocks);

            StoreIndexDescriptor indexDescriptor = forSchema(multiToken(_entityTokens, RELATIONSHIP, 1, 4, 6), EMPTY.ProviderDescriptor).withId(0);

            _indexingService.createIndexes(indexDescriptor);
            _indexingService.getIndexProxy(indexDescriptor.Schema()).awaitStoreScanCompleted(0, MILLISECONDS);

            onlineIndexUpdates.Feed(NodeGroup(null), RelationshipGroup(relationshipCommand, propertyCommand));
            assertTrue(onlineIndexUpdates.HasUpdates());
            IEnumerator <IndexEntryUpdate <SchemaDescriptor> > iterator = onlineIndexUpdates.GetEnumerator();

//JAVA TO C# CONVERTER TODO TASK: Java iterators are only converted within the context of 'while' and 'for' loops:
            assertEquals(iterator.next(), IndexEntryUpdate.remove(relId, indexDescriptor, propertyValue, null, null));
//JAVA TO C# CONVERTER TODO TASK: Java iterators are only converted within the context of 'while' and 'for' loops:
            assertFalse(iterator.hasNext());
        }
Esempio n. 2
0
        private void GatherUpdatesFor(long relationshipId, Command.RelationshipCommand relationshipCommand, EntityCommandGrouper <Command.RelationshipCommand> .Cursor propertyCommands)
        {
            EntityUpdates.Builder relationshipPropertyUpdate = GatherUpdatesFromCommandsForRelationship(relationshipId, relationshipCommand, propertyCommands);

            EntityUpdates entityUpdates = relationshipPropertyUpdate.Build();

            // we need to materialize the IndexEntryUpdates here, because when we
            // consume (later in separate thread) the store might have changed.
            foreach (IndexEntryUpdate <SchemaDescriptor> update in _updateService.convertToIndexUpdates(entityUpdates, EntityType.RELATIONSHIP))
            {
                _updates.Add(update);
            }
        }
Esempio n. 3
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldDifferentiateNodesAndRelationships() throws Exception
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
        public virtual void ShouldDifferentiateNodesAndRelationships()
        {
            OnlineIndexUpdates onlineIndexUpdates = new OnlineIndexUpdates(_nodeStore, _relationshipStore, _indexingService, _propertyPhysicalToLogicalConverter);

            int        nodeId            = 0;
            NodeRecord inUseNode         = GetNode(nodeId, true);
            Value      nodePropertyValue = Values.of("hej");
            long       nodePropertyId    = CreateNodeProperty(inUseNode, nodePropertyValue, 1);
            NodeRecord notInUseNode      = GetNode(nodeId, false);

            _nodeStore.updateRecord(inUseNode);

            Command.NodeCommand nodeCommand        = new Command.NodeCommand(inUseNode, notInUseNode);
            PropertyRecord      nodePropertyBlocks = new PropertyRecord(nodePropertyId);

            nodePropertyBlocks.NodeId = nodeId;
            Command.PropertyCommand nodePropertyCommand = new Command.PropertyCommand(_recordAccess.getIfLoaded(nodePropertyId).forReadingData(), nodePropertyBlocks);

            StoreIndexDescriptor nodeIndexDescriptor = forSchema(multiToken(_entityTokens, NODE, 1, 4, 6), EMPTY.ProviderDescriptor).withId(0);

            _indexingService.createIndexes(nodeIndexDescriptor);
            _indexingService.getIndexProxy(nodeIndexDescriptor.Schema()).awaitStoreScanCompleted(0, MILLISECONDS);

            long relId = 0;
            RelationshipRecord inUse        = GetRelationship(relId, true, ENTITY_TOKEN);
            Value relationshipPropertyValue = Values.of("da");
            long  propertyId            = CreateRelationshipProperty(inUse, relationshipPropertyValue, 1);
            RelationshipRecord notInUse = GetRelationship(relId, false, ENTITY_TOKEN);

            _relationshipStore.updateRecord(inUse);

            Command.RelationshipCommand relationshipCommand = new Command.RelationshipCommand(inUse, notInUse);
            PropertyRecord relationshipPropertyBlocks       = new PropertyRecord(propertyId);

            relationshipPropertyBlocks.RelId = relId;
            Command.PropertyCommand relationshipPropertyCommand = new Command.PropertyCommand(_recordAccess.getIfLoaded(propertyId).forReadingData(), relationshipPropertyBlocks);

            StoreIndexDescriptor relationshipIndexDescriptor = forSchema(multiToken(_entityTokens, RELATIONSHIP, 1, 4, 6), EMPTY.ProviderDescriptor).withId(1);

            _indexingService.createIndexes(relationshipIndexDescriptor);
            _indexingService.getIndexProxy(relationshipIndexDescriptor.Schema()).awaitStoreScanCompleted(0, MILLISECONDS);

            onlineIndexUpdates.Feed(NodeGroup(nodeCommand, nodePropertyCommand), RelationshipGroup(relationshipCommand, relationshipPropertyCommand));
            assertTrue(onlineIndexUpdates.HasUpdates());
            assertThat(onlineIndexUpdates, containsInAnyOrder(IndexEntryUpdate.remove(relId, relationshipIndexDescriptor, relationshipPropertyValue, null, null), IndexEntryUpdate.remove(nodeId, nodeIndexDescriptor, nodePropertyValue, null, null)));
        }
Esempio n. 4
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldUpdateCorrectIndexes() throws Exception
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
        public virtual void ShouldUpdateCorrectIndexes()
        {
            OnlineIndexUpdates onlineIndexUpdates = new OnlineIndexUpdates(_nodeStore, _relationshipStore, _indexingService, _propertyPhysicalToLogicalConverter);

            long relId = 0;
            RelationshipRecord inUse    = GetRelationship(relId, true, ENTITY_TOKEN);
            Value propertyValue         = Values.of("hej");
            Value propertyValue2        = Values.of("da");
            long  propertyId            = CreateRelationshipProperty(inUse, propertyValue, 1);
            long  propertyId2           = CreateRelationshipProperty(inUse, propertyValue2, 4);
            RelationshipRecord notInUse = GetRelationship(relId, false, ENTITY_TOKEN);

            _relationshipStore.updateRecord(inUse);

            Command.RelationshipCommand relationshipCommand = new Command.RelationshipCommand(inUse, notInUse);
            PropertyRecord propertyBlocks = new PropertyRecord(propertyId);

            propertyBlocks.RelId = relId;
            Command.PropertyCommand propertyCommand = new Command.PropertyCommand(_recordAccess.getIfLoaded(propertyId).forReadingData(), propertyBlocks);

            PropertyRecord propertyBlocks2 = new PropertyRecord(propertyId2);

            propertyBlocks2.RelId = relId;
            Command.PropertyCommand propertyCommand2 = new Command.PropertyCommand(_recordAccess.getIfLoaded(propertyId2).forReadingData(), propertyBlocks2);

            StoreIndexDescriptor indexDescriptor0 = forSchema(multiToken(_entityTokens, RELATIONSHIP, 1, 4, 6), EMPTY.ProviderDescriptor).withId(0);
            StoreIndexDescriptor indexDescriptor1 = forSchema(multiToken(_entityTokens, RELATIONSHIP, 2, 4, 6), EMPTY.ProviderDescriptor).withId(1);
            StoreIndexDescriptor indexDescriptor2 = forSchema(multiToken(new int[] { ENTITY_TOKEN, OTHER_ENTITY_TOKEN }, RELATIONSHIP, 1), EMPTY.ProviderDescriptor).withId(2);
            StoreIndexDescriptor indexDescriptor3 = forSchema(multiToken(new int[] { OTHER_ENTITY_TOKEN }, RELATIONSHIP, 1), EMPTY.ProviderDescriptor).withId(3);

            _indexingService.createIndexes(indexDescriptor0, indexDescriptor1, indexDescriptor2);
            _indexingService.getIndexProxy(indexDescriptor0.Schema()).awaitStoreScanCompleted(0, MILLISECONDS);
            _indexingService.getIndexProxy(indexDescriptor1.Schema()).awaitStoreScanCompleted(0, MILLISECONDS);
            _indexingService.getIndexProxy(indexDescriptor2.Schema()).awaitStoreScanCompleted(0, MILLISECONDS);

            onlineIndexUpdates.Feed(NodeGroup(null), RelationshipGroup(relationshipCommand, propertyCommand, propertyCommand2));
            assertTrue(onlineIndexUpdates.HasUpdates());
            assertThat(onlineIndexUpdates, containsInAnyOrder(IndexEntryUpdate.remove(relId, indexDescriptor0, propertyValue, propertyValue2, null), IndexEntryUpdate.remove(relId, indexDescriptor1, null, propertyValue2, null), IndexEntryUpdate.remove(relId, indexDescriptor2, propertyValue)));
            assertThat(onlineIndexUpdates, not(containsInAnyOrder(indexDescriptor3)));                     // This index is only for a different relationship type.
        }
Esempio n. 5
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
//ORIGINAL LINE: public void extractCommands(java.util.Collection<org.neo4j.storageengine.api.StorageCommand> commands) throws org.neo4j.internal.kernel.api.exceptions.TransactionFailureException
        public override void ExtractCommands(ICollection <StorageCommand> commands)
        {
            Debug.Assert(!_prepared, "Transaction has already been prepared");

            _integrityValidator.validateTransactionStartKnowledge(_lastCommittedTxWhenTransactionStarted);

            int noOfCommands = _recordChangeSet.changeSize() + (_neoStoreRecord != null ? _neoStoreRecord.changeSize() : 0);

            foreach (RecordAccess_RecordProxy <LabelTokenRecord, Void> record in _recordChangeSet.LabelTokenChanges.changes())
            {
                commands.Add(new Command.LabelTokenCommand(record.Before, record.ForReadingLinkage()));
            }
            foreach (RecordAccess_RecordProxy <RelationshipTypeTokenRecord, Void> record in _recordChangeSet.RelationshipTypeTokenChanges.changes())
            {
                commands.Add(new Command.RelationshipTypeTokenCommand(record.Before, record.ForReadingLinkage()));
            }
            foreach (RecordAccess_RecordProxy <PropertyKeyTokenRecord, Void> record in _recordChangeSet.PropertyKeyTokenChanges.changes())
            {
                commands.Add(new Command.PropertyKeyTokenCommand(record.Before, record.ForReadingLinkage()));
            }

            // Collect nodes, relationships, properties
            Command[] nodeCommands    = _emptyCommands;
            int       skippedCommands = 0;

            if (_recordChangeSet.NodeRecords.changeSize() > 0)
            {
                nodeCommands = new Command[_recordChangeSet.NodeRecords.changeSize()];
                int i = 0;
                foreach (RecordAccess_RecordProxy <NodeRecord, Void> change in _recordChangeSet.NodeRecords.changes())
                {
                    NodeRecord record = Prepared(change, _nodeStore);
                    _integrityValidator.validateNodeRecord(record);
                    nodeCommands[i++] = new Command.NodeCommand(change.Before, record);
                }
                Arrays.sort(nodeCommands, _commandComparator);
            }

            Command[] relCommands = _emptyCommands;
            if (_recordChangeSet.RelRecords.changeSize() > 0)
            {
                relCommands = new Command[_recordChangeSet.RelRecords.changeSize()];
                int i = 0;
                foreach (RecordAccess_RecordProxy <RelationshipRecord, Void> change in _recordChangeSet.RelRecords.changes())
                {
                    relCommands[i++] = new Command.RelationshipCommand(change.Before, Prepared(change, _relationshipStore));
                }
                Arrays.sort(relCommands, _commandComparator);
            }

            Command[] propCommands = _emptyCommands;
            if (_recordChangeSet.PropertyRecords.changeSize() > 0)
            {
                propCommands = new Command[_recordChangeSet.PropertyRecords.changeSize()];
                int i = 0;
                foreach (RecordAccess_RecordProxy <PropertyRecord, PrimitiveRecord> change in _recordChangeSet.PropertyRecords.changes())
                {
                    propCommands[i++] = new Command.PropertyCommand(change.Before, Prepared(change, _propertyStore));
                }
                Arrays.sort(propCommands, _commandComparator);
            }

            Command[] relGroupCommands = _emptyCommands;
            if (_recordChangeSet.RelGroupRecords.changeSize() > 0)
            {
                relGroupCommands = new Command[_recordChangeSet.RelGroupRecords.changeSize()];
                int i = 0;
                foreach (RecordAccess_RecordProxy <RelationshipGroupRecord, int> change in _recordChangeSet.RelGroupRecords.changes())
                {
                    if (change.Created && !change.ForReadingLinkage().inUse())
                    {
                        /*
                         * This is an edge case that may come up and which we must handle properly. Relationship groups are
                         * not managed by the tx state, since they are created as side effects rather than through
                         * direct calls. However, they differ from say, dynamic records, in that their management can happen
                         * through separate code paths. What we are interested in here is the following scenario.
                         * 0. A node has one less relationship that is required to transition to dense node. The relationships
                         *    it has belong to at least two different types
                         * 1. In the same tx, a relationship is added making the node dense and all the relationships of a type
                         *    are removed from that node. Regardless of the order these operations happen, the creation of the
                         *    relationship (and the transition of the node to dense) will happen first.
                         * 2. A relationship group will be created because of the transition to dense and then deleted because
                         *    all the relationships it would hold are no longer there. This results in a relationship group
                         *    command that appears in the tx as not in use. Depending on the final order of operations, this
                         *    can end up using an id that is higher than the highest id seen so far. This may not be a problem
                         *    for a single instance, but it can result in errors in cases where transactions are applied
                         *    externally, such as backup or HA.
                         *
                         * The way we deal with this issue here is by not issuing a command for that offending record. This is
                         * safe, since the record is not in use and never was, so the high id is not necessary to change and
                         * the store remains consistent.
                         */
                        skippedCommands++;
                        continue;
                    }
                    relGroupCommands[i++] = new Command.RelationshipGroupCommand(change.Before, Prepared(change, _relationshipGroupStore));
                }
                relGroupCommands = i < relGroupCommands.Length ? Arrays.copyOf(relGroupCommands, i) : relGroupCommands;
                Arrays.sort(relGroupCommands, _commandComparator);
            }

            AddFiltered(commands, Command.Mode.CREATE, propCommands, relCommands, relGroupCommands, nodeCommands);
            AddFiltered(commands, Command.Mode.UPDATE, propCommands, relCommands, relGroupCommands, nodeCommands);
            AddFiltered(commands, Command.Mode.DELETE, propCommands, relCommands, relGroupCommands, nodeCommands);

            if (_neoStoreRecord != null)
            {
                foreach (RecordAccess_RecordProxy <NeoStoreRecord, Void> change in _neoStoreRecord.changes())
                {
                    commands.Add(new Command.NeoStoreCommand(change.Before, change.ForReadingData()));
                }
            }
            //noinspection unchecked
            IList <Command>[] schemaChangeByMode = new System.Collections.IList[Command.Mode.values().length];
            for (int i = 0; i < schemaChangeByMode.Length; i++)
            {
                schemaChangeByMode[i] = new List <Command>();
            }
            foreach (RecordAccess_RecordProxy <SchemaRecord, SchemaRule> change in _recordChangeSet.SchemaRuleChanges.changes())
            {
                if (change.ForReadingLinkage().inUse())
                {
                    _integrityValidator.validateSchemaRule(change.AdditionalData);
                }
                Command.SchemaRuleCommand cmd = new Command.SchemaRuleCommand(change.Before, change.ForChangingData(), change.AdditionalData);
                schemaChangeByMode[cmd.Mode.ordinal()].Add(cmd);
            }
            commands.addAll(schemaChangeByMode[Command.Mode.DELETE.ordinal()]);
            commands.addAll(schemaChangeByMode[Command.Mode.CREATE.ordinal()]);
            commands.addAll(schemaChangeByMode[Command.Mode.UPDATE.ordinal()]);
            Debug.Assert(commands.Count == noOfCommands - skippedCommands, format("Expected %d final commands, got %d " + "instead, with %d skipped", noOfCommands, commands.Count, skippedCommands));

            _prepared = true;
        }
Esempio n. 6
0
        private EntityUpdates.Builder GatherUpdatesFromCommandsForRelationship(long relationshipId, Command.RelationshipCommand relationshipCommand, EntityCommandGrouper <Command.RelationshipCommand> .Cursor propertyCommands)
        {
            long reltypeBefore;
            long reltypeAfter;

            if (relationshipCommand != null)
            {
                reltypeBefore = relationshipCommand.Before.Type;
                reltypeAfter  = relationshipCommand.After.Type;
            }
            else
            {
                RelationshipRecord relationshipRecord = LoadRelationship(relationshipId);
                reltypeBefore = reltypeAfter = relationshipRecord.Type;
            }
            bool complete = ProvidesCompleteListOfProperties(relationshipCommand);

            EntityUpdates.Builder relationshipPropertyUpdates = EntityUpdates.forEntity(relationshipId, complete).withTokens(reltypeBefore).withTokensAfter(reltypeAfter);
            _converter.convertPropertyRecord(propertyCommands, relationshipPropertyUpdates);
            return(relationshipPropertyUpdates);
        }
Esempio n. 7
0
 private EntityCommandGrouper <Command.RelationshipCommand> .Cursor RelationshipGroup(Command.RelationshipCommand relationshipCommand, params Command.PropertyCommand[] propertyCommands)
 {
     return(Group(relationshipCommand, typeof(Command.RelationshipCommand), propertyCommands));
 }