use of com.cinchapi.concourse.thrift.TObject in project concourse by cinchapi.
the class Stores method find.
/**
* Find the records that contain values that are stored for {@code key} and
* satisfy {@code operator} in relation to the specified {@code values} at
* {@code timestamp}.
* <p>
* If the {@code key} is primitive, the store lookup is usually a simple
* {@link Store#find(String, Operator, TObject[]) find}. However, if the key
* is a navigation key, this method will process it by
* {@link #browse(Store, String) browsing} the destination values and
* checking the operator validity of each if and only if the {@code store}
* is an {@link AtomicOperation} or {@link AtomicSupport supports} starting
* one.
* </p>
*
* @param store
* @param timestamp
* @param key
* @param operator
* @param values
* @return the records that satisfy the query
*/
public static Set<Long> find(Store store, long timestamp, String key, Operator operator, TObject... values) {
for (int i = 0; i < values.length; ++i) {
TObject value = values[i];
if (value.getType() == Type.FUNCTION) {
Function function = (Function) Convert.thriftToJava(value);
TemporalFunction func = (TemporalFunction) function;
String method = Calculations.alias(function.operation());
ArrayBuilder<Object> args = ArrayBuilder.builder();
method += "Key";
args.add(function.key());
if (function instanceof KeyRecordsFunction || function instanceof KeyConditionFunction) {
method += "Records";
Collection<Long> records = function instanceof KeyRecordsFunction ? ((KeyRecordsFunction) function).source() : Finder.instance().visit(((KeyConditionFunction) function).source(), store);
args.add(records);
} else if (!(function instanceof IndexFunction)) {
throw new IllegalStateException("Invalid function value");
}
method += "Atomic";
args.add(func.timestamp());
args.add(store);
values[i] = Convert.javaToThrift(Reflection.callStatic(Operations.class, method, args.build()));
}
}
if (Keys.isNavigationKey(key)) {
Map<TObject, Set<Long>> index = timestamp == Time.NONE ? browse(store, key) : browse(store, key, timestamp);
Set<Long> records = index.entrySet().stream().filter(e -> e.getKey().is(operator, values)).map(e -> e.getValue()).flatMap(Set::stream).collect(Collectors.toCollection(LinkedHashSet::new));
return records;
} else if (Keys.isFunctionKey(key)) {
Set<Long> records = Sets.newLinkedHashSet();
for (long record : store.getAllRecords()) {
Set<TObject> aggregate = select(store, key, record, timestamp);
for (TObject tobject : aggregate) {
if (tobject.is(operator, values)) {
records.add(record);
break;
}
}
}
return records;
} else {
return timestamp == Time.NONE ? store.find(key, operator, values) : store.find(timestamp, key, operator, values);
}
}
use of com.cinchapi.concourse.thrift.TObject in project concourse by cinchapi.
the class Value method fromByteBuffer.
/**
* Return the Value encoded in {@code bytes} so long as those bytes adhere
* to the format specified by the {@link #getBytes()} method.
*
* @param bytes
* @return the Value
*/
public static Value fromByteBuffer(ByteBuffer bytes) {
Type type = Type.values()[bytes.get()];
TObject data = createTObject(bytes, type);
return new Value(data);
}
use of com.cinchapi.concourse.thrift.TObject in project concourse by cinchapi.
the class Operations method browseNavigationKeyOptionalAtomic.
/**
* Perform "browse" functionality on a navigation key.
*
* @param key
* @param timestamp
* @param store
* @return a mapping from each possible destination value for a given
* navigation {@code key} to the records where the navigation could
* begin to retrieve the value by selecting the navigation
* {@code key}
*/
public static Map<TObject, Set<Long>> browseNavigationKeyOptionalAtomic(String key, long timestamp, Store store) {
String[] toks = key.split("\\.");
if (toks.length == 1) {
return timestamp == Time.NONE ? store.browse(key) : store.browse(key, timestamp);
} else {
String start = toks[0];
StringBuilder $key = new StringBuilder();
for (int i = 1; i < toks.length - 1; ++i) {
$key.append(toks[i]).append('.');
}
$key.append(toks[toks.length - 1]);
Map<TObject, Set<Long>> root = timestamp == Time.NONE ? store.browse(start) : store.browse(start, timestamp);
Map<TObject, Set<Long>> index = Maps.newLinkedHashMap();
root.entrySet().stream().filter(e -> e.getKey().getType() == Type.LINK).forEach(entry -> {
Link link = (Link) Convert.thriftToJava(entry.getKey());
Set<Long> nodes = entry.getValue();
for (long node : nodes) {
Set<TObject> values = traverseKeyRecordOptionalAtomic($key.toString(), link.longValue(), timestamp, store);
for (TObject value : values) {
index.computeIfAbsent(value, ignore -> Sets.newLinkedHashSet()).add(node);
}
}
});
return index;
}
}
use of com.cinchapi.concourse.thrift.TObject in project concourse by cinchapi.
the class Operations method calculateKeyAtomic.
/**
* Use the provided {@link AtomicOperation atomic} operation to perform the
* specified {@code calculation} across the {@code key} at
* {@code timestamp}.
*
* @param key the field name
* @param timestamp the selection timestamp
* @param result the running result
* @param store the {@link AtomicOperation} to use
* @param calculation the calculation logic
* @return the result after applying the {@code calculation}
*/
private static Number calculateKeyAtomic(String key, long timestamp, Number result, Store store, KeyCalculation calculation) {
checkAtomicity(store, timestamp);
Map<TObject, Set<Long>> data = Stores.browse(store, key, timestamp);
for (Entry<TObject, Set<Long>> entry : data.entrySet()) {
TObject tobject = entry.getKey();
Set<Long> records = entry.getValue();
Object value = Convert.thriftToJava(tobject);
Calculations.checkCalculatable(value);
result = calculation.calculate(result, (Number) value, records);
}
return result;
}
use of com.cinchapi.concourse.thrift.TObject in project concourse by cinchapi.
the class Operations method clearRecordAtomic.
/**
* Do the work to remove all the data from {@code record} using the
* specified {@code atomic} operation.
*
* @param record
* @param atomic
*/
public static void clearRecordAtomic(long record, AtomicOperation atomic) {
Map<String, Set<TObject>> values = atomic.select(record);
for (Map.Entry<String, Set<TObject>> entry : values.entrySet()) {
String key = entry.getKey();
Set<TObject> valueSet = entry.getValue();
for (TObject value : valueSet) {
atomic.remove(key, value, record);
}
}
}
Aggregations