private void validate(MetaField rootField) { CheckConditions.checkNotNull(rootField, "group field can not be null!"); CheckConditions.checkArgument(rootField.getDataType() != DataTypeEnum.RELATIONSHIP, "Invalid group on referece type!"); CheckConditions.checkArgument(rootField.getDataType() != DataTypeEnum.JSON, "Invalid group on json type!"); }
public SelectionField(MetaField metaField, String innerField, ISearchStrategy strategy) { super(metaField, innerField, strategy); if (innerField == null && metaField.getDataType() == DataTypeEnum.RELATIONSHIP) { setInnerField(InternalFieldEnum.ID.getDbName()); } }
public AbstractSearchField(MetaField rootField, String innerField, ISearchStrategy strategy) { this.rootField = rootField; this.innerField = innerField; this.fieldProperty = FieldProperty.fromQueryName(innerField); this.strategy = strategy; if (!InternalFieldEnum.ID.getDbName().equals(innerField) && innerField != null && rootField.getDataType() != DataTypeEnum.JSON) { CheckConditions.checkArgument(fieldProperty != null, MessageFormat.format("field property {0} invalid!", innerField)); } initFullDbName(); }
static boolean isRelationshipField(ISearchField field) { if (AbstractSearchField.class.isInstance(field)) { AbstractSearchField selection = (AbstractSearchField) field; return selection.getRootField().getDataType().equals(DataTypeEnum.RELATIONSHIP) && (selection.getInnerField() == null || selection.getInnerField().equals( InternalFieldEnum.ID.getDbName())); } return false; }
@Override public Collection<String> getVisitFields(IEntity currentEntity) { List<String> fieldNames = null; MetaClass metaClass = currentEntity.getMetaClass(); for(MetaField metaField : metaClass.getFields()){ String fieldName = metaField.getName(); if(metaField.getDataType() == DataTypeEnum.RELATIONSHIP){ MetaRelationship metaRelationship = (MetaRelationship)metaField; if(metaRelationship.getRelationType() == RelationTypeEnum.Embedded){ if (fieldNames == null) { fieldNames = new LinkedList<String>(); } fieldNames.add(fieldName); } } } if (fieldNames != null) { fieldNames.add(InternalFieldEnum.VERSION.getName()); } return fieldNames; }
private void initialize(QueryContext context) { Collection<MetaField> fields = getFields(); this.fieldNameIndex.clear(); this.dbNameIndex.clear(); this.flattenValueDbNameIndex.clear(); // only copy relationship fields: ADD ALL into current meta classes for (MetaField field : fields) { if (field.getDataType() != DataTypeEnum.RELATIONSHIP) { addField(field); } else { // copy and init QueryMetaRelationship queryRelationship = new QueryMetaRelationship((MetaRelationship) field, context); queryRelationship.setMetadataService(getMetadataService()); addField(queryRelationship); } } }
private DBObject buildModifyBody() { MetaField field = getField(); DBObject modifyBody = new BasicDBObject(); // system modify body including entity version, entity time stamp buildInternalUpdate(modifyBody); if (field.getCardinality() == CardinalityEnum.Many) { // appending to list, $addToSet buildArrayBody(modifyBody); } else if (field.getDataType().equals(DataTypeEnum.JSON)) { // incremental $set buildJsonBody(modifyBody); } else { buildSetFieldBody(modifyBody); } return modifyBody; }
@Override public boolean isIndexUsable(ISearchField field, MetaClass metaClass) { Collection<IndexInfo> indexes = metaClass.getIndexesOnField(field .getFieldName()); for (IndexInfo index : indexes) { String firstKey = index.getKeyList().get(0); MetaField metaField = metaClass.getFieldByName(firstKey); String physicalKeyName = getFieldValueName(metaField); if (metaField.getDataType().equals(DataTypeEnum.RELATIONSHIP)) { physicalKeyName = metaField.getFlattenValueDbName() + AbstractEntityIDHelper.DOT + InternalFieldEnum.ID.getDbName(); } if (physicalKeyName.equals(field.getFullDbName())) { return true; } } return false; }
@Override public boolean isIndexUsable(ISearchField field, MetaClass metaClass) { Collection<IndexInfo> indexes = metaClass.getIndexesOnField(field.getFieldName()); for (IndexInfo index : indexes) { String firstKey = index.getKeyList().get(0); MetaField metaField = metaClass.getFieldByName(firstKey); String physicalKeyName = getFieldValueName(metaField); if (metaField.getDataType().equals(DataTypeEnum.RELATIONSHIP)) { physicalKeyName = metaField.getValueDbName() + AbstractEntityIDHelper.DOT + InternalFieldEnum.ID.getDbName(); } if (physicalKeyName.equals(field.getFullDbName())) { return true; } } return false; }
private DBObject buildModifyBody() { MetaField field = getField(); DBObject modifyBody = new BasicDBObject(); // system modify body including entity version, entity time stamp buildInternalUpdate(modifyBody); if (field.getCardinality() == CardinalityEnum.Many) { // appending to list, $addToSet buildArrayBody(modifyBody); } else if (field.getDataType().equals(DataTypeEnum.JSON)) { // incremental $set buildJsonBody(modifyBody); } else { buildSetFieldBody(modifyBody); } return modifyBody; }
@Override protected Object getInternalFieldValue(InternalFieldEnum fieldEnum){ String fieldName = fieldEnum.getName(); MetaField metaField = getMetaClass().getFieldByName(fieldName); DataTypeEnum dataType = metaField.getDataType(); IDataTypeHandler handler = JsonDataTypeHandlerFactory.getHandler(dataType); JsonNode jsonValue = jsonObject.get(fieldName); if (jsonValue == null) { return null; } return handler.read(this, jsonValue, metaField); }
public void addReferenceIndexes() { Collection<MetaField> fields = getClassFields(); for (MetaField field : fields) { if (field.getDataType() == DataTypeEnum.RELATIONSHIP && ((MetaRelationship) field).getRelationType() != RelationTypeEnum.Embedded) { String indexName = IndexInfo.INDEX_PREFIX + field.getName() + IndexInfo.INDEX_POSTFIX; IndexInfo relationshipIndex = new IndexInfo(indexName, true); relationshipIndex.addKeyField(field.getName()); options.addIndex(relationshipIndex); } } }
@Override protected Object getInternalFieldValue(InternalFieldEnum fieldEnum){ MetaField metaField = getMetaClass().getFieldByName(fieldEnum.getName()); String dbValName = metaField.getDbName(); Object bsonValue = bsonObject.get(dbValName); if (bsonValue == null) return null; DataTypeEnum dataType = metaField.getDataType(); IDataTypeHandler handler = BsonDataTypeHandlerFactory.getHandler(dataType); return handler.read(this, bsonValue, metaField); }
@Override protected Object getInternalFieldValue(InternalFieldEnum fieldEnum){ MetaField metaField = getMetaClass().getFieldByName(fieldEnum.getName()); String dbValName = metaField.getDbName(); Object bsonValue = bsonObject.get(dbValName); if (bsonValue == null) return null; DataTypeEnum dataType = metaField.getDataType(); IDataTypeHandler handler = BsonDataTypeHandlerFactory.getHandler(dataType); return handler.read(this, bsonValue, metaField); }
private static void validateSortField(MetaField sortMetaField, String sortFieldName, String[] fields, MetaClass metaClass) { if (sortMetaField == null) { throw new QueryExecuteException( QueryErrCodeEnum.METAFIELD_NOT_FOUND, "Can't find sort field " + sortFieldName + " on " + metaClass.getName()); } // array sort not supported if (sortMetaField.getCardinality() == CardinalityEnum.Many && fields.length == 1) { throw new QueryExecuteException( QueryErrCodeEnum.ARRAY_SORT_NOT_SUPPORT, "Can't sort on array field " + sortFieldName + " on " + metaClass.getName()); } if (sortMetaField.getDataType() == DataTypeEnum.JSON) { throw new QueryExecuteException( QueryErrCodeEnum.JSON_SORT_NOT_SUPPORT,"Can't sort on json field " + sortFieldName + " on " + metaClass.getName()); } }
private DBObject buildModifyBody() { MetaField field = getField(); DBObject modifyBody = new BasicDBObject(); // system modify body including entity version, entity time stamp buildInternalUpdate(modifyBody); if (field.getCardinality() == CardinalityEnum.Many) { // appending to list, $addToSet buildArrayBody(modifyBody); } else if (field.getDataType().equals(DataTypeEnum.JSON)) { // incremental $set buildJsonBody(modifyBody); } else { buildSetFieldBody(modifyBody); } return modifyBody; }
@Override public boolean isIndexUsable(ISearchField field, MetaClass metaClass) { Collection<IndexInfo> indexes = metaClass.getIndexesOnField(field.getFieldName()); for (IndexInfo index : indexes) { String firstKey = index.getKeyList().get(0); MetaField metaField = metaClass.getFieldByName(firstKey); String physicalKeyName = getFieldValueName(metaField); if (metaField.getDataType().equals(DataTypeEnum.RELATIONSHIP)) { physicalKeyName = metaField.getValueDbName() + AbstractEntityIDHelper.DOT + InternalFieldEnum.ID.getDbName(); } if (physicalKeyName.equals(field.getFullDbName())) { return true; } } return false; }
@Override protected Object getInternalFieldValue(InternalFieldEnum fieldEnum){ MetaField metaField = getMetaClass().getFieldByName(fieldEnum.getName()); String dbValName = metaField.getDbName(); Object bsonValue = bsonObject.get(dbValName); if (bsonValue == null) return null; DataTypeEnum dataType = metaField.getDataType(); IDataTypeHandler handler = BsonDataTypeHandlerFactory.getHandler(dataType); return handler.read(this, bsonValue, metaField); }
@Override protected DBObject buildModifyBody(BitSet arrayBits, DBObject rootObject, MetaClass rootMetaClass) { BasicDBObject embedObject = (BasicDBObject) EmbedDBObjectFilter.filter(entity.getId(), rootObject, rootMetaClass, null, helper); MetaField field = getField(); if (field.getCardinality() == CardinalityEnum.Many) { buildArrayBody(embedObject, field); } else if (field.getDataType().equals(DataTypeEnum.JSON)) { buildJsonBody(embedObject, field); } else { // non-array & non-json : replace the whole field buildRepalceBody(embedObject, field); } embedObject.put(InternalFieldEnum.MODIFIER.getDbName(), entity.getModifier()); embedObject.put(InternalFieldEnum.LASTMODIFIED.getDbName(), entity.getLastModified()); return buildSetBody(rootObject); }
@Test public void test01AddCrossReference() { MetaRelationship relation = new MetaRelationship(); String fieldName = "crossRepoRef"; relation.setName(fieldName); relation.setRelationType(RelationTypeEnum.CrossRepository); relation.setRefDataType("Manifest"); relation.setRefRepository("software-deployment"); MetaClass metadata = new MetaClass(); metadata.setRepository(RAPTOR_PAAS); metadata.setName("NewReference"); metadata.addField(relation); MetaClass createdMeta = raptorMetaService.createMetaClass(metadata, new MetadataContext()); Assert.assertNotNull(createdMeta.getFieldByName(fieldName)); Assert.assertTrue(createdMeta.getFieldByName(fieldName).getDataType() == DataTypeEnum.RELATIONSHIP); }