@SuppressWarnings("unchecked") @Override public void translateToColumn(InfoForIndex<OWNER> info) { OWNER entity = info.getEntity(); Object cursor = ReflectionUtil.fetchFieldValue(entity, field); if (cursor == null) return; // just ignore it then since user is not modifying what is in the cursor if (!(cursor instanceof CursorToMany)) throw new IllegalArgumentException("cursor must be of type CursorToMany"); // NOTE: IF instance of proxy, we can just add AND remove modified items only!!! if (cursor instanceof CursorProxy) { addRemoveItems(info, (CursorProxy<PROXY>) cursor); return; } // If it is not our proxy and is brand new cursor, we need to add all of them to the index... CursorToMany<PROXY> c = (CursorToMany<PROXY>) cursor; c.beforeFirst(); while (c.next()) { PROXY current = c.getCurrent(); translateToColumn(info, current); } ((CursorToManyImpl<PROXY>) c).getElementsToAdd().clear(); }
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; }
private void addRemoveItems(InfoForIndex<OWNER> info, CursorProxy<PROXY> cursor) { List<PROXY> elementsToAdd = cursor.getElementsToAdd(); List<PROXY> elementsToRemove = cursor.getElementsToRemove(); for (PROXY p : elementsToAdd) { translateToColumn(info, p); } elementsToAdd.clear(); for (PROXY p : elementsToRemove) { RowToPersist row = info.getRow(); IndexData data = fetchIndexData(info, p); row.addIndexToRemove(data); } elementsToRemove.clear(); }
private void translateToColumn(InfoForIndex<OWNER> info, PROXY value) { RowToPersist row = info.getRow(); IndexData data = fetchIndexData(info, value); row.addIndexToPersist(data); }