public void index(Record record) {
   final Long recordId = record.getId();
   if (record.isActive()) {
     final Record anotherRecord = records.putIfAbsent(recordId, record);
     if (anotherRecord != null) {
       record = anotherRecord;
     } else {
       size.incrementAndGet();
     }
   } else {
     remove(record);
   }
   if (indexValue != null) {
     Long newValueIndex = -1L;
     if (record.isActive() && record.hasValueData()) {
       newValueIndex = (long) record.getValueData().hashCode();
     }
     indexValue.index(newValueIndex, record);
   }
   Long[] indexValues = record.getIndexes();
   if (indexValues != null && hasIndexedAttributes) {
     byte[] indexTypes = record.getIndexTypes();
     if (indexTypes == null || indexValues.length != indexTypes.length) {
       throw new IllegalArgumentException(
           "index and types don't match " + Arrays.toString(indexTypes));
     }
     Collection<Index> indexes = mapIndexes.values();
     for (Index index : indexes) {
       if (indexValues.length > index.getAttributeIndex()) {
         Long newValue = indexValues[index.getAttributeIndex()];
         index.index(newValue, record);
       }
     }
   }
 }
 public void newRecordIndex(Long newValue, Record record) {
   long recordId = record.getId();
   ConcurrentMap<Long, Record> records = mapRecords.get(newValue);
   if (records == null) {
     records = new ConcurrentHashMap<Long, Record>(1, 0.75f, 1);
     mapRecords.put(newValue, records);
     sortedSet.add(newValue);
   }
   records.put(recordId, record);
 }
 public void remove(Record record) {
   Record existingRecord = records.remove(record.getId());
   if (existingRecord != null) {
     size.decrementAndGet();
   }
 }