クエリー統計クエリーAuditing historyおよび適用説明

6245 ワード

本文の中で、私达は主に调査の统计の内容を分析して、自己感覚は良い提案があってみんなと分かち合います
FileNet Auditingの簡略配置と明説』ではAuditingの役割とその統計的相関内容を解析した.文書類製品の利用状況を評価するのに代価があると言えるが、FileNet製品を以前に購入した会社(zhyなど)はXT上で直接作成し、文書報告書統計機能を備えている.
すべてのレポート統計パスは、auditing historyに対するクエリーパスであり、event logに対するクエリーをマッピングします.Documentタイプ(またはカスタムDocumentタイプ)をクエリーするように、適用する式は同相です.Queryの文法をよく知った上で、簡単に関系を歩いて操作することができます.コードの例を以下に示します.
public long getAuditingInfos(ObjectStore os,
												Date startDate,
												Date endDate,
												Id auditingType,
												Boolean 				needParentClassType,
												String topParentClass,
												
) throws Exception{
		
		
		long total = 0;
		
		AuditingInfoBean bean = null;
		RepositoryRowSet rrs = null;
		RepositoryRow rr = null;
		
		if(startDate != null && endDate != null && 
				(rrs = buildData(os,startDate,endDate,auditingType)) != null){
			
			PageIterator iter = rrs.pageIterator();
			while (iter.nextPage())
			{
			    Object[] currentPage = iter.getCurrentPage();
			    if(currentPage != null){
			    	for(int i=0;i<currentPage.length;i++){
			    		rr = (RepositoryRow)currentPage[i];
			    		
			    		if(null != rr && rr.getProperties().getInteger32Value(PropertyNames.EVENT_STATUS) == 0){
			    			
					    	try{
					    		rr.getProperties().getIdValue(PropertyNames.ID).toString();
					    		rr.getProperties().getObjectValue(PropertyNames.CREATOR);
					    		rr.getProperties().getIdValue(PropertyNames.SOURCE_OBJECT_ID);
					    		Id classId = rr.getProperties().getIdValue(PropertyNames.SOURCE_CLASS_ID);
					    		PropertyFilter filter = new PropertyFilter();
								FilterElement ele0 = new FilterElement(null, null, null, PropertyNames.SYMBOLIC_NAME, null);
								FilterElement ele1 = new FilterElement(null, null, null, PropertyNames.SUPERCLASS_DESCRIPTION, null);
								filter.addIncludeProperty(ele0);
								filter.addIncludeProperty(ele1);
								ClassDescription classDescription = Factory.ClassDescription.fetchInstance(os, classId, filter);
								String selfSymbolicName = classDescription.get_SymbolicName();
					    		
					    	}catch(Exception e){
					    		logger.error(e.toString());
					    		continue;
					    	}
			    		}
			    	}
			    }
			}
		}
		
		return total;
	}
	
	private RepositoryRowSet buildData(ObjectStore os,Date startDate,Date endDate,Id auditingType){

		RepositoryRowSet rrs  = null;
		
		if(AuditingUtil.CREATIONEVENT == auditingType 
				|| AuditingUtil.GETCONTENTEVENT == auditingType){
			
			String sqlString = "SELECT "  + PropertyNames.CREATOR + "," + 
											PropertyNames.ID + "," + 
											PropertyNames.DATE_CREATED + "," + 
											PropertyNames.EVENT_STATUS + "," + 
											PropertyNames.SOURCE_CLASS_ID + "," + 
											PropertyNames.SOURCE_OBJECT_ID;

			SearchSQL searchSql = new SearchSQL(sqlString + 
									" FROM " + auditingType + 
							        " WHERE " + 
							        	PropertyNames.DATE_CREATED + " >= " + dateFormat(startDate) + 
							        	" AND " + 
							        	PropertyNames.DATE_CREATED  + " < " + dateFormat(endDate) +
							        " ORDER BY " + PropertyNames.DATE_CREATED);
			
			SearchScope ss = new SearchScope(os);
			
			PropertyFilter filter = new PropertyFilter();
			FilterElement ele1 = new FilterElement(null, null, null, PropertyNames.EVENT_STATUS, null);
			FilterElement ele2 = new FilterElement(null, null, null, PropertyNames.CREATOR, null);
			FilterElement ele3 = new FilterElement(null, null, null, PropertyNames.DATE_CREATED, null);
			FilterElement ele4 = new FilterElement(null, null, null, PropertyNames.SOURCE_CLASS_ID, null);
			FilterElement ele5 = new FilterElement(null, null, null, PropertyNames.SOURCE_OBJECT_ID, null);
			filter.addIncludeProperty(ele1);
			filter.addIncludeProperty(ele2);
			filter.addIncludeProperty(ele3);
			filter.addIncludeProperty(ele4);
			filter.addIncludeProperty(ele5);
			
			rrs = ss.fetchRows(searchSql, 1000, filter, true);
		}

		return rrs;
	}
	
	private String dateFormat(Date date){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String dateStr = sdf.format(date);
		sdf = new SimpleDateFormat("HHmmss");
		dateStr = dateStr + "T" + sdf.format(date) + "Z";
		return dateStr;
	}

毎日同じ理屈
風は、だんだん吹いて、私の髪の毛を乱して、私の長いスカートを少し揺らしました.緑の葉は風の中で踊るようで、木を離れて、大地に投げて、このように枯れてしまうことを知らないで、私は腰を曲げて、そっと1枚の木の葉を拾って、あのとても秩序のある茎の脈、1種の美しい飾りです.私は少し嘆いています:緑の葉、緑の葉、あなたはこのように美しく木の上からそっと漂って、風に従って踊って、すでに落ち葉と呼ばれていることを知りません!
FileNetはプロセスのレポート分析ツール(process Analyzer)を供給しているが、Auditingと組み合わせた製品は供給されていない.このような直接的な制定的な開拓の任務は機能的に実現できるが、効率の問題はXT上で制定された機能がzhyのある支社の数十万の添付ファイルの量に伴ってこの機能を虚構にしていることだ.その原因はFileNetストレージが十分に最適化されていないのではなく、auditingが格納しているのは、操作イベントのフェーズに応答する内容であり、操作のドキュメントインスタンスも格納されているが、これによってドキュメントのフェーズ情報(例えば、名前、さらには作業者が部門にいる)を取得するのに非常に時間がかかるからである.
このような問題に対して、FileNetデータベースを直接整理し、データベースを直接操作することを考慮することができますが、このような危険性が高く、製品のアップグレードも便利ではない可能性があります.また、定時タスク転送中にサービス関連データをアプリケーションのサービスライブラリに移動することも考えられ、このような短期間のauditingクエリは、空きスペースを適用する際に進行し、受け入れやすくなります.このような式は必ず遅延しますが、統計自体の時間量が大きく、このような1日以上の遅延は受け入れられます.もちろん、auditingを完全に適用せずに、直接事務業で統計するデータを記録することもできますが、このようにするには、より多くの開拓任務を行うだけでなく、成形された製品(または応用)の修正が大きく、このような開拓よりも大きな任務量(試測など)をもたらす可能性があります.したがって、対象フェーズに応じて後の2つの中から選択することができ、FileNet内部の人なら1つ目が好きかもしれませんが、アップグレードの危険性を考慮する必要があります.
開発時間プロジェクトマネージャ:もし私があなたにもう一人あげたら、いつ完成できますか.プログラマー:3ヶ月でしょう.プロジェクトマネージャ:では、二つあげましょうか.プログラマー:1ヶ月でしょう.プロジェクトマネージャ:100は?プログラマー:1年でしょう.プロジェクトマネージャ:10000は?プログラマー:では、私は永遠に任務を完成できません.