@Override public void ensureIndex(CompositeIndexField queryFields, boolean isUnique, IndexField... valueFields) throws JasDBStorageException { BagConnector connector = RemoteConnectorFactory.createConnector(nodeInformation, BagConnector.class); KeyInfo keyInfo = new KeyInfoImpl(queryFields.getIndexFields(), Lists.newArrayList(valueFields)); connector.createIndex(context, instance, meta.getName(), new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), -1), isUnique); }
@Override public void removeIndex(String bagName, String keyName) throws JasDBStorageException { Index index = getIndex(bagName, keyName); if(index != null) { Map<String, Index> bagIndexes = indexes.get(bagName); bagIndexes.remove(keyName); KeyInfo keyInfo = index.getKeyInfo(); IndexDefinition definition = new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), index.getIndexType()); metadataStore.removeBagIndex(instanceId, bagName, definition); index.removeIndex(); } else { throw new JasDBStorageException("Could not remove index, does not exist"); } }
private RestEntity loadIndexes(String instanceId, String bagName) throws JasDBException { IndexManager indexManager = getIndexManager(instanceId); StatRecord getIndexCounter = StatisticsMonitor.createRecord("getIndexes"); Map<String, Index> indexes = indexManager.getIndexes(bagName); getIndexCounter.stop(); List<IndexEntry> indexEntries = new ArrayList<>(indexes.size()); for(Index index : indexes.values()) { KeyInfo keyInfo = index.getKeyInfo(); IndexEntry entry = new IndexEntry(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), index.hasUniqueConstraint(), index.getIndexType()); entry.setMemorySize(index.getMemoryManager().getTotalMemoryUsage()); indexEntries.add(entry); } return new IndexCollection(indexEntries); }
private Index createInStore(String bagName, KeyInfo keyInfo) throws JasDBStorageException { if(!indexes.containsKey(bagName)) { loadIndexes(bagName); } Map<String, Index> bagIndexes = this.indexes.get(bagName); if(bagIndexes != null && !bagIndexes.containsKey(keyInfo.getKeyName())) { File indexFile = createIndexFile(bagName, keyInfo.getKeyName(), false); try { Index index = new BTreeIndex(indexFile, keyInfo); configureIndex(IndexTypes.BTREE, index); IndexDefinition definition = new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), index.getIndexType()); metadataStore.addBagIndex(instanceId, bagName, definition); bagIndexes.put(keyInfo.getKeyName(), index); return index; } catch(ConfigurationException e) { throw new JasDBStorageException("Unable to create index, configuration error", e); } } else if(bagIndexes != null){ return bagIndexes.get(keyInfo.getKeyName()); } else { return null; } }
private void initializeIndex(Index index) throws JasDBStorageException { KeyInfo keyInfo = index.getKeyInfo(); IndexDefinition definition = new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), index.getIndexType()); if(metadataStore.containsIndex(instanceId, bagName, definition)) { try { indexRebuilder.submit(new IndexScanAndRecovery(index, getRecordWriter().readAllRecords(), true)).get(); } catch(ExecutionException | InterruptedException e) { throw new JasDBStorageException("Unable to initialize index, index rebuild failed", e); } } else { throw new JasDBStorageException("Cannot initialize index, does not exist in store"); } }
@Override public void ensureIndex(IndexField indexField, boolean isUnique, IndexField... valueFields) throws JasDBStorageException { BagConnector connector = RemoteConnectorFactory.createConnector(nodeInformation, BagConnector.class); KeyInfo keyInfo = new KeyInfoImpl(indexField, valueFields); connector.createIndex(context, instance, meta.getName(), new IndexDefinition(keyInfo.getKeyName(), keyInfo.keyAsHeader(), keyInfo.valueAsHeader(), -1), isUnique); }
public static IndexHeader loadAndValidateHeader(DataBlock dataBlock, KeyInfo keyInfo) throws JasDBStorageException, IOException { DataBlockHeader dataBlockHeader = dataBlock.getHeader(); int version = dataBlockHeader.getInt(VERSION_HEADER_INDEX); int type = dataBlockHeader.getInt(TYPE_HEADER_INDEX); int pageSize = dataBlockHeader.getInt(PAGE_SIZE_INDEX); long count = dataBlockHeader.getLong(COUNT_INDEX); DataBlockResult<byte[]> keyResult = dataBlock.loadBytes(0); DataBlockResult<byte[]> keyValueResult = dataBlock.loadBytes(keyResult.getNextOffset()); if(Arrays.binarySearch(supportedVersions, version) == -1) { throw new JasDBStorageException("Version of found index is not supported by this version"); } else if(type != BTREE_INDEX_TYPE_ID) { throw new JasDBStorageException("Index type is not supported or invalid"); } else if(!keyInfo.keyAsHeader().equals(new String(keyResult.getValue()))) { throw new JasDBStorageException("Key information in index does not match specification on the storage metadata"); } else if(!keyInfo.valueAsHeader().equals(new String(keyValueResult.getValue()))) { throw new JasDBStorageException("Key information in index does not match specification on the storage metadata"); } else { return new BtreeIndexHeader(version, pageSize, dataBlock.size(), keyInfo, count); } }
public static IndexHeader createHeader(DataBlock headerBlock, int pageSize, long count, KeyInfo keyInfo) throws JasDBStorageException, IOException { String headerInfo = keyInfo.keyAsHeader(); byte[] headerInfoBytes = headerInfo.getBytes(); String valueHeaderInfo = keyInfo.valueAsHeader(); byte[] valueHeaderInfoBytes = valueHeaderInfo.getBytes(); DataBlockHeader dataBlockHeader = headerBlock.getHeader(); dataBlockHeader.putInt(VERSION_HEADER_INDEX, INDEX_VERSION); dataBlockHeader.putInt(TYPE_HEADER_INDEX, BTREE_INDEX_TYPE_ID); dataBlockHeader.putInt(PAGE_SIZE_INDEX, pageSize); dataBlockHeader.putLong(COUNT_INDEX, count); headerBlock.reset(); headerBlock.writeBytes(headerInfoBytes); headerBlock.writeBytes(valueHeaderInfoBytes); headerBlock.flush(); return new BtreeIndexHeader(INDEX_VERSION, pageSize, headerBlock.size(), keyInfo, count); }