private void setFieldValueInIndex(int rowIndex, int fieldId, Value oldValue, Value value) throws DriverException { if (indexEditionManager != null) { try { for (DataSourceIndex index : indexEditionManager.getDataSourceIndexes()) { String[] idxFields = index.getFieldNames(); if (idxFields.length == 1) { if (idxFields[0].equals(getMetadata().getFieldName(fieldId))) { index.setFieldValue(oldValue, value, rowIndex); } } else { Value[] oldSet = new Value[idxFields.length]; Value[] newSet = new Value[idxFields.length]; String fieldName = getFieldName(fieldId); for (int i = 0; i < idxFields.length; i++) { if (idxFields[i].equals(fieldName)) { oldSet[i] = oldValue; newSet[i] = value; } else { oldSet[i] = getFieldValue(rowIndex, getFieldIndexByName(idxFields[i])); newSet[i] = oldSet[i]; } } index.setFieldValue( ValueFactory.createValue(oldSet), ValueFactory.createValue(newSet), rowIndex); } } } catch (IndexException e) { throw new DriverException(e); } } }
private void insertInIndex(Value[] values, int rowIndex) throws DriverException { if (indexEditionManager != null) { try { for (DataSourceIndex index : indexEditionManager.getDataSourceIndexes()) { Metadata metadata = getMetadata(); String[] idxFields = index.getFieldNames(); if (idxFields.length == 1) { for (int i = 0; i < metadata.getFieldCount(); i++) { if (metadata.getFieldName(i).equals(idxFields[0])) { index.insertRow(values[i], rowIndex); } } } else { Value[] toInsert = new Value[idxFields.length]; for (int i = 0; i < metadata.getFieldCount(); i++) { for (int j = 0; j < idxFields.length; j++) { if (metadata.getFieldName(i).equals(idxFields[j])) { toInsert[j] = values[i]; } } index.insertRow(ValueFactory.createValue(values), rowIndex); } } } } catch (IndexException e) { throw new DriverException("Cannot update index", e); } } }
private void deleteInIndex(int rowIndex) throws DriverException { if (indexEditionManager != null) { try { for (DataSourceIndex index : indexEditionManager.getDataSourceIndexes()) { Metadata metadata = getMetadata(); String[] idxFields = index.getFieldNames(); if (idxFields.length == 1) { for (int i = 0; i < metadata.getFieldCount(); i++) { if (metadata.getFieldName(i).equals(idxFields[0])) { Value v = getFieldValue(rowIndex, i); index.deleteRow(v, rowIndex); } } } else { Value[] toInsert = new Value[idxFields.length]; for (int i = 0; i < metadata.getFieldCount(); i++) { for (int j = 0; j < idxFields.length; j++) { if (metadata.getFieldName(i).equals(idxFields[j])) { toInsert[j] = getFieldValue(rowIndex, i); } } index.deleteRow(ValueFactory.createValue(toInsert), rowIndex); } } } } catch (IndexException e) { throw new DriverException(e); } } }
@Override public void syncWithSource() throws DriverException { getDataSource().syncWithSource(); indexEditionManager.cancel(); freeResources(); initialize(); editionListenerSupport.callSync(); }
@Override public void close() throws DriverException { freeResources(); getDataSource().close(); indexEditionManager.cancel(); SourceManager sm = getDataSourceFactory().getSourceManager(); sm.removeCommitListener(this); }
@Override public Iterator<Integer> queryIndex(IndexQuery indexQuery) throws DriverException { if (!isModified()) { return getDataSource().queryIndex(indexQuery); } else { try { int[] result = indexEditionManager.query(indexQuery); if (result == null) { return new FullIterator(this); } else { return new ResultIterator(result); } } catch (IndexException e) { throw new DriverException("Cannot access modified index", e); } catch (IndexQueryException e) { throw new DriverException("Cannot query the index", e); } } }
@Override public void commit() throws DriverException, NonEditableDataSourceException { if (!getDriver().isCommitable()) { throw new NonEditableDataSourceException("The driver has no write capabilities"); } if (commiter != null) { SourceManager dsm = getDataSourceFactory().getSourceManager(); dsm.fireIsCommiting(getName(), this); boolean rebuildIndexes = commiter.commit( rowsAddresses, getFieldNames(), getSchemaActions(), editionActions, deletedPKs, this); dsm.fireCommitDone(getName()); try { indexEditionManager.commit(rebuildIndexes); } catch (DriverException e) { throw new DriverException("Cannot update indexes", e); } } else { throw new UnsupportedOperationException("DataSource not editable"); } }