public override IDictionary <string, object> GetProperties(params string[] names) { Objects.requireNonNull(names, "Properties keys should be not null array."); if (names.Length == 0) { return(Collections.emptyMap()); } KernelTransaction transaction = SafeAcquireTransaction(); int itemsToReturn = names.Length; IDictionary <string, object> properties = new Dictionary <string, object>(itemsToReturn); TokenRead token = transaction.TokenRead(); //Find ids, note we are betting on that the number of keys //is small enough not to use a set here. int[] propertyIds = new int[itemsToReturn]; for (int i = 0; i < itemsToReturn; i++) { string key = names[i]; if (string.ReferenceEquals(key, null)) { throw new System.NullReferenceException(string.Format("Key {0:D} was null", i)); } propertyIds[i] = token.PropertyKey(key); } PropertyCursor propertyCursor = transaction.AmbientPropertyCursor(); transaction.DataRead().graphProperties(propertyCursor); int propertiesToFind = itemsToReturn; while (propertiesToFind > 0 && propertyCursor.Next()) { //Do a linear check if this is a property we are interested in. int currentKey = propertyCursor.PropertyKey(); for (int i = 0; i < itemsToReturn; i++) { if (propertyIds[i] == currentKey) { properties[names[i]] = propertyCursor.PropertyValue().asObjectCopy(); propertiesToFind--; break; } } } return(properties); }
private Value[] GetValueTuple(NodeCursor node, PropertyCursor propertyCursor, int changedPropertyKeyId, Value changedValue, int[] indexPropertyIds, MutableIntObjectMap <Value> materializedValues) { Value[] values = new Value[indexPropertyIds.Length]; int missing = 0; // First get whatever values we already have on the stack, like the value change that provoked this update in the first place // and already loaded values that we can get from the map of materialized values. for (int k = 0; k < indexPropertyIds.Length; k++) { values[k] = indexPropertyIds[k] == changedPropertyKeyId ? changedValue : materializedValues.get(indexPropertyIds[k]); if (values[k] == null) { missing++; } } // If we couldn't get all values that we wanted we need to load from the node. While we're loading values // we'll place those values in the map so that other index updates from this change can just used them. if (missing > 0) { node.Properties(propertyCursor); while (missing > 0 && propertyCursor.Next()) { int k = ArrayUtils.IndexOf(indexPropertyIds, propertyCursor.PropertyKey()); if (k >= 0 && values[k] == null) { int propertyKeyId = indexPropertyIds[k]; bool thisIsTheChangedProperty = propertyKeyId == changedPropertyKeyId; values[k] = thisIsTheChangedProperty ? changedValue : propertyCursor.PropertyValue(); if (!thisIsTheChangedProperty) { materializedValues.put(propertyKeyId, values[k]); } missing--; } } } return(values); }
private bool HasProperties(NodeCursor cursor, PropertyCursor props) { cursor.Properties(props); return(props.Next()); }
private bool HasProperties(NodeCursor node, PropertyCursor props) { node.Properties(props); return(props.Next()); }