Skip to content

name clashes between files and record types can lead to strange behavior on retrieve operations

You can use the following code to reproduce the bug:

import linkahead as db

rt = db.RecordType(name="TestUniquenessRecordType").insert()

# of course "test.file" must exist
f = db.File(file="test.file", path="/testfiles/test.file")
f.insert()
f.name = "TestUniquenessRecordType"
f.update(unique=False)

Now try the following:

ff = db.File("TestUniquenessRecordType").retrieve()

I would expect it to return exactly one file, but:

   3232             local_entity.add_message(Message(description=msg, type="Error"))
   3234             if raise_exception_on_error:
-> 3235                 raise MismatchingEntitiesError(msg)
   3237 # add remaining entities to this remote_container
   3238 sync_remote_entities = []

MismatchingEntitiesError: Request was not unique. Name TestUniquenessRecordType was found 2 times.

Furthermore:

In [44]: ff = db.File("TestUniquenessRecordType").retrieve(unique=False)

In [45]: ff
Out[45]: 
<Entities>
  <noscript>
    </noscript>
  <File id="48845" name="TestUniquenessRecordType" path="/testfiles/test.file" checksum="0E3E75234ABC68F4378A86B3F4B32A198BA301845B0CD6E50106E874345700CC6663A86C1EA125DC5E92BE17C98F9A0F85CA9D5F595DB2012F7CC3571945C123" size="5">
    <Version id="7325c3e495b945e27c85f7fb894085f07d3328aa" head="true">
      <Predecessor id="fac992b90bd6b66395d6065a936cb1734557ee1a"/>
    </Version>
  </File>
  <RecordType id="48841" name="TestUniquenessRecordType">
    <Version id="09d272bb755f3ce069fbf96ba52a02346e8c8d20" head="true"/>
  </RecordType>
</Entities>

Shouldn't this return a File only?

Same for RecordTypes:

rt = db.RecordType(name="TestUniquenessRecordType").retrieve()

MismatchingEntitiesError: Request was not unique. Name TestUniquenessRecordType was found 2 times.

However, CQL does it correctly:

In [48]: db.execute_query("FIND RecordType TestUniquenessRecordType")
Out[48]: 
<Entities>
  <noscript>
    </noscript>
  <RecordType id="48841" name="TestUniquenessRecordType">
    <Version id="09d272bb755f3ce069fbf96ba52a02346e8c8d20" head="true"/>
  </RecordType>
</Entities>

In [49]: db.execute_query("FIND File TestUniquenessRecordType")
Out[49]: 
<Entities>
  <noscript>
    </noscript>
  <File id="48845" name="TestUniquenessRecordType" path="/testfiles/test.file" checksum="0E3E75234ABC68F4378A86B3F4B32A198BA301845B0CD6E50106E874345700CC6663A86C1EA125DC5E92BE17C98F9A0F85CA9D5F595DB2012F7CC3571945C123" size="5">
    <Version id="7325c3e495b945e27c85f7fb894085f07d3328aa" head="true">
      <Predecessor id="fac992b90bd6b66395d6065a936cb1734557ee1a"/>
    </Version>
  </File>
</Entities>


In [50]: db.execute_query("FIND Entity TestUniquenessRecordType")
Out[50]: 
<Entities>
  <noscript>
    </noscript>
  <RecordType id="48841" name="TestUniquenessRecordType">
    <Version id="09d272bb755f3ce069fbf96ba52a02346e8c8d20" head="true"/>
  </RecordType>
  <Record id="48843" description="just for testing">
    <Version id="16935068e22147025e9ba65baec32dd44700d346" head="true"/>
    <Parent id="48841" name="TestUniquenessRecordType"/>
  </Record>
  <File id="48845" name="TestUniquenessRecordType" path="/testfiles/test.file" checksum="0E3E75234ABC68F4378A86B3F4B32A198BA301845B0CD6E50106E874345700CC6663A86C1EA125DC5E92BE17C98F9A0F85CA9D5F595DB2012F7CC3571945C123" size="5">
    <Version id="7325c3e495b945e27c85f7fb894085f07d3328aa" head="true">
      <Predecessor id="fac992b90bd6b66395d6065a936cb1734557ee1a"/>
    </Version>
  </File>
</Entities>
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information