Indexes: Indexing Compare Exchange Values
-
Compare exchange values can be loaded within an index using the value's key.
-
The index will update when the compare exchange value is updated, as well as when documents are modified in the indexed collection(s).
-
In this page:
Syntax
When creating an index using AbstractIndexCreationTask
, use the method
LoadCompareExchangeValue()
to load a compare exchange value by its key.
//Load one compare exchange value
T LoadCompareExchangeValue<T>(string key);
//Load multiple compare exchange values
T[] LoadCompareExchangeValue<T>(IEnumerable<string> keys);
For javascript indexes, use the method cmpxchg(<key>)
.
Parameter | Type | Description |
---|---|---|
key | string |
The key of a particular compare exchange value. |
keys | IEnumerable<string> |
The keys of multiple compare exchange values. |
Examples
These indexes map the rooms in a hotel, as well as compare exchange values representing the guests in those rooms.
private class Compare_Exchange_Index : AbstractIndexCreationTask<HotelRoom>
{
public class Result
{
public string Room;
public string Guests;
}
public Compare_Exchange_Index()
{
Map = HotelRooms => from room in HotelRooms
let guests = LoadCompareExchangeValue<string>(room.RoomID)
select new Result
{
Room = room.RoomID,
Guests = guests
};
}
}
private class Compare_Exchange_JS_Index : AbstractJavaScriptIndexCreationTask
{
public Compare_Exchange_JS_Index()
{
Maps = new HashSet<string>
{
@"map('HotelRooms', function (room) {
var guests = cmpxchg(room.RoomID);
return {
RoomID: room.RoomID,
Guests: guests
};
})",
};
}
}
Querying the Index
// Return all vacant hotel rooms
List<HotelRoom> vacantRooms = session
.Query<HotelRoom, Compare_Exchange_Index>()
.Where(x => RavenQuery.CmpXchg<string>(x.RoomID) == null)
.OfType<HotelRoom>()
.ToList();
// Return all vacant hotel rooms
List<HotelRoom> vacantRooms = await asyncSession
.Query<HotelRoom, Compare_Exchange_Index>()
.Where(x => RavenQuery.CmpXchg<string>(x.RoomID) == null)
.OfType<HotelRoom>()
.ToListAsync();
// Return the room occupied by VIP guests
List<HotelRoom> VIPRooms = session
.Advanced.RawQuery<HotelRoom>(
@"from Hotelrooms as room
where room.Guests == cmpxchg('VIP')"
)
.ToList();