-
Notifications
You must be signed in to change notification settings - Fork 0
Conditions_ar
عند استخدام الأوامر لتنفيذ العمليات على كائناتك ستحتاج إلى وضع بعض الشّروط حتى لا تتم العمليات على كائنات التي لا تريدها, فمثلًا قد تحتاج للاستعلام عن المستخدمين الذين يسكنون في حماة, أو مثلًا قد تحتاج لتحديث معلومات الأشخاص الذين يملكون مبالغ تزيد عن مئة ألف ليرة, أو حتى تحديد خمسةٍ من المتسابقين الذين فازوا في إحدى المسابقات, ولفعل ذلك يجب أن نستخدم الشروط الموجودة في الحزمة org.sofof.command.condition, والتي تستخدم جميعها النافذة Condition, وتحوي تلك الحزمة العديد من الشروط الجاهزة للاستخدام.
هذا الشّرط من أبسط أنواع الشروط, ويعتمد على قيمة منطقية تحدد ما إذا كان الشرط ينطبق على جميع الكائنات أم لا, ولهذا الشرط بانيٌ واحدٌ يستقبل القيمة المنطقية تلك, فإذا كانت صحيح صحّ الشرط على جميع الكائنات, أما إن كانت خاطئ فالشرط لن ينطبق على أيٍّ من الكائنات, فمثلًا لو أردنا استخدام الشرط على الأمر Select من خلال تمرير الشرط عبر الدّالة where, فإذا كان الشرط يحمل القيمة خاطئ على سبيل المثال فلن يعيد الاستعلام أي كائن, والعكس بالعكس, وينطبق الأمر نفسه على الأمرين Update و Unbind, فإذا مررنا الشرط بالقيمة خاطئ إلى الأمر Update فلن يتمّ تحديث أيّ كائنٍ, وإذا مررنا نفس الشرط إلى الأمر Unbind فلن يتم إلغاء ربط أي كائنٍ, والعكس بالعكس أيضًا, وهذا مثالٌ يوضح ذلك:
import org.sofof.command.Update;
import org.sofof.command.condition.BooleanCondition;
import org.sofof.permission.User;
import java.io.File;
public class BooleanConditionTesting {
public static void main(String[] args) throws SofofException {
Database.createDatabase(new File("sofof"));
Server s = new Server(new File("sofof"), 6969, false);
s.getUsers().add(new User("rami", "secret"));
s.startUp();
Session sess = new Database("localhost", 6969).startSession(new User("rami", "secret"), false);
int affected = sess.execute(new Update(String.class).from("comments").set("unavilabel").where(new BooleanCondition(false)));
System.out.println(affected);
}
}
//result
0مهمّة هذا الشرط تحديد عدد الكائنات الّتي ستتأثّر, فباستخدام الأمر Unbind مثلًا بعد تمرير هذا الشرط إليه وتحديد العدد المطلوب من الكائنات -خمسة على سبيل المثال- سيتمّ إلغاء ربط خمسة كائنات, أما إذا كان عدد الكائنات أقل من العدد الممرّر فسيتمّ إلغاء ربط تلك الكائنات فقط, وهذا مثالٌ باستخدام الأمر Select:
import org.sofof.command.Select;
import org.sofof.command.condition.LimitCondition;
import org.sofof.permission.User;
import java.io.File;
public class LimitedProjects {
public static void main(String[] args) throws SofofException {
Database.createDatabase(new File("sofof"));
Server s = new Server(new File("sofof"), 6969, false);
s.getUsers().add(new User("rami", "secret"));
s.startUp();
Session sess = new Database("localhost", 6969).startSession(new User("rami", "secret"));
sess.query(new Select(Project.class).from("website").where(new LimitCondition(5)));
}
}يعد هذا الشرط من أهم الشروط المستخدمة في قاعدة البيانات, إذ أنه يعتمد على النصوص التنفيذية لكتابة الشروط, مما يسمح بتنفيذ الدّوالّ أو استدعاء الحقول للتحقق من الشروط, ويمتلك هذا الشرط بانيًا واحدًا يستقبل ثلاث معاملاتٍ, الأوّل والثّالث هما Object, ويسمح لهذين المعاملين أن يكونا نصّا تنفيذيًا في حالة كانوا يبدأون بالرمز # أو أي كائن آخر(إن كنت تريد تمرير نص String يبدأ بالرمز # لكنك لا تريد أن يعومل على أنه نص تنفيذي فيمكنك تهريبه عن طريق كتابة الرمز # مرتين في البداية وسيتم حذف أحدهما ولن يتم تفسير النص على أنه نص تنفيذي), أما الثّاني فهو العملية Operation الّتي سيتمّ إجراؤها على هذين الكائنين, والعملية هي تعداد Enum يحوي على التعدادات الآتية:
- Equal: وتستخدم للتأكد من تساوي قيمتين عبر الدّالّة equals أو عبر مساواة عددين.
- NotEqual: عكس تنفيذ Equal.
- Greater: تستخدم للتأكد من أنّ عددًا أكبر من عدد, وهي مخصّصةٌ للأعداد فقط.
- GreaterOrEqual: تستخدم للتأكد من أنّ عددًا أكبر أو يساوي عددًا آخر, وهي مخصّصةٌ للأعداد فقط.
- Less: : تستخدم للتأكد من أنّ عددًا أقل من عدد, وهي مخصّصةٌ للأعداد فقط.
- LessOrEqual: تستخدم للتأكد من أنّ عددًا أقلّ أو يساوي عددًا آخر, وهي مخصّصةٌ للأعداد فقط.
ولتوضيح ذلك يمكننا تخيّل أننا نقوم ببناء موقعٍ ونحتاج لاختيار المقالات الّتي تمّت قراءتها أكثر من مئة مرّةٍ, وبغضّ النظر عن طريقة عمل الصّفّ Essay الّذي سيمثّل المقالة في حالتنا هذه فإنّ الكود سيكون كالتّاليّ:
List<Essay> essays = session.query(new Select(Essay.class).from("essays").where(new ObjectCondition("#getViews()", Operation.Greater, 100)));للنافذة Condition عدة دوالٍّ تسمح بربط الشروط ببعضها بعلاقات معينة, وهذه العلاقات لا تؤثر على الشرط نفسه إنّما تنتج شرطًا جديدًا يمثّل تلك العلاقة, وتلك العلاقات تتمثل بالعلاقات المنطقيّة المعروفة, وهي (and, or, xor, not), ويتمّ استخدامها في بعض الحالات المعقّدة, فمثلًا إذا أردنا اختيار اللاعبين الذين تجاوزوا المرحلة الخامسة ويمتلكون أقلّ من عشرة آلاف قطعةٍ نقديّةٍ لتضاعف نقودهم كهديّة فسيكون كود الاستعلام عنهم هكذا:
List<Player> players = session.query(new Select(Player.class).from("players").where(new ObjectCondition("#getLevel()", Operation.Greater, 5).and(new ObjectCondition("#getResources().getGold()", Operation.Less, 10000))));