private String formRowKey(byte[] byteKey) { Converter converter = ownerMeta.getIdField().getConverter(); Object objKey = converter.convertFromNoSql(byteKey); String keyAsStr = converter.convertTypeToString(objKey); // We ALWAYS ignore partition in this case since this index row is ALWAYS tied to this row // period...moving it all // would be a pain and be useless... String rowKey = getMetaDbo().getIndexRowKey(null, null) + "/" + keyAsStr; return rowKey; }
public void setup( DboTableMeta tableMeta, Field field, String colName, MetaAbstractClass<OWNER> ownerMeta, MetaAbstractClass<PROXY> classMeta) { DboTableMeta fkToTable = classMeta.getMetaDbo(); metaDbo.setup(tableMeta, colName, fkToTable, true); super.setup(field, colName); this.classMeta = classMeta; this.ownerMeta = ownerMeta; }
@Override public void translateFromColumn(Row row, OWNER entity, NoSqlSession session) { String indexColFamily = getMetaDbo().getIndexTableName(); String rowKey = formRowKey(row.getKey()); byte[] key = StandardConverters.convertToBytes(rowKey); ScanInfo info = new ScanInfo(ownerMeta.getMetaDbo(), getMetaDbo(), indexColFamily, key); int batchSize = 200; AbstractCursor<IndexColumn> indexCursor = session.scanIndex(info, null, null, batchSize); CursorProxy<PROXY> cursor = new CursorProxy<PROXY>(entity, session, indexCursor, classMeta, batchSize); ReflectionUtil.putFieldValue(entity, field, cursor); }
@Override public String toString() { return "MetaCursorField [field='" + field.getDeclaringClass().getName() + "." + field.getName() + "(field type=" + field.getType().getName() + "<" + classMeta.getMetaClass().getName() + ">), columnName=" + columnName + "]"; }
private IndexData fetchIndexData(InfoForIndex<OWNER> info, PROXY value) { RowToPersist row = info.getRow(); // Value is the Account.java or a Proxy of Account.java field and what we need to save in // the database is the ID inside this Account.java object!!!! byte[] byteVal = classMeta.convertEntityToId(value); if (byteVal == null && value != null) { // if value is not null but we get back a byteVal of null, it means the entity has not been // initialized with a key yet, BUT this is required to be able to save this object String owner = "'" + field.getDeclaringClass().getSimpleName() + "'"; String child = "'" + field.getType().getSimpleName() + "'"; String fieldName = "'" + field.getType().getSimpleName() + " " + field.getName() + "'"; throw new ChildWithNoPkException( "The entity you are saving of type=" + owner + " has a field=" + fieldName + " that does not yet have a primary key so you cannot save it. To correct this\n" + "problem, you can either\n" + "1. SAVE the " + child + " BEFORE you save the " + owner + " OR\n" + "2. Call entityManager.fillInWithKey(Object entity), then SAVE your " + owner + "', then save your " + child + " NOTE that this" + "\nmethod #2 is used for when you have a bi-directional relationship where each is a child of the other"); } byte[] key = info.getRow().getKey(); IndexData data = new IndexData(); String colFamily = getMetaDbo().getIndexTableName(); String rowKey = formRowKey(row.getKey()); data.setColumnFamilyName(colFamily); data.setRowKey(rowKey); IndexColumn indCol = data.getIndexColumn(); indCol.setIndexedValue(byteVal); indCol.setPrimaryKey(key); return data; }