Beispiel #1
0
        private int GetOrAssignId(MutableObjectIntMap <string> stringToId, MutableIntObjectMap <string> idToString, AtomicInteger nextId, string @string)
        {
            if (string.ReferenceEquals(@string, null))
            {
                return(-1);
            }

            if (stringToId.containsKey(@string))
            {
                return(stringToId.get(@string));
            }

            int id = nextId.incrementAndGet();

            if (id > HighestPossibleId || stringToId.size() >= HighestPossibleId)
            {
                throw new System.InvalidOperationException(format("Modifying more than %d indexes or keys in a single transaction is not supported", HighestPossibleId + 1));
            }

            stringToId.put(@string, id);
            idToString.put(id, @string);
            return(id);
        }
Beispiel #2
0
        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);
        }