public List<DynamicRecord> allocateFrom( SchemaRule rule ) { List<DynamicRecord> records = new ArrayList<>(); DynamicRecord record = getRecord( rule.getId(), nextRecord(), CHECK ); DynamicRecordAllocator recordAllocator = new ReusableRecordsCompositeAllocator( singleton( record ), this ); allocateRecordsFromBytes( records, SchemaRuleSerialization.serialize( rule ), recordAllocator ); return records; }
private Collection<DynamicRecord> asRecords( SchemaRule rule, boolean inUse ) { // Only used to transfer List<DynamicRecord> records = new ArrayList<>(); DynamicRecord dynamicRecord = new DynamicRecord( rule.getId() ); dynamicRecord.setInUse( inUse ); records.add( dynamicRecord ); return records; }
private void changeSchemaRule( SchemaRule rule, SchemaRule updatedRule ) { //Read the current record RecordProxy<SchemaRecord,SchemaRule> change = recordChangeSet.getSchemaRuleChanges() .getOrLoad( rule.getId(), rule ); SchemaRecord records = change.forReadingData(); //Register the change of the record RecordProxy<SchemaRecord,SchemaRule> recordChange = recordChangeSet.getSchemaRuleChanges() .setRecord( rule.getId(), records, updatedRule ); SchemaRecord dynamicRecords = recordChange.forChangingData(); //Update the record dynamicRecords.setDynamicRecords( schemaStore.allocateFrom( updatedRule ) ); }
void createSchemaRule( SchemaRule schemaRule ) { for ( DynamicRecord change : recordChangeSet.getSchemaRuleChanges() .create( schemaRule.getId(), schemaRule ) .forChangingData() ) { change.setInUse( true ); change.setCreated(); } }
void dropSchemaRule( SchemaRule rule ) { RecordProxy<SchemaRecord, SchemaRule> change = recordChangeSet.getSchemaRuleChanges().getOrLoad( rule.getId(), rule ); SchemaRecord records = change.forChangingData(); for ( DynamicRecord record : records ) { record.setInUse( false ); } records.setInUse( false ); }
@Test public void addRemoveIndexes() { Collection<SchemaRule> rules = asList( hans, witch, gretel, robot ); SchemaCache cache = new SchemaCache( new ConstraintSemantics(), rules, IndexProviderMap.EMPTY ); StoreIndexDescriptor rule1 = newIndexRule( 10, 11, 12 ); StoreIndexDescriptor rule2 = newIndexRule( 13, 14, 15 ); cache.addSchemaRule( rule1 ); cache.addSchemaRule( rule2 ); cache.removeSchemaRule( hans.getId() ); cache.removeSchemaRule( witch.getId() ); assertEquals( asSet( gretel, rule1, rule2 ), Iterables.asSet( cache.indexDescriptors() ) ); assertEquals( asSet( robot ), Iterables.asSet( cache.constraintRules() ) ); }
@Test public void shouldDropUniquenessConstraintWhereConstraintRecordIsMissing() throws Exception { // given try ( Transaction tx = db.beginTx() ) { db.schema().constraintFor( label ).assertPropertyIsUnique( key ).create(); tx.success(); } // when intentionally breaking the schema by setting the backing index rule to unused RecordStorageEngine storageEngine = db.getDependencyResolver().resolveDependency( RecordStorageEngine.class ); SchemaStore schemaStore = storageEngine.testAccessNeoStores().getSchemaStore(); SchemaRule indexRule = single( filter( rule -> rule instanceof ConstraintRule, schemaStore.loadAllSchemaRules() ) ); setSchemaRecordNotInUse( schemaStore, indexRule.getId() ); // At this point the SchemaCache doesn't know about this change so we have to reload it storageEngine.loadSchemaCache(); try ( Transaction tx = db.beginTx() ) { // We don't use single() here, because it is okay for the schema cache reload to clean up after us. db.schema().getConstraints( label ).forEach( ConstraintDefinition::drop ); db.schema().getIndexes( label ).forEach( IndexDefinition::drop ); tx.success(); } // then try ( Transaction ignore = db.beginTx() ) { assertFalse( db.schema().getConstraints().iterator().hasNext() ); assertFalse( db.schema().getIndexes().iterator().hasNext() ); } }
@Test public void shouldDropUniquenessConstraintWithBackingIndexNotInUse() { // given try ( Transaction tx = db.beginTx() ) { db.schema().constraintFor( label ).assertPropertyIsUnique( key ).create(); tx.success(); } // when intentionally breaking the schema by setting the backing index rule to unused RecordStorageEngine storageEngine = db.getDependencyResolver().resolveDependency( RecordStorageEngine.class ); SchemaStore schemaStore = storageEngine.testAccessNeoStores().getSchemaStore(); SchemaRule indexRule = single( filter( rule -> rule instanceof StoreIndexDescriptor, schemaStore.loadAllSchemaRules() ) ); setSchemaRecordNotInUse( schemaStore, indexRule.getId() ); // At this point the SchemaCache doesn't know about this change so we have to reload it storageEngine.loadSchemaCache(); try ( Transaction tx = db.beginTx() ) { single( db.schema().getConstraints( label ).iterator() ).drop(); tx.success(); } // then try ( Transaction ignore = db.beginTx() ) { assertFalse( db.schema().getConstraints().iterator().hasNext() ); assertFalse( db.schema().getIndexes().iterator().hasNext() ); } }
SchemaStore schemaStore = storageEngine.testAccessNeoStores().getSchemaStore(); SchemaRule constraintRule = single( filter( rule -> rule instanceof ConstraintRule, schemaStore.loadAllSchemaRules() ) ); setSchemaRecordNotInUse( schemaStore, constraintRule.getId() ); SchemaRule indexRule = single( filter( rule -> rule instanceof StoreIndexDescriptor, schemaStore.loadAllSchemaRules() ) ); setOwnerNull( schemaStore, (StoreIndexDescriptor) indexRule );
public List<DynamicRecord> allocateFrom( SchemaRule rule ) { List<DynamicRecord> records = new ArrayList<>(); DynamicRecord record = getRecord( rule.getId(), nextRecord(), CHECK ); DynamicRecordAllocator recordAllocator = new ReusableRecordsCompositeAllocator( singleton( record ), this ); allocateRecordsFromBytes( records, SchemaRuleSerialization.serialize( rule ), recordAllocator ); return records; }
private void changeSchemaRule( SchemaRule rule, SchemaRule updatedRule ) { //Read the current record RecordProxy<SchemaRecord,SchemaRule> change = recordChangeSet.getSchemaRuleChanges() .getOrLoad( rule.getId(), rule ); SchemaRecord records = change.forReadingData(); //Register the change of the record RecordProxy<SchemaRecord,SchemaRule> recordChange = recordChangeSet.getSchemaRuleChanges() .setRecord( rule.getId(), records, updatedRule ); SchemaRecord dynamicRecords = recordChange.forChangingData(); //Update the record dynamicRecords.setDynamicRecords( schemaStore.allocateFrom( updatedRule ) ); }
void createSchemaRule( SchemaRule schemaRule ) { for ( DynamicRecord change : recordChangeSet.getSchemaRuleChanges() .create( schemaRule.getId(), schemaRule ) .forChangingData() ) { change.setInUse( true ); change.setCreated(); } }
void dropSchemaRule( SchemaRule rule ) { RecordProxy<SchemaRecord, SchemaRule> change = recordChangeSet.getSchemaRuleChanges().getOrLoad( rule.getId(), rule ); SchemaRecord records = change.forChangingData(); for ( DynamicRecord record : records ) { record.setInUse( false ); } records.setInUse( false ); }