Improve LookupByKey , update docs

This commit is contained in:
TGIshib
2016-08-22 18:10:52 +03:00
parent fa74ce6d16
commit 9f16090f90
9 changed files with 173 additions and 64 deletions

View File

@@ -50,7 +50,7 @@ namespace FlatBuffers.Test
Monster.StartMonster(fbb);
Monster.AddName(fbb, names[2]);
off[2] = Monster.EndMonster(fbb);
var sortMons = Monster.CreateMySortedTableVector(fbb, off);
var sortMons = Monster.CreateMySortedVectorOfTables(fbb, off);
// We set up the same values as monsterdata.json:
@@ -118,15 +118,14 @@ namespace FlatBuffers.Test
Assert.AreEqual(monster.Mana, (short)150);
// Accessing a vector of sorted by the key tables
Monster[] monsters = { monster.GetTestarrayoftables(0), monster.GetTestarrayoftables(1), monster.GetTestarrayoftables(2) };
Assert.AreEqual(monster.GetTestarrayoftables(0).Name, "Barney");
Assert.AreEqual(monster.GetTestarrayoftables(1).Name, "Frodo");
Assert.AreEqual(monster.GetTestarrayoftables(2).Name, "Wilma");
// Example of searching for a table by the key
Assert.IsTrue(Monster.LookupByKey(monsters, "Frodo") != null);
Assert.IsTrue(Monster.LookupByKey(monsters, "Barney") != null);
Assert.IsTrue(Monster.LookupByKey(monsters, "Wilma") != null);
Assert.IsTrue(Monster.LookupByKey(sortMons, "Frodo", fbb.DataBuffer) != null);
Assert.IsTrue(Monster.LookupByKey(sortMons, "Barney", fbb.DataBuffer) != null);
Assert.IsTrue(Monster.LookupByKey(sortMons, "Wilma", fbb.DataBuffer)!= null);
// testType is an existing field and mutating it should succeed
Assert.AreEqual(monster.TestType, Any.Monster);

View File

@@ -62,7 +62,7 @@ class JavaTest {
Monster.startMonster(fbb);
Monster.addName(fbb, names[2]);
off[2] = Monster.endMonster(fbb);
int sortMons = fbb.createSortedTableVector(new Monster(), off);
int sortMons = fbb.createSortedVectorOfTables(new Monster(), off);
// We set up the same values as monsterdata.json:
@@ -137,15 +137,14 @@ class JavaTest {
TestEq(monster.mana(), (short)150);
// Accessing a vector of sorted by the key tables
Monster[] monsters = { monster.testarrayoftables(0), monster.testarrayoftables(1), monster.testarrayoftables(2) };
TestEq(monster.testarrayoftables(0).name(), "Barney");
TestEq(monster.testarrayoftables(1).name(), "Frodo");
TestEq(monster.testarrayoftables(2).name(), "Wilma");
// Example of searching for a table by the key
TestEq(Monster.lookupByKey(monsters, "Frodo").name(), "Frodo");
TestEq(Monster.lookupByKey(monsters, "Barney").name(), "Barney");
TestEq(Monster.lookupByKey(monsters, "Wilma").name(), "Wilma");
TestEq(Monster.lookupByKey(sortMons, "Frodo", fbb.dataBuffer()).name(), "Frodo");
TestEq(Monster.lookupByKey(sortMons, "Barney", fbb.dataBuffer()).name(), "Barney");
TestEq(Monster.lookupByKey(sortMons, "Wilma", fbb.dataBuffer()).name(), "Wilma");
// testType is an existing field and mutating it should succeed
TestEq(monster.testType(), (byte)Any.Monster);

View File

@@ -130,24 +130,26 @@ public sealed class Monster : Table {
}
public static void FinishMonsterBuffer(FlatBufferBuilder builder, Offset<Monster> offset) { builder.Finish(offset.Value, "MONS"); }
public static VectorOffset CreateMySortedTableVector(FlatBufferBuilder builder, Offset<Monster>[] offsets) {
public static VectorOffset CreateMySortedVectorOfTables(FlatBufferBuilder builder, Offset<Monster>[] offsets) {
Array.Sort(offsets, (Offset<Monster> o1, Offset<Monster> o2) => CompareStrings(__offset(10, o1.Value, builder.DataBuffer), __offset(10, o2.Value, builder.DataBuffer), builder.DataBuffer));
return builder.CreateVectorOfTables(offsets);
}
public static Monster LookupByKey(Monster[] tables, string key) {
int span = tables.Length, start = 0;
public static Monster LookupByKey(VectorOffset vectorOffset, string key, ByteBuffer bb) {
int vectorLocation = bb.Length - vectorOffset.Value;
int span = bb.GetInt(vectorLocation), middle, start = 0, comp, tableOffset;
vectorLocation += 4;
while (span != 0) {
int middle = span / 2;
Monster table = tables[start + middle];
int comp = table.Name.CompareTo(key);
tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);
comp = CompareStrings(__offset(10, bb.Length - tableOffset, bb), key, bb);
if (comp > 0) span = middle;
else if (comp < 0) {
middle++;
start += middle;
span -= middle;
}
else return table;
else return new Monster().__init(tableOffset, bb);
}
return null;
}

View File

@@ -139,19 +139,21 @@ public final class Monster extends Table {
@Override
protected int keysCompare(Integer o1, Integer o2, ByteBuffer _bb) { return compareStrings(__offset(10, o1, _bb), __offset(10, o2, _bb), _bb); }
public static Monster lookupByKey(Monster[] tables, String key) {
int span = tables.length, start = 0;
public static Monster lookupByKey(int vectorOffset, String key, ByteBuffer bb) {
int vectorLocation = bb.array().length - vectorOffset.Value;
int span = bb.getInt(vectorLocation), middle, start = 0, comp, tableOffset;
vectorLocation += 4;
while (span != 0) {
int middle = span / 2;
Monster table = tables[start + middle];
int comp = table.name().compareTo(key);
tableOffset = __indirect(vectorLocation + 4 * (start + middle), bb);
comp = compareStrings(__offset(10, bb.array().length - tableOffset, bb), key, bb);
if (comp > 0) span = middle;
else if (comp < 0) {
middle++;
start += middle;
span -= middle;
}
else return table;
else return new Monster().__init(tableOffset, bb);
}
return null;
}